Spring是一个轻量级开源框架,IOC和AOP是其核心思想,Bean的生命周期是框架的精髓。
IOC及反向控制程序所需要的对象,在需要的地方进行注入即可。所有SpringIOC可以理解为一个容器,类似于Map。
既然我们定义的类的对象都由Spring进行了管理,那么我们怎么用才能告诉Spring我们需要什么样的对象呢?
接触过的可以知道是通过xml配置或者是注解的方式来告诉Spring框架,你帮我管理一个这样的bean,而且里面有各种定义信息。
我们知道java是一个面向对象的语言,所以在xml中定义的各种对象属性,都会被封装成一个对象交给下一步进行处理,BeanDefinition作为一个接口封装一系列对对象属性定义处理的方法。ALT+7可以看见所有方法。
所以一个bean的流程大致为
通过IO流解析配置或者注解—>并—>封装为BeanDefinition,—>封装好的BeanDefinition放入容器
xml-IO-转成document-解析父子节点
因为我们有xml,注解,properties,yaml等方式定义bean的信息,所有Spring一定封装了解析文件的接口,就是BeanDefinitionReader,我们发现它有对应的几个实现类来解析不同的文件。
我们在给bean添加属性的时候,为了方便维护通常把配置信息放在一个单独的文件里,而xml里面放的则是一个占位符。Spring是怎么为我们处理占位符的呢?PostProcessor 后置增强器。
BeanFactory:The root interface for accessing a Spring bean container
访问Spring容器的根接口
ApplicationContext
因为BeanFactory是IOC容器的根接口,所以它的子类可以通过后置增强器BeanFactoryPostProcessor拿到BeanDefinition对象去处理里面的占位符。
看实现抽象类
a 实例化:申请空间,对象的属性值是默认值createBeanInstance
b 初始化
自定义属性赋值 populateBean:set容器属性赋值 aware invokeAwareMethods
c bean对象扩展操作 beanPostProcessor(初始化方法的前置处理,后置处理)|AOP|动态代理(jdk,cglib)
d bean对象扩展操作前置后置中间为初始化方法
初始化方法为容器提供给用户的最后一次自定义操作bean对象属性或者的入口。
invokeInitMethods–>检查对象是否实现了InitializingBean(相当于init-method)—>afterPropertiesSet
补充:Aware 意识到
在自定义类中使用容器类作为属性,应该让容器调用set方法,但是什么时候调用呢?定义统一规范接口来告诉容器初始化后给哪些用户自定义类进行属性注入。
public interface Aware {
}
如果我们想注入BeanFactory就实现BeanFactoryAware接口,可以看见里面的set方法和自定义的set方法一样,这样刚好实现了接口里面的方法。
public interface BeanFactoryAware extends Aware {
void setBeanFactory(BeanFactory beanFactory) throws BeansException;
}
aware生命周期代码补充:
首先判断是否实现了Aware接口,然后判断是否实现了BeanNameAware/BeanClassLoaderAware/BeanFactoryAware,如果实现了就调用set方法。
private void invokeAwareMethods(final String beanName, final Object bean) {
if (bean instanceof Aware) {
if (bean instanceof BeanNameAware) {
((BeanNameAware) bean).setBeanName(beanName);
}
if (bean instanceof BeanClassLoaderAware) {
ClassLoader bcl = getBeanClassLoader();
if (bcl != null) {
((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);
}
}
if (bean instanceof BeanFactoryAware) {
((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
}
}
}



