BeanFactory中bean的生命周期
来源:互联网 发布:李国杰 大数据 编辑:程序博客网 时间:2024/05/16 15:05
BeanFactory在初始化容器,并未实例化Bean,直到第一次访问某个Bean时才实例化目标Bean。
当调用者通过getBean()向容器请求某一个Bean时,如果容器注册了org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor接口,则在实例化Bean之前调用postProcessBeforeInstantiation()方法。
根据配置情况调用Bean构造函数或者工厂方法实例化Bean。
如果容器注册了 org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor接口,则在实例化Bean之后,调用该接口的postProcessAfterInstantiation()方法。
如果Bean配置了属性信息,则在设置属性之前将调用 org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor接口的postProcessPropertyValues()方法。
调用Bean的属性设置方法设置属性值。
如果Bean实现了org.springframework.beans.factory.BeanNameAware接口,则将调用setBeanName()方法,将配置文件的Bean名称设置到Bean中。
如果Bean实现了org.springframework.beans.factory.BeanFactoryAware接口,则将调用setBeanFactory()方法,将BeanFactory容器实例设置到Bean中。
如果BeanFactory装配了org.springframework.beans.factory.config.BeanPostProcessor后处理器,则将调用接口的postProcessBeforeInitialization()方法对Bean进行加工操作。
如果Bean实现了org.springframework.beans.factory.InitializingBean接口,则将调用接口的afterPropertiesSet()方法。
如果在《bean》《/bean》标签中init-method属性定义了初始化方法,则将执行这个方法。
如果BeanFactory装配了org.springframework.beans.factory.config.BeanPostProcessor后处理器,则将调用接口的postProcessAfterInitialization()方法对Bean再次进行加工操作。
对于scope=”singleton”(默认),则将Bean放入springIOC容器的缓存池中,并将引用返回给调用者,spring继续对这些Bean进行后续的生命管理。对于scope=”prototype”,则将Bean返回给调用者,调用者负责Bean的后续生命的管理,spring不再管理这个Bean的生命周期。
对于scope=”singleton”(默认),容器关闭时,将触发spring对Bean的后续生命周期的管理。如果Bean实现了org.springframework.beans.factory.DisposableBean接口,则将调用接口的destroy()方法,可以编写释放日志,记录日志等。
对于scope=”singleton”(默认)的Bean,如果在《bean》《/bean》标签中destory-method属性定义了Bean的销毁方法,则spring将执行这个方法。
package com.test.pojo;import java.beans.PropertyDescriptor;import org.springframework.beans.BeansException;import org.springframework.beans.PropertyValues;import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter;public class MyInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter { //在实例化bean之前执行 public Object postProcessBeforeInstantiation(Class beanClass, String beanName) throws BeansException { // TODO Auto-generated method stub if("car".equals(beanName)){ System.out.println("这是postProcessBeforeInstantiation方法==="); } return null; } //在实例化bean之后执行 public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException { // TODO Auto-generated method stub if("car".equals(beanName)){ System.out.println("这是postProcessAfterInstantiation方法==="); } return true; } //在设置那个属性的值的时候执行 public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException { // TODO Auto-generated method stub if("car".equals(beanName)){ System.out.println("这是postProcessPropertyValues方法==="); } return pvs; }}
package com.test.pojo;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;public class Car implements BeanFactoryAware,BeanNameAware,InitializingBean,DisposableBean{ private String brand; private String color; private int maxSpeed; private String beanName; private BeanFactory beanFactory; public Car() { System.out.println("====调用构造函数===="); } public void afterPropertiesSet() throws Exception { // TODO Auto-generated method stub System.out.println("调用InitializingBean.afterPropertiesSet()。"); } public void setBeanName(String name) { // TODO Auto-generated method stub System.out.println("调用了BeanNameAware.setBeanName()。"); this.beanName=name; } public void setBeanFactory(BeanFactory beanFactory) throws BeansException { // TODO Auto-generated method stub System.out.println("调用了BeanFactoryAware.setBeanFactory()。"); this.beanFactory=beanFactory; } public void destroy() throws Exception { // TODO Auto-generated method stub System.out.println("这是DisposableBean.destory()的方法"); } public void myInit(){ System.out.println("这是我指定的初始化方法,默认将maxSpeed设为240。"); this.maxSpeed=240; } public void myDestory(){ System.out.println("这是我的销毁方法"); } public String getBrand() { return brand; } public void setBrand(String brand) { System.out.println("这是setBrand方法"); this.brand = brand; } public String getColor() { return color; } public void setColor(String color) { System.out.println("这是setColor方法"); this.color = color; } public int getMaxSpeed() { return maxSpeed; } public void setMaxSpeed(int maxSpeed) { System.out.println("这是setMaxSpeed方法"); this.maxSpeed = maxSpeed; } @Override public String toString() { return "Car [brand=" + brand + ", color=" + color + ", maxSpeed=" + maxSpeed+"]"; }}
package com.test.pojo;import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.BeanPostProcessor;public class MyBeanPostProcessor implements BeanPostProcessor { public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { // TODO Auto-generated method stub if("car".equals(beanName)){ Car car=(Car)bean; if(car.getColor()==null){ System.out.println("这是postProcessBeforeInitialization方法==="); car.setColor("黑色");; } } return bean; } public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { // TODO Auto-generated method stub if("car".equals(beanName)){ Car car=(Car)bean; if(car.getMaxSpeed()>=200){ System.out.println("postProcessAfterInitialization方法==="); car.setMaxSpeed(200); } } return bean; }}
package com.test.spring;import org.apache.log4j.Logger;import org.springframework.beans.factory.BeanFactory;import org.springframework.beans.factory.support.DefaultListableBeanFactory;import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;import org.springframework.core.io.ClassPathResource;import org.springframework.core.io.Resource;import com.test.pojo.Car;import com.test.pojo.MyBeanPostProcessor;import com.test.pojo.MyInstantiationAwareBeanPostProcessor;public class StudentSpring { protected Logger logger = Logger.getLogger(this.getClass()); public static void main(String[] args) { Resource resource = new ClassPathResource("spring/applicationContext-dao.xml"); BeanFactory bf=new DefaultListableBeanFactory(); XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader((DefaultListableBeanFactory)bf); reader.loadBeanDefinitions(resource); ((DefaultListableBeanFactory)bf).addBeanPostProcessor(new MyBeanPostProcessor()); ((DefaultListableBeanFactory)bf).addBeanPostProcessor(new MyInstantiationAwareBeanPostProcessor()); Car car1 = (Car)bf.getBean("car"); Car car2 = (Car)bf.getBean(Car.class); System.out.println(car1.toString()+"::"+car2.toString()); System.out.println(car1==car2); ((DefaultListableBeanFactory)bf).destroySingletons(); }}
- BeanFactory中Bean的生命周期
- BeanFactory中Bean的生命周期
- BeanFactory中bean的生命周期
- Spring之BeanFactory中Bean的生命周期
- BeanFactory管理Bean的生命周期
- Spring BeanFactory管理Bean的生命周期
- Spring之Bean在BeanFactory的生命周期
- 通过BeanFactory来获取bean对象,bean的生命周期
- spring中在ApplicationContext或在BeanFactory中Bean的生命周期总结
- 好记性不如烂笔头85-spring3学习(6)-BeanFactory 中bean的生命周期
- 【Spring4揭秘 BeanFactory】BeanFactory中Bean的实例化过程
- Spring Bean在BeanFactory生命周期
- Spring bean ApplicationContext BeanFactory 生命周期
- Spring中BeanFactory产生Bean的方法
- Spring中BeanFactory产生Bean的方法
- Spring中BeanFactory产生Bean的方法
- Bean生成过程与BeanFactory ApplicationContext生命周期
- spring BeanFactory中Bean的实例化过程
- DPDK IPV4 LPM(路由表实现)详解
- 奥维奥(AVA)联合普华永道提供为您带来《2017中国汽车市场蓝皮书》
- MySQL5.6在线DDL不锁表(在线添加字段)
- Dialvik/ARP(ANDROID)中的多线程机制(4)
- mybatis针对Oracle数据库进行(单个或多个条件)批量操作(新增、修改、删除)的sql写法--mysql
- BeanFactory中bean的生命周期
- .startsWith和endsWith的使用方法与说明
- tp5主从数据库设置读写分离
- Python pip 下载速度慢? Windows 设置 国内源,用 阿里云 国内镜像 加速
- 简单的数据词典sql查询
- 171106 逆向-SWPU(Re300-初窥)
- IntelliJ IDEA配置老的web项目
- 多线程相关概念整理
- idea的debug调试快捷键