Spring Bean--Bean的配置项、作用域、生命周期
2016-10-19 17:44
573 查看
在Spring的IOC里,把一切配置到IOC容器里的实体或对象都称为bean。
Bean配置项:
id:在整个IOC容器中,这个bean的唯一标识
class:具体要实例化的类(必须)
scope:范围、作用域
constructor arguments:构造器的参数
properties:属性
autowiring mode:自动装配的模式
lazy-initialization mode:懒加载模式
initialization/destruction method:初始化/销毁的方法
从bean容器中得到某一个实例的方式:
通过id来获取(必须配置id)
根据bean的类型来获取(只需配置class)
Bean的作用域:
注:单例singleton模式是spring bean的默认模式
例:(singleton与prototype)
BeanScope:
spring-beanscope.xml:
测试TestBeanScope:
Bean的生命周期:
Bean的定义:在Spring的bean的配置文件(xml文件)中为bean定义id和class
Bean的初始化:在IOC容器启动时加载bean配置文件里的bean,并初始化,生成bean的实例
Bean的使用:在单元测试或实际开发中从bean容器中取出一个bean的实例,然后调用它的方法
Bean的销毁:在bean容器停止的时候去销毁由当前这个bean容器创建的所有的bean的实例
初始化:两种方式
方式一:
IOC容器加载这个bean,判断是否实现了InitializingBean这个接口,然后自动调用afterPropertiesSet方法,执行初始化工作,不需要实现init-method。
方式二:
当IOC容器加载这个bean并初始化的时候,就会根据init-method指定的方法去调用ExampleBean的init方法,去执行一些初始化的工作。
Bean的销毁:两种方式
方式一:
当bean销毁的时候,也就是调用ApplicationContext的销毁方法的时候就会调用这个bean实例的destroy方法,执行方法的内容
方式二:
当bean销毁的时候,也就是调用ApplicationContext的销毁方法的时候就会调用这个bean实例的cleanup方法,执行一些销毁的工作,比如释放连接池操作。
注:以上的初始化和销毁方法都是针对具体的某一个bean的配置,那么配置全局默认初始化、销毁方法:
在bean的配置文件的
例:(bean的初始化、销毁)
spring-lifecycle.xml配置一个bean:
BeanLifeCycle.java:
测试类TestBeanLifecycle:
通过运行三种方式:
先执行初始化,再执行销毁。
注:同时使用三种配置方式,先执行实现接口的方法,再执行在bean中配置的init-method和destroy-method,默认的初始化和销毁方法不生效。
Bean配置项:
id:在整个IOC容器中,这个bean的唯一标识
class:具体要实例化的类(必须)
scope:范围、作用域
constructor arguments:构造器的参数
properties:属性
autowiring mode:自动装配的模式
lazy-initialization mode:懒加载模式
initialization/destruction method:初始化/销毁的方法
从bean容器中得到某一个实例的方式:
通过id来获取(必须配置id)
根据bean的类型来获取(只需配置class)
Bean的作用域:
注:单例singleton模式是spring bean的默认模式
例:(singleton与prototype)
BeanScope:
package com.bean; public class BeanScope { public void say(){ System.out.println("BeanScope say:"+this.hashCode()); //通过hashcode来区分是否为同一个实例 } }
spring-beanscope.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" > <!-- 设置bean的作用域为singleton <bean id="beanScope" class="com.bean.BeanScope" scope="singleton"></bean> --> <bean id="beanScope" class="com.bean.BeanScope" scope="prototype"></bean> </beans>
测试TestBeanScope:
package com.test.bean; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.BlockJUnit4ClassRunner; import com.bean.BeanScope; import com.imooc.test.base.UnitTestBase; @RunWith(BlockJUnit4ClassRunner.class) public class TestBeanScope extends UnitTestBase { public TestBeanScope() { super("classpath*:spring-beanscope.xml"); } @Test public void testSay(){ BeanScope beanScope=super.getBean("beanScope"); //从IOC容器中获取bean beanScope.say(); BeanScope beanScope2=super.getBean("beanScope"); //从IOC容器中获取bean beanScope2.say(); //若在一个IOC容器中scope设置为singleton,则两次输出hashcode相同 //若在一个IOC容器中scope设置为prototype,则两次输出hashcode不同 } @Test public void testSay2(){ //这种情况下两个方法执行的结果hashcode不相同是因为每一个测试方法都会执行@before、@test、@after,虽然方法体一样,但是是从两个spring的IOC容器中获取的,所以bean的hashcode不同 BeanScope beanScope=super.getBean("beanScope"); //从IOC容器中获取bean beanScope.say(); BeanScope beanScope2=super.getBean("beanScope"); //从IOC容器中获取bean beanScope2.say(); //若在一个IOC容器中scope设置为singleton,则两次输出hashcode相同 } }
Bean的生命周期:
Bean的定义:在Spring的bean的配置文件(xml文件)中为bean定义id和class
Bean的初始化:在IOC容器启动时加载bean配置文件里的bean,并初始化,生成bean的实例
Bean的使用:在单元测试或实际开发中从bean容器中取出一个bean的实例,然后调用它的方法
Bean的销毁:在bean容器停止的时候去销毁由当前这个bean容器创建的所有的bean的实例
初始化:两种方式
方式一:
IOC容器加载这个bean,判断是否实现了InitializingBean这个接口,然后自动调用afterPropertiesSet方法,执行初始化工作,不需要实现init-method。
方式二:
当IOC容器加载这个bean并初始化的时候,就会根据init-method指定的方法去调用ExampleBean的init方法,去执行一些初始化的工作。
Bean的销毁:两种方式
方式一:
当bean销毁的时候,也就是调用ApplicationContext的销毁方法的时候就会调用这个bean实例的destroy方法,执行方法的内容
方式二:
当bean销毁的时候,也就是调用ApplicationContext的销毁方法的时候就会调用这个bean实例的cleanup方法,执行一些销毁的工作,比如释放连接池操作。
注:以上的初始化和销毁方法都是针对具体的某一个bean的配置,那么配置全局默认初始化、销毁方法:
在bean的配置文件的
<beans>里配置default-init-method和default-destroy-method,那么在这个配置文件里的所有bean初始化的时候,也就是IOC容器在加载这些bean的时候,都会调用它的init方法,最后在IOC容器销毁的时候都会调用默认销毁方法destroy。
例:(bean的初始化、销毁)
spring-lifecycle.xml配置一个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" default-init-method="defautInit" default-destroy-method="defaultDestroy" > <!-- 方式三:全局配置默认方法,若存在另外两种方式之一,则此方式不生效--> <!-- 方式一: 配置init-method和 destroy-method--> <bean id="beanLifeCycle" class="com.lifecycle.BeanLifeCycle" init-method="start" destroy-method="stop"></bean> <!-- 方式二: 类必须实现InitializingBean,DisposableBean接口 <bean id="beanLifeCycle" class="com.lifecycle.BeanLifeCycle"></bean> --> </beans>
BeanLifeCycle.java:
package com.lifecycle; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.context.annotation.Bean; public class BeanLifeCycle implements InitializingBean,DisposableBean{ //实现初始化bean和销毁的bean的两个接口 //方式三:配置全局初始化和销毁方式,在beans定义default-init-method="defautInit"等,若没有方向defautInit也可编译通过 //若存在另外两种方式之一,则此方法不生效 public void defautInit(){ System.out.println("Bean defautInit."); } public void defaultDestroy(){ System.out.println("Bean defaultDestroy"); } //方式二:类必须实现InitializingBean,DisposableBean接口,bean中设置id,class即可 @Override public void destroy() throws Exception { System.out.println("Bean destroy."); } @Override public void afterPropertiesSet() throws Exception { System.out.println("Bean afterPropertiesSet."); } //方式一:bean中必须设置init-method="start" destroy-method="stop",且必须有start和stop方法,否则编译不通过 public void start(){ System.out.println("Bean start."); } public void stop(){ System.out.println("Bean stop."); } }
测试类TestBeanLifecycle:
package com.test.lifecycle; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.BlockJUnit4ClassRunner; import com.imooc.test.base.UnitTestBase; @RunWith(BlockJUnit4ClassRunner.class) public class TestBeanLifecycle extends UnitTestBase { public TestBeanLifecycle() { super("classpath:spring-lifecycle.xml"); } @Test public void test1(){ super.getBean("beanLifeCycle"); //通过id获取bean } }
通过运行三种方式:
先执行初始化,再执行销毁。
注:同时使用三种配置方式,先执行实现接口的方法,再执行在bean中配置的init-method和destroy-method,默认的初始化和销毁方法不生效。
相关文章推荐
- Spring Bean的配置项:作用域与生命周期
- 那些年、一起追过的Spring--(3)----Bean的配置项及作用域,Bean装配的生命周期,配置集合对象
- Spring入门篇之Bean的配置项及作用域
- Spring Bean的配置项及作用域
- Spring入门篇之Bean的配置项及作用域
- spring注入方式、配置项及作用域、生命周期、Aware接口、自动装配
- Spring2.5—— Bean的生命周期、作用域不同步的Bean
- Spring-基于注解的配置[03Bean作用范围和生命周期方法]
- spring心得2--bean的生命周期@Spring监听器的作用@Spring初始化容器案例分析@web项目使用
- 详解Spring中Bean的生命周期和作用域及实现方式
- Spring入门(Bean配置项、生命周期等)
- Spring中Bean的生命周期和作用域
- 【Spring学习20】bean作用域:理解Bean生命周期
- Spring学习笔记(5.Spring Bean装配之Bean的配置项及作用域)
- spring心得2--bean的生命周期@Spring监听器的作用@Spring初始化容器案例分析@web项目使用
- spring心得2--bean的生命周期@Spring监听器的作用@Spring初始化容器案例分析@web项目使用
- Spring:Bean的作用范围及Bean的生命周期
- Spring的Bean生命周期内的callback方法和Spring容器启动关闭时的callback方法
- Spring Bean生命周期
- 详解Spring中bean的作用域