生命周期的各个阶段:
可以分为三个阶段:产生-使用-销毁
又可以分四个阶段:四个阶段 实例化 ->属性注入->初始化 ->销毁
实例化后到使用的初始化过程: 属性赋值 ->处理各种Aware接口->实现BeanPostProcessor的before方法->nitializingBean接口的初始化方法回调->实现BeanPostProcessor的after方法
Bean实例化流程概述:
扫描配置信息:
在启动之处,Spring会加载Bean定义 loadBeanDefinitions方法,用xml,注解扫描等各种方式,将定义的所有Bean全部找到,存放到一个BeanDifinitionMap中去。
实例化Bean:
通过工厂后处理器的接口,实现对Bean的修改或注册
ApplicaContext通过遍历BeanDifinitionMap来创建对象。
public class MyBeanFactoryPostPro implements BeanFactoryPostProcessor {@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {// 通过ConfigurableListableBeanFactory 的getBeanDefinition方法获取beanDefinition对象,修改beanClassname,完成实例化对象的修改BeanDefinition beanDefinition = configurableListableBeanFactory.getBeanDefinition("user");beanDefinition.setBeanClassName("com.apersource.test.Student");}
}
同理,我们在如下代码中,通过是实现BeanDefinitionRegistryPostProcessor接口,并且重写了里面的方法,来注册了一个Bean到BeanDifinitionMap中去。
public class MyBeanFactoryPostProcessor2 implements BeanDefinitionRegistryPostProcessor {@Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {//进行注册RootBeanDefinition definition = new RootBeanDefinition();definition.setBeanClassName("com.apersource.test.Student");beanDefinitionRegistry.registerBeanDefinition("stu2",definition);}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {}
}
属性注入
通过populateBean方法为Bean内部所需的属性进行赋值填充,这些属性通常为@Autowired注解修饰的这些变量,Spring会通过三级缓存机制来进行属性填充,避免依赖闭环。
我认为三级缓存的核心思想便是将实例化与属性赋值分开,将不完整的Bean先拿来使用,实现对依赖闭环的突破,再重新对每个Bean对象完成属性赋值(拙见)。
感知实现的Aware接口,并进行处理
*/
public class User implements BeanNameAware, InitializingBean {public String name;public User() {System.out.println("实例化~");}public void setName(String name) {System.out.println("属性赋值");this.name = name;}@Overridepublic void setBeanName(String s) {System.out.println("各种aware接口的使用");}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("来自接口系统的初始化方法");}public void doinit(){System.out.println("自定义属性的初始化方法");}
}
如上代码所演示举例,我们获得一个不完整的Bean之后,对他进行属性赋值,之后首先Spring要处理的就是Aware接口的各种方法,如上实现了 BeanNameAware 接口,我们在其中输出一段语句,获取Bean时便可以清楚的看到执行顺序;
BeanPostProcessor
然后我们开始处理BeanPostProcessor的before和after方法,顾名思义分别在初始化前和初始化之后
public class MyPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("初始化前的后处理器");return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println("初始化后的后处理器");return bean;}
}
初始化的方法:
BeanPostProcessor的before和after方法之间
我们通过实现 InitializingBean 接口,重写里面的 afterPropertiesSet方法,实现了来自接口的初始化方法,在这之后我们如果有自定义的初始化方法并且声明在了配置文件中,会在基于接口的初始化方法之后执行,。
到此为止,一个完整的Bean对象将创建完成了,创建好的Bean对象存储在一个名为singletonObjects的Map集合
然后就是使用和销毁了;