Spring中的bean的配置、作用范围、生命周期详细描述及使用(XML版上篇)

2年前 (2022) 程序员胖胖胖虎阿
253 0 0

文章目录

  • 💨更多相关知识👇
  • 前言
    • 一、为什么要学Spring?
    • 二、IoC 和 DI 介绍
      • 🍂Ioc的入门案例
        • ⭐代码演示
      • 🍂DI的入门案例
        • ⭐代码演示
    • 三、bean的配置(bean其实就是用来创建对象的)
      • 🌿bean基础配置
        • ⭐代码演示
      • 🌿bean别名配置
        • ⭐代码演示
    • 四、bean的作用范围
        • ⭐singleton单例范围代码演示
        • ⭐prototype多例范围代码演示
    • 五、bean的生命周期
      • 🍁bean生命周期的使用步骤
        • ⭐代码演示
        • ⚡注意事项⚡
      • 🍁bean的销毁时机
        • ⭐代码演示
  • 作者:KJ.JK

💨更多相关知识👇

💖异常处理与解决方案详解上篇

💖异常处理与解决方案详解下篇

💖Math类与System类的常用方法使用

💖JavaEE中的静态方法定义、方法重载要求、return作用详解

💖List接口的常用方法,精华总结

💖JavaEE里面的所有内部类详细介绍与使用

💖ArrayList集合中的常用成员方法

💖JavaEE中的Stream流的常用方法

💖JavaEE中的Stream流知识点使用,精华总结,一文直接上手


🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈
 
🍂个人博客首页: KJ.JK
 
欢迎大家点赞👍收藏💖评论💬关注🔒
 
💖源码获取 | 💻学习交流 | 🤝商务合作 | 💨私信作者


前言

          本文将带大家使用并了解Spring的xml版上篇,后续会更新Spring的注解版以及Spring的全家桶,喜欢的可以点个订阅不迷路

一、为什么要学Spring?


                        * 简化开发,降低企业级开发的复杂性
                        
                        * 框架整合,高效整合其他技术,提高企业级应用开发与运行效率
                            
                        * 官网:spring.io


Spring中的bean的配置、作用范围、生命周期详细描述及使用(XML版上篇)


二、IoC 和 DI 介绍


              
 "IoC(Inversion of Control)控制反转"

            * IoC: 使用对象时,由主动new产生对象转换为由"外部提供对象",
                     此过程中对象创建控制权由程序转移到外部,此思想称为控制反转  "(把创建对象的能力交给Spring中的IOC容器)"
                         
------------------------------------------------------------------------------------------------------------
  
 "Spring技术对IoC思想进行了实现"
                                       
                       * Spring提供了一个容器,称为"IoC容器",用来充当IoC思想中的"外部"
                         
                       * IoC容器"负责对象的创建、初始化等一系列工作""被创建或被管理的对象在IoC容器中统称为Bean"

------------------------------------------------------------------------------------------------------------
                         
"DI(Dependency Injection)依赖注入"
                         
                       * 在容器中建立bean与bean之间的依赖关系的整个过程,称为"依赖注入"     "(给成员变量赋值)"

                         
                       * 作用: 充分解耦

🍂Ioc的入门案例


         "步骤:"
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

                         1.导入Spring坐标
                              <dependency>
                                 <groupId>org.springframework</groupId>
                                 <artifactId>spring-context</artifactId>     
                                 <version>5.2.10.RELEASE</version>
                              </dependency>
                              
                             
                         2.定义Spring管理的类 (接口)

                              public interface BookService {
                                void save();
                              }

                              public class BookServiceImpl implements BookService {
                                  private BookDao bookDao = new BookDaoImpl();
                                  public void save() {
                                      bookDao.save();
                                  }
                               }


                         3.创建Spring配置文件,配置对应类作为Spring管理的bean

/*

注意:

   bean定义id属性在同一个上下文中不能重复

*/

⭐代码演示

// 数据访问层接口
public interface BookDao {
    void save();
}

------------------------------------------------------------------------------------------------------------
// 数据访问层实现类
public class BookDaoImpl implements BookDao {
    private int connectionNumber;
    private String databaseName;

    @Override
    public void save() {

    System.out.println("保存 <<富婆通讯录>>");
    }
}

------------------------------------------------------------------------------------------------------------

//SpringXML文件
    
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">


    <!--    IoC容器可以理解为一个Map集合
        bean标签:配置类的信息,会在IoC容器中创建对象
             class属性:类全名(包名.类名)
             id属性:唯一标识,取个名字,将来通过id的值来获取对象


-->


     <!--   等价于 book =new BookServiceImpl
            bean其实就是用来创建对象的
                                            -->
    <bean class="com.itheima.service.impl.BookServiceImpl" id="bookService"></bean>



</beans>


------------------------------------------------------------------------------------------------------------
//业务层接口类

public interface BookService {
    void save();
}    
------------------------------------------------------------------------------------------------------------        
// 业务层实现类

public class BookServiceImpl implements BookService {
    private BookDao bookDao =new BookDaoImpl();



    @Override
    public void save() {

        bookDao.save();
    }
}
       
------------------------------------------------------------------------------------------------------------          
        
//测试类
    @Test
    public void testGetBeanById() {
    
        //1.创建IoC容器对象,加载Spring核心配置文件                             //这里写的是Springxml文件的名字
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("application.xml");

        //2.从IoC容器中获取Bean对象

        //面向接口编程,把Object改为对应的接口
//        Object bookService = ctx.getBean("bookService");

                                            //这里写的是application.xml里面bean的id
        BookService bookService = (BookService) ctx.getBean("bookService");

        //3.调用Bean对象(BookService对象)的方法
        bookService.save();

        //4.关闭容器
        ctx.close();
        
    }

Spring中的bean的配置、作用范围、生命周期详细描述及使用(XML版上篇)


🍂DI的入门案例


         "步骤:"
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

                           1.删除使用new的形式创建对象的代码

                           2.提供依赖对象对应的setter方法
                               
                           3.配置service与dao之间的关系

⭐代码演示

// 数据访问层接口
public interface BookDao {
    void save();
}

------------------------------------------------------------------------------------------------------------
// 数据访问层实现类
public class BookDaoImpl implements BookDao {
    private int connectionNumber;
    private String databaseName;

    @Override
    public void save() {

    System.out.println("保存 <<富婆通讯录>>");
    }
}

------------------------------------------------------------------------------------------------------------

//SpringXML文件
    
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">


    <!--    IoC容器可以理解为一个Map集合
        bean标签:配置类的信息,会在IoC容器中创建对象
             class属性:类全名(包名.类名)
             id属性:唯一标识,取个名字,将来通过id的值来获取对象


-->


     <!--   等价于 book =new BookServiceImpl
            bean其实就是用来创建对象的
                                            -->
    <bean class="com.itheima.service.impl.BookServiceImpl" id="bookService">



        <!--       给BookServiceImpl的bookDao成员变量赋值  ref:引用IOC容器中对的bookDao
           property标签:依赖注入,通过set方法输入
                  name:类中的成员变量
                  ref:注入的对象-->

        <property name="bookDao" ref="bookDao"></property>


    </bean>




    <!--IOC容器创建BookDaoImpl对象-->

    <!--  bookDao =new BookDaoImpl()  -->
    <bean class="com.itheima.dao.impl.BookDaoImpl" id="bookDao"></bean>


</beans>


------------------------------------------------------------------------------------------------------------

//业务层接口类

public interface BookService {
    void save();
}    

------------------------------------------------------------------------------------------------------------        
// 业务层实现类(发生改变)


public class BookServiceImpl implements BookService {
    private BookDao bookDao;


    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }

    @Override
    public void save() {

        bookDao.save();
    }
}

       
------------------------------------------------------------------------------------------------------------          
        
//测试类
    @Test
    public void testGetBeanById() {
        //1.创建IoC容器对象,加载Spring核心配置文件                             //这里写的是Springxml文件的名字
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("application.xml");

        //2.从IoC容器中获取Bean对象

        //面向接口编程,把Object改为对应的接口
//        Object bookService = ctx.getBean("bookService");

                                            //这里写的是application.xml里面bean的id
        BookService bookService = (BookService) ctx.getBean("bookService");

        //3.调用Bean对象(BookService对象)的方法
        bookService.save();

        //4.关闭容器
        ctx.close();
        
    }

Spring中的bean的配置、作用范围、生命周期详细描述及使用(XML版上篇)


Spring中的bean的配置、作用范围、生命周期详细描述及使用(XML版上篇)


三、bean的配置(bean其实就是用来创建对象的)


🌿bean基础配置

                    类别	                            描述
                    
                    名称	                            bean
                    
                    类型	                            标签
                    
                    所属	                           beans标签
                    
                    功能	                        定义Spring核心容器管理的对象
                    
                    格式	                            <beans>
                                                          <bean/>
                                                          <bean></bean>
                                                      </beans>
                    
                    属性
                    列表	                     " id: 唯一标识,取个名字,将来通过id的值来获取对象
                    
                                             " class: bean的类型,即配置的bean的全路径类名(包名.类名)  
------------------------------------------------------------------------------------------------------------
                        
               * 例子:

                     * <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
                         
                     * <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"></bean>



⭐代码演示

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--    IoC容器可以理解为一个Map集合
        bean标签:配置类的信息,会在IoC容器中创建对象
             class属性:类全名(包名.类名)
             id属性:唯一标识,取个名字,将来通过id的值来获取对象
-->

     <!--   等价于 book =new BookServiceImpl
            bean其实就是用来创建对象的
                                            -->
    <bean class="com.itheima.service.impl.BookServiceImpl" id="bookService">


        <!--    给BookServiceImpl的bookDao成员变量赋值  ref:引用IOC容器中的bookDao
           property标签:依赖注入,通过set方法输入
                  name:类中的成员变量
                  ref:注入的对象-->
        <property name="bookDao" ref="bookDao"></property>

    </bean>

    <!--IOC容器创建BookDaoImpl对象-->

    <!--  bookDao =new BookDaoImpl()  -->
    <bean class="com.itheima.dao.impl.BookDaoImpl" id="bookDao"></bean>
</beans>

Spring中的bean的配置、作用范围、生命周期详细描述及使用(XML版上篇)


🌿bean别名配置

                               类别	  描述         
                                   
                               名称	   name
                               
                               类型	   属性
                               
                               所属	  bean标签
                               
                               功能	 "定义bean的别名,可定义多个,使用逗号(,)分号(;)空格( )分隔"
------------------------------------------------------------------------------------------------------------                                
          * 例子:

               * <bean id="bookDao" name="dao bookDaoImpl" class="com.itheima.dao.impl.BookDaoImpl"/>
                   
               * <bean name="service,bookServiceImpl" class="com.itheima.service.impl.BookServiceImpl"/>


                                   
/*
注意:
  获取bean无论是通过id还是name获取,如果无法获取到,将抛出异常NoSuchBeanDefinitionException
   NoSuchBeanDefinitionException: No bean named 'bookServiceImpl' available

*/

⭐代码演示

//xml类

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--    IoC容器可以理解为一个Map集合
        bean标签:配置类的信息,会在IoC容器中创建对象
             class属性:类全名(包名.类名)
             id属性:唯一标识,取个名字,将来通过id的值来获取对象
-->
     <!--   等价于 book =new BookServiceImpl
            bean其实就是用来创建对象的
                                            -->
    <bean class="com.itheima.service.impl.BookServiceImpl" id="bookService"
                     name="b1,b2 ; b3 b4">


        <!--       给BookServiceImpl的bookDao成员变量赋值  ref:引用IOC容器中对的bookDao
           property标签:依赖注入,通过set方法输入
                  name:类中的成员变量
                  ref:注入的对象-->
        <property name="bookDao" ref="bookDao"></property>

    </bean>

    <!--IOC容器创建BookDaoImpl对象-->

    <!--  bookDao =new BookDaoImpl()  -->
    <bean class="com.itheima.dao.impl.BookDaoImpl" id="bookDao"></bean>
</beans>

Spring中的bean的配置、作用范围、生命周期详细描述及使用(XML版上篇)


🔥系列热门专栏🔥:
 
⚡《JavaEE进阶序列 | 从小白到工程师》系列文章⚡
 
⚡《JavaEE项目实战》系列文章⚡
 
⚡《JavaSwing项目合集》系列文章⚡
 
⚡《数据分析中的pandas》系列文章⚡


四、bean的作用范围


                                    类别	           描述
                                    
                                    名称	          scope
                                    
                                    类型	           属性
                                    
                                    所属	          bean标签
                                    
                         	                      定义bean的作用范围,可选范围如下
                                  功能                   singleton: 单例 (默认)
                                                        prototype: 非单例 (多例-每次获取时都创建新的对象)
                                                             
------------------------------------------------------------------------------------------------------------
                                                            
              *例子:
                       <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" scope="prototype" />
                           
------------------------------------------------------------------------------------------------------------  
       "为什么bean默认为单例?"
                           
           * 适合交给容器进行管理的bean(适合单例)
                           
              控制器对象 (以前用的Servlet做为控制器)
                           
              业务层对象 (如:BookService)
                           
              数据层对象 (如:BookDao或BookMapper)
                           
              工具对象 (如:CartUtils对象)
                           


            * 不适合交给容器进行管理的bean
                           
                   封装实体的域对象(实体类对象 Book 包名:pojo,entity, domain)
                                                     
                           
------------------------------------------------------------------------------------------------------------                           
                           
/*
   其他作用范围(了解即可):
   
      * request:仅适用于Web环境下的ApplicationContext,每一个Http请求都会拥有一个单独的实例
      
      * session:仅适用于Web环境下的ApplicationContext,即每一个用户都将拥有一个单独的实例
      
      * globalSession:仅适用于Web环境下的ApplicationContext,表示每一个全局的Http Session下都会拥有一个单独的实例
      
      * application:仅适用于Web环境下的ApplicationContext,即在整个ServletContext环境下只会拥有一个实例


*/
                                        

⭐singleton单例范围代码演示

//XML类
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">


 <!--    IoC容器可以理解为一个Map集合
        bean标签:配置类的信息,会在IoC容器中创建对象
             class属性:类全名(包名.类名)
             id属性:唯一标识,取个名字,将来通过id的值来获取对象

             name属性: 给Bean取别名,可以通过别名获取
             scope属性:Bean的范围,默认是单例
                   singleton:单例
                   prototype:多例,每次获取的时候创建新的对象


-->
     <!--   等价于 book =new BookServiceImpl
            bean其实就是用来创建对象的
                                            -->
    <bean class="com.itheima.service.impl.BookServiceImpl" id="bookService"
                     name="b1,b2 ; b3 b4"
                     scope="singleton">


        <!--       给BookServiceImpl的bookDao成员变量赋值  ref:引用IOC容器中对的bookDao
           property标签:依赖注入,通过set方法输入
                  name:类中的成员变量
                  ref:注入的对象-->
        <property name="bookDao" ref="bookDao"></property>

    </bean>

    <!--IOC容器创建BookDaoImpl对象-->

    <!--  bookDao =new BookDaoImpl()  -->
    <bean class="com.itheima.dao.impl.BookDaoImpl" id="bookDao"></bean>
</beans>
        
------------------------------------------------------------------------------------------------------------
        
//测试类
    @Test
    public void testBeanScope() {
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("application.xml");

        BookService service1 = (BookService) ctx.getBean("bookService");
        BookService service2  = (BookService) ctx.getBean("bookService");

        System.out.println("service1 = " + service1);
        System.out.println("service2 = " + service2);

        System.out.println("是不是同一个对象:"+(service1==service2));


        //关闭容器
        ctx.close();

    }

Spring中的bean的配置、作用范围、生命周期详细描述及使用(XML版上篇)


⭐prototype多例范围代码演示

//xml类
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">


 <!--    IoC容器可以理解为一个Map集合
        bean标签:配置类的信息,会在IoC容器中创建对象
             class属性:类全名(包名.类名)
             id属性:唯一标识,取个名字,将来通过id的值来获取对象

             name属性: 给Bean取别名,可以通过别名获取
             scope属性:Bean的范围,默认是单例
                   singleton:单例
                   prototype:多例,每次获取的时候创建新的对象


-->
     <!--   等价于 book =new BookServiceImpl
            bean其实就是用来创建对象的
                                            -->
    <bean class="com.itheima.service.impl.BookServiceImpl" id="bookService"
                     name="b1,b2 ; b3 b4"
                     scope="prototype">


        <!--       给BookServiceImpl的bookDao成员变量赋值  ref:引用IOC容器中对的bookDao
           property标签:依赖注入,通过set方法输入
                  name:类中的成员变量
                  ref:注入的对象-->
        <property name="bookDao" ref="bookDao"></property>

    </bean>

    <!--IOC容器创建BookDaoImpl对象-->

    <!--  bookDao =new BookDaoImpl()  -->
    <bean class="com.itheima.dao.impl.BookDaoImpl" id="bookDao"></bean>
</beans>

------------------------------------------------------------------------------------------------------------

//测试类
    @Test
    public void testBeanScope() {
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("application.xml");

        BookService service1 = (BookService) ctx.getBean("bookService");
        BookService service2  = (BookService) ctx.getBean("bookService");

        System.out.println("service1 = " + service1);
        System.out.println("service2 = " + service2);

        System.out.println("是不是同一个对象:"+(service1==service2));


        //关闭容器
        ctx.close();

    }

Spring中的bean的配置、作用范围、生命周期详细描述及使用(XML版上篇)


五、bean的生命周期


                   * 生命周期: 从创建到消亡的完整过程
                   
                   * bean生命周期: bean从创建到销毁的整体过程
                   
                   * bean生命周期控制: 在bean创建后到销毁前做一些事情
                       
                   * 配置生命周期控制方法
                      
                      init-method="初始化方法"     //init-method属性: 配置Bean的初始化方法,初始化方法在构造器(构造方法)后执行
                      
                      destroy-method="销毁方法"   // destroy-method属性: 配置Bean的销毁方法

/*
      init-method的执行顺序:
                          执行构造方法 -> 执行属性注入(set操作) -> 执行bean初始化方法
                          
      destroy-method: 只对单例对象有效
*/

🍁bean生命周期的使用步骤


"bean生命周期的使用步骤:"
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

                        1.初始化容器
                        
                             * 创建对象(内存分配)
                             
                             * 执行构造方法
                             
                             * 执行属性注入(set操作)
                             
                             * 执行bean初始化方法
                             
                        2.使用bean
                        
                             * 执行业务操作
                             
                        3.关闭/销毁容器
                        
                             * 执行bean销毁方法
               

⭐代码演示

// 业务层实现类
public class BookServiceImpl implements BookService {
    private BookDao bookDao;


    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }

    @Override
    public void save() {

        bookDao.save();
    }


    public void  init(){

        System.out.println(" BookServiceImpl 初始化了");
    }

    public void  destroy(){

        System.out.println(" BookServiceImpl 寄了");
    }
}

------------------------------------------------------------------------------------------------------------
    
//xml类
    
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">


 <!--    IoC容器可以理解为一个Map集合
        bean标签:配置类的信息,会在IoC容器中创建对象
             class属性:类全名(包名.类名)
             id属性:唯一标识,取个名字,将来通过id的值来获取对象

             name属性: 给Bean取别名,可以通过别名获取
             scope属性:Bean的范围,默认是单例
                   singleton:单例
                   prototype:多例,每次获取的时候创建新的对象

        init-method属性: 配置Bean初始化方法, 初始化方法在构造器后执行
        destroy-method属性: 配置Bean销毁的方法


-->
     <!--   等价于 book =new BookServiceImpl
            bean其实就是用来创建对象的
                                            -->
    <bean class="com.itheima.service.impl.BookServiceImpl" id="bookService"
                     name="b1,b2 ; b3 b4"
                     scope="singleton"

                     init-method="init"
                     destroy-method="destroy">



        <!--       给BookServiceImpl的bookDao成员变量赋值  ref:引用IOC容器中对的bookDao
           property标签:依赖注入,通过set方法输入
                  name:类中的成员变量
                  ref:注入的对象-->
        <property name="bookDao" ref="bookDao"></property>

    </bean>

    <!--IOC容器创建BookDaoImpl对象-->

    <!--  bookDao =new BookDaoImpl()  -->
    <bean class="com.itheima.dao.impl.BookDaoImpl" id="bookDao"></bean>
</beans>


Spring中的bean的配置、作用范围、生命周期详细描述及使用(XML版上篇)


⚡注意事项⚡

                            "destroy-method: 只对单例对象有效"

Spring中的bean的配置、作用范围、生命周期详细描述及使用(XML版上篇)


🍁bean的销毁时机


                * 容器关闭前触发bean的销毁
                
                * 关闭容器方式:
                
                    * 手工关闭容器
                       close()操作
                       
                    * 注册关闭钩子,在虚拟机退出前先关闭容器再退出虚拟机
                       registerShutdownHook()操作


⭐代码演示

Spring中的bean的配置、作用范围、生命周期详细描述及使用(XML版上篇)


作者:KJ.JK

文章对你有所帮助的话,欢迎给个赞或者 star,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习

相关文章

暂无评论

暂无评论...