spring中在ApplicationContext或在BeanFactory中Bean的生命周期总结
Spring中Bean的生命周期,在学习spring的过程中bean的生命周期理解对学习spring有很大的帮助,下面我就分别介绍在ApplicationContext和BeanFactory中Bean的生命周期。
1、在ApplicationContext中Bean的生命周期
生命周期执行的过程如下:
1、需找所有的bean根据bean定义的信息来实例化bean
2、使用依赖注入,spring按bean定义信息配置bean的所有属性
3、若bean实现了BeanNameAware接口,工厂调用Bean的setBeanName()方法传递bean的ID。
4、若bean实现了BeanFactoryAware接口,工厂调用setBeanFactory()方法传入工厂自身。
5、若bean实现了ApplicationContextAware()接口,setApplicationContext()方法会被调用
6、若BeanPostProcessor和bean关联,
则它们的postProcessBeforeInitialization()方法被调用
7、若bean指定了init-method="init"方法、,它将被调用。
8、若有BeanPostProcessor和bean关联,
则它们的postProcessAfterInitialization()方法被调用
注意:通过已上操作,此时的Bean就可以被应用的系统使用,并讲保留在BeanFactory工厂中直到不再需要为止.但我们也可以通过9或者10进行销毁
9、若bean实现了DisposableBean接口,distroy()方法被调用
10、如果指定了destroy-method="close"定制的销毁方法,就调用这个方法
案例分析:
创建一个实体Bean代码如下:
package www.csdn.spring.dao;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class HelloDaoImpl implements BeanNameAware, BeanFactoryAware,
InitializingBean, ApplicationContextAware, DisposableBean {
private String content;
public HelloDaoImpl() {
System.out.println("----------HelloDaoImpl实例化");
}
public void setContent(String content) {
System.out.println("----------通过依赖注入的内容是:" + content);
this.content = content;
}
@Override
public void setBeanName(String beanId) {
System.out.println("----------输出BeanId:" + beanId);
}
@Override
public void setBeanFactory(BeanFactory factory) throws BeansException {
System.out.println("----------factory:" + factory.getClass());
}
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
System.out.println("----------" + applicationContext);
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("----------afterPropertiesSet");
}
public void init() {
System.out.println("----------初始化方法");
}
@Override
public void destroy() throws Exception {
System.out.println("----------bean被销毁");
}
public void close() {
System.out.println("----------close");
}
}
创建BeanPostProcessor实现类
-
packagewww.csdn.spring.dao;
-
-
-
importorg.springframework.beans.BeansException;
-
-
importorg.springframework.beans.factory.config.BeanPostProcessor;
-
-
-
publicclassBeanPostProcessorImplimplementsBeanPostProcessor{
-
-
@Override
-
-
publicObjectpostProcessBeforeInitialization(Objectbean,StringbeanName)
-
-
throwsBeansException{
-
- System.out.println("我把:"+beanName+"实例化化之前的操作");
-
-
returnbean;
-
- }
-
-
-
@Override
-
-
publicObjectpostProcessAfterInitialization(Objectbean,StringbeanName)
-
-
throwsBeansException{
-
- System.out.println("我把:"+beanName+"实例化化之后的操作");
-
-
returnbean;
-
- }
-
-
- }
package www.csdn.spring.dao;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class BeanPostProcessorImpl implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("我把:" + beanName + "实例化化之前的操作");
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("我把:" + beanName + "实例化化之后的操作");
return bean;
}
}
在配置文件中配置实体Bean和BeanPostProcessorImpl特殊的Bean
-
<?xmlversion="1.0"encoding="UTF-8"?>
-
-
<beansxmlns="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">
-
-
-
-
-
-
<beanid="helloDaoImpl"class="www.csdn.spring.dao.HelloDaoImpl"
-
-
scope="singleton"lazy-init="false"init-method="init"destroy-method="close">
-
-
-
-
<propertyname="content"value="陈老师早上好!"/>
-
-
</bean>
-
-
-
-
-
<beanclass="www.csdn.spring.dao.BeanPostProcessorImpl"/>
-
-
-
</beans>
<?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">
<!-- spring容器 就是负责创建、管理、维护Bean 并且能够依赖注入到相应组件上 -->
<bean id="helloDaoImpl" class="www.csdn.spring.dao.HelloDaoImpl"
scope="singleton" lazy-init="false" init-method="init" destroy-method="close">
<!-- 通过set方法注入 -->
<property name="content" value="陈老师早上好!" />
</bean>
<!-- BeanPostProcessor与当前的bean都进行关联 -->
<bean class="www.csdn.spring.dao.BeanPostProcessorImpl" />
</beans>
创建测试类BeanTest
-
packagewww.csdn.spring.bean.cycle;
-
-
-
importorg.junit.Test;
-
-
importorg.springframework.context.ApplicationContext;
-
-
importorg.springframework.context.ConfigurableApplicationContext;
-
-
importorg.springframework.context.support.ClassPathXmlApplicationContext;
-
-
-
publicclassBeanTest{
-
-
-
@Test
-
-
publicvoidtest(){
-
- ApplicationContextcontext=newClassPathXmlApplicationContext(
-
-
"classpath:spring-dao.xml");
-
-
-
- ConfigurableApplicationContextcont=(ConfigurableApplicationContext)context;
-
-
-
- cont.close();
-
-
- }
-
- }
package www.csdn.spring.bean.cycle;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class BeanTest {
@Test
public void test() {
ApplicationContext context = new ClassPathXmlApplicationContext(
"classpath:spring-dao.xml");
// 强制造型
ConfigurableApplicationContext cont = (ConfigurableApplicationContext) context;
// 执行关闭 可以考到 destory-method的方法的执行
cont.close();
}
}
执行结果如下:
总结:在ApplicationContext中Bean的生命周期
2、在BeanFactory中Bean的生命周期
在BeanFactory中Bean的生命周期与ApplicationContext中bean的生命周期唯一不同的是:若bean实现了ApplicationContextAware()接口,在ApplicationContext中bean的生命周期中setApplicationContext()方法会被调用,而在BeanFactory中Bean的生命周期此方法不会被调用。
案例采用上个案例:测试类中测试代码如下:
-
-
- ClassPathResourceresource=newClassPathResource("spring-dao.xml");
-
-
-
- ConfigurableBeanFactorycbf=newXmlBeanFactory(resource);
-
-
-
- cbf.addBeanPostProcessor(newBeanPostProcessorImpl());
-
-
-
-
-
- cbf.getBean("helloDaoImpl",HelloDaoImpl.class);
-
-
-
- cbf.destroySingletons();
// 创建资源对象
ClassPathResource resource = new ClassPathResource("spring-dao.xml");
// 采用BeanFactory初始化容器
ConfigurableBeanFactory cbf = new XmlBeanFactory(resource);
// bean后置处理器必须通过addBeanPostProcessor(new BeanPostProcessorImpl())手动添加
cbf.addBeanPostProcessor(new BeanPostProcessorImpl());
//在配置文件中给BeanPostProcessorImpl的bean加上id="beanPostProcessorImpl" //cbf.addBeanPostProcessor(cbf.getBean("beanPostProcessorImpl", BeanPostProcessorImpl.class));
// 获取Bean对象
cbf.getBean("helloDaoImpl", HelloDaoImpl.class);
// 销毁
cbf.destroySingletons();
执行结果:
总结:在BeanFactory中Bean的生命周期
另外说明:
应用上下文与bean工厂的另一个重要区别是关于单例bean如何被加载。
bean工厂延迟加载所有bean,直到getBean()方法被调用。
应用上下文会在启动后预载入所有单例bean.这样可确保应用不需要等待他们被创建。
分享到:
相关推荐
spring bean 的生命周期,把运行结果的日志,用sublime打开对比查看,你会有比较清晰的认识
Spring bean生命周期demo
SpringBean的生命周期.mdj
Springbean生命周期
此资源是我的博客bean的生命周期的测试代码,只有源代码,没有相关库文件,环境是spring4.2 ,
这个工程主要实现了: Spring中Bean的生命周期 applicationcontext的应用(实现国际化,事件的传递)
容器——Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个...
主要给大家介绍了Spring中Bean的生命周期和作用域及实现方式的相关资料,文中介绍的非常详细,对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
1、<bean>标签主要用来进行Bean定义; 2、alias用于定义Bean别名的; 3、import用于导入其他配置文件的Bean定义,这是为了加载多个配置文件,当然也可以把这些配置文件构造为一个数组(new String[] {“config1.xml...
Spring IOC容器可以管理Bean的生命周期,允许在Bean生命周期的特定点执行定制的任务。 Spring IOC容器对Bean的生命周期进行管理的过程如下: 通过构造器或工厂方法创建Bean实例 为Bean的属性设置值和对其它Bean的...
NULL 博文链接:https://cici9898-007.iteye.com/blog/1407695
12-17Spring容器中有关bean的生命周期的学习,脑图
介绍了Spring的Bean周期,容器周期,工厂周期,运行代码后可以看到运行结果
Spring管理的Bean的生命周期
Spring框架系列(8) - Spring IOC实现原理详解之Bean实例化(生命周期,循环依赖等).doc
SSH笔记-IOC容器中 Bean 的生命周期,通过实现BeanPostProcessor接口,来定义初始化方法和销毁方法时的逻辑
四份资料介绍Spring Bean 的生命周期,从认识,熟悉,深究,记忆Spring Bean。希望这份资料能帮助你!
Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。这篇文章主要介绍了Spring Bean 生命周期,需要的朋友可以参考下
BeanFactory管理Bean(组件)的生命周期 15 Bean的定义 16 Bean的之前初始化 19 Bean的准备就绪(Ready)状态 21 Bean的销毁 21 ApplicationContext 21 Spring的AOP框架 21 Spring的数据层访问 22 Spring的...