spring Bean的生命周期
1. 实例化一个Bean,也就是我们通常说的new
2. 按照Spring上下文对实例化的Bean进行配置,也就是IOC注入
3. 如果这个Bean实现了BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,此处传递的是Spring配置文件中Bean的ID
4. 如果这个Bean实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(),传递的是Spring工厂本身(可以用这个方法获取到其他Bean)
5. 如果这个Bean实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文,该方式同样可以实现步骤4,但比4更好,以为ApplicationContext是BeanFactory的子接口,有更多的实现方法
6. 如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用After方法,也可用于内存或缓存技术
7. 如果这个Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法
8. 如果这个Bean关联了BeanPostProcessor接口,将会调用postAfterInitialization(Object obj, String s)方法
1.接口类
package demo;
import java.beans.PropertyDescriptor;
import org.springframework.beans.BeansException;
import org.springframework.beans.PropertyValues;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor;
public class MyInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
// TODO Auto-generated method stub
System.out.println("调用BeanPostProcessor接口的postProcessBeforeInitialization方法");
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
// TODO Auto-generated method stub
System.out.println("调用BeanPostProcessor接口的postProcessAfterInitialization方法");
return bean;
}
@Override
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
// TODO Auto-generated method stub
System.out.println("调用InstantiationAwareBeanPostProcessor接口的postProcessBeforeInstantiation方法");
return null;
}
@Override
public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
// TODO Auto-generated method stub
System.out.println("调用InstantiationAwareBeanPostProcessor接口的postProcessAfterInstantiation方法");
return true;
}
@Override
public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean,
String beanName) throws BeansException {
// TODO Auto-generated method stub
System.out.println("调用InstantiationAwareBeanPostProcessor接口的postProcessPropertyValues方法");
return pvs;
}
}
3.创建的实例
package demo;
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 MyBean implements BeanNameAware, BeanFactoryAware, InitializingBean, DisposableBean{
private BeanFactory beanFactory;//实现了BeanFactory接口,Spring可将BeanFactory注入该属性中
private String name;
private String tag;
public MyBean(){
System.out.println("调用构造器实例化Bean");
}
public void printName(){
System.out.println("MyBean name is: " + name);//注入的name属性
}
public String getTag() {
return tag;
}
public void setTag(String tag) {
this.tag = tag;
System.out.println("设置Bean的属性为:" + tag);
}
@Override
public void destroy() throws Exception {
// TODO Auto-generated method stub
System.out.println("调用DisposableBean接口的destroy方法");
}
@Override
public void afterPropertiesSet() throws Exception {
// TODO Auto-generated method stub
System.out.println("调用InitializingBean接口的afterPropertiesSet方法");
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
// TODO Auto-generated method stub
this.beanFactory = beanFactory;
System.out.println("调用BeanFactoryAware接口的setBeanFactory方法");
}
@Override
public void setBeanName(String name) {
// TODO Auto-generated method stub
this.name = name;
System.out.println("调用BeanNameAware接口的setBeanName方法");
}
}
3.测试
package demo;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
public class App {
public static void main(String[] args) {
//实例化BeanFactory
Resource res = new ClassPathResource("beans.xml");
BeanFactory bf = new XmlBeanFactory(res);
//注册InstantiationAwareBeanPostProcessor后置处理器,因为InstantiationAwareBeanPostProcessor继承了BeanPostProcessor,
//所以不再单独注册BeanPostProcessor后置处理器
((ConfigurableBeanFactory)bf).addBeanPostProcessor(new MyInstantiationAwareBeanPostProcessor());
//获得bean
MyBean bean = bf.getBean("myBean", MyBean.class);
bean.printName();
//销毁所有Bean
((XmlBeanFactory)bf).destroySingletons();
}
}
运行结果
调用InstantiationAwareBeanPostProcessor接口的postProcessBeforeInstantiation方法
调用构造器实例化Bean
调用InstantiationAwareBeanPostProcessor接口的postProcessAfterInstantiation方法
调用InstantiationAwareBeanPostProcessor接口的postProcessPropertyValues方法
设置Bean的属性为:test
调用BeanNameAware接口的setBeanName方法
调用BeanFactoryAware接口的setBeanFactory方法
调用BeanPostProcessor接口的postProcessBeforeInitialization方法
调用InitializingBean接口的afterPropertiesSet方法
调用BeanPostProcessor接口的postProcessAfterInitialization方法
MyBean name is: myBean
调用DisposableBean接口的destroy方法
Process finished with exit code 0
感谢大家观看!