图1

Spring 源码解析 七

图2

Spring 源码解析 七

图3

Spring 源码解析 七

Spring 源码解析 七

 

Spring 源码解析 七

注册beanPostProcessor spring 的后置处理器。为什么需要注册呢?图3-0。547行国际化不重要。 onRefresh() 是空壳方法。registerListeners后续介绍。

图3-00

Spring 源码解析 七

spring的实例化流程。图19

图3-0

Spring 源码解析 七

spring 首先把一个bd转化成bean, 变成bean以后实例化,示例化完成之后开始调用有BeanPostProcessor元素的List 的后置处理器。执行完后置处理器开始生命周期的回调 ,例如init方法,destory()方法。到最后填充属性。为什么要注册,因为示例化需要调用这个后置处理器的List 所以提前注册到spring中。

 

图4

Spring 源码解析 七

图5

Spring 源码解析 七

Spring 源码解析 七

 

在执行 registerBeanPostProcessors 方法前,存放后置处理器的list已经存在三个了。是那两个呢,有是什么时候添加的呢,是

ApplicationContextAwareProcessor  ,ApplicationListenerDetector,内部类 ImprtAwareBeanPostProcessor这三个。其中 ApplicationContextAwareProcessor  ,ApplicationListenerDetector是在refresh()方法中的prepareBeanFactory中,图6的时候添加的。

那么ImprtAwareBeanPostProcessor 内部类呢,图7

Spring 源码解析 七

223行检查spring是不是执行了后置处理器,如果没有执行打印一行信息。如果有一个bean没有执行后置处理器,就去实例化了。

Spring 源码解析 七

Spring 源码解析 七

Spring 源码解析 七

Spring 源码解析 七

图6

Spring 源码解析 七

Spring 源码解析 七
Spring 源码解析 七

 

图7

Spring 源码解析 七

Spring 源码解析 七

Spring 源码解析 七

Spring 源码解析 七

Spring 源码解析 七

Spring 源码解析 七

BeanPostProcessor接口的,示例化之前调用的方法。

ImprtAwareBeanPostProcessor 这个类最终也是实现了BeanPostProcessor接口。

图8

Spring 源码解析 七

ImprtAwareBeanPostProcessor 的 示例化之前调调用的方法。首先判断这个bean是否实现ImportAware这个接口。

问题来了,ImportAware是什么场景下使用,咋使用。

经典场景redis的使用。 例如redis的存活时间就是根据注解来设置的。内部通过这个EnableRedisHttpSession类来实现的。 例如可以这样配置 @EnableRedisHttpSession(key="time" ,liveTime ="16s")来配置。

问题来了ImportAware 到底有什么用呢,能够获取spring容器中任意类的注解。通过类名获取这个注解。

图9 EnableRedisHttpSession 注解。

Spring 源码解析 七

图10

Spring 源码解析 七

代码示例

图11

Spring 源码解析 七

Spring 源码解析 七

图12-0

Spring 源码解析 七

最终会添加7个后置处理器。  第4个是CommonAnnotationBeanPostProcessor是处理一些公共的注解的处理器。例如@PostConstruct注解。第5个AutowiredAnnotationBeanPostProcessor .,判断是否加了Autowired 注解,加了。就用这个后置处理器处理。第6个是处理Requeired注解的。

 

图12

Spring 源码解析 七

检查spring是不是执行了后置处理器,如果没有执行打印一行信息。 判断目标的后置处理器个数和当前执行的后置处理器的个数是不是相等。

图13

Spring 源码解析 七

 

Spring 源码解析 七

Spring 源码解析 七

如果加了@Required注解,一定要注入一个字符串。如果不注入会报错。当我们去实例化IndexService时候,一定要注册一个字符串。为什么会报这个错呢,是因为有后置处理器处理了这个@Required注解,如果我们把这个RequiredAnnotationBeanPostProcessor类从List中移除,那么就不会报错了。

 

spring的aop事物

图14 

Spring 源码解析 七

Spring 源码解析 七

图15

Spring 源码解析 七

图16

Spring 源码解析 七

Spring 源码解析 七

加了@EnableAspectJautoProxy这个注解,就相当于在后置处理器的list的中又添加了一个AnnotationAutoProxyCreator的后置处理器。这个后置处理器是干什么呢,就是来处理Aop的。AnnotationAutoProxyCreator这个类最终实现了BeanPostProcessor类。

图16-0

Spring 源码解析 七

Spring 源码解析 七

图16-1

Spring 源码解析 七

当走完所有代码放置后置处理器的list  beanPostProcessors 就有8个。其中多了一个AnnotationAwareAutoProxyCreator的后置处理器。为什么执行完最后的beanPostProcessors.addBeanPostProcessor方法,才会多呢。而不是执行完图16-0。图16-0 我们看到还是两个啊。

因为spring 是图16-0 先把AnnotationAwareAutoProxyCreator先放在bdMap中 ,图16-2从bdMap中获取,依次添加到BeanPostProcessors中。

图16-2Spring 源码解析 七

图16-3

Spring 源码解析 七

图17

Spring 源码解析 七

Spring 源码解析 七

Spring 源码解析 七

 

Spring 源码解析 七

Spring 源码解析 七

Spring 源码解析 七

图18

Spring 源码解析 七

只要加了@EnableAspectJautoProxy这个注解 .。spring 会注册一个AnnotationAutoProxyCreator 的后置处理器专门处理aop .。一个示例对象通过调用后置处理器AnnotationAutoProxyCreator 会变成一个代理对象。

图19

Spring 源码解析 七

类型转换,比如把一个字符串转换成数组。

Spring 源码解析 七

判断是否有一个内置的value转化器,不重要。

Spring 源码解析 七

aspectj是在编译的时候织入的(aspectj扩展jdk的编译器,在编译过程中编译成你想要的类)基本用不到。 spring 的aop 不管是jdk,还是cglib 都是动态织入的(就是在你的项目运行之中织入)。动态代理 是不是改变原来的类,改变了一个新类。

Spring 源码解析 七

示例化单例对象之前的逻辑。869行。

Spring 源码解析 七

 

相关文章: