首先我们认识下spring容器,BeanFactory和ApplicationContext,由于后者是建立在前者之上的,我们先看前者。
它有个BeanFactory接口,定义了如何访问管理容器内的Bean方法。
还有个BeanDefinitionRegistry接口,专门管理Bean的注册,配置。
默认一个DefaultListableBeanFactory实现了上述两接口。而Bean的注册信息即BeanDefinition可通过bindViaCode方法来自行编码完成注册,也可分别通过bindViaproperties或bindViaXml方法利用BeanDefinitionReader来载入properties文件或xml配置文件注册。现在最常用的就是通过xml文件来配置,可用Setter方法注入或构造方法注入(点击查看:Spring Ioc的一个Demo)。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
当注册好Bean之后,就等着容器启动还有调用啦。
如果用的是BeanFatory容器,那它默认是延迟加载实例化Bean的,即当你用到这个Bean时它才帮你实例化了送过来;
如果用的是ApplicationContext容器,那是可容器一启动即实例化所有的Bean的。这个好用!!常用!!
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
从Bean的实例化到准备就绪等待使用中间还要走好常的路呢,
首先容器启动的时候,有时我们还需要对配置文件做一些处理,如${jdbc.passwd}此类占位符的二次加载啊还有其他对配置文件的再处理的,我们会用到BeanFactoryPostProcessor,
然后Bean实例化后并不马上成为就绪状态,这时候BeanWrapper会对其包裹返回一个BeanWrapper实例,
下阶段是设置初始属性值,接下来就是Aware接口,依赖注入就是靠这个实现啦,它要检查是否还有需要其他Bean的注入,
之后进入关键的BeanPostProcessor处理,为什么说是关键的呢,因为在这个阶段会做一些诸如生成代理的行为,Spring AOP(点击查看:Spring Aop 原理总结)就靠它了,还有初始化方法啊都在这里。总之,就是一个本来很纯净的Bean,我们将我们所需要的东西都加工上去,最后返回它的一个代理。
----spring的后处理
后处理器不就是AOP吗
配置文件中不设置ID,不对外提供服务
bean后处理器(可以对bean初始化前和后进行额外处理)
BeanPostProcessor一个简单了bean后处理器
spring提供两个常用的后处理器
BeanNameAutoProxyCreator 根据bean实例的name属性,创建bean实例的代理
DefaultAdvisorAutoProxyCreator 根据提供的Advisor,对容器中所有bean实例创建代理
容器后处理器
BeanFactoryPostProcessor
另外还有
PropertyPlaceholderConfigurer属性占位符配置器
PropertyOverrideConfigurer重写占位符配置器
CustomAutowireConfigurer自定义自动装配的配置器
CustomScopeConfigurer自定义作用域的配置器