做一个独立出来的 容器创建步骤中 的 Aspect 部分。为了不让AOP 过于冗余。做一个简单的抽离。
整理的比较乱:有时间的时候 在整理下用词吧。 TODO
话不多说,直接进入正文吧。
下面说下 容器创建流程中的 Aspect 部分。
// 创建 IOC 容器 AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(MainConfigOfAOP.class);
public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) { this(); register(annotatedClasses); refresh(); }
实现步骤:
// Register bean processors that intercept bean creation. registerBeanPostProcessors(beanFactory);
其实只是定义还没有创建。 定义信息(BeanDefinitions)
// 通过注解获取所有的后置处理器 String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false); // 创建注册 beanPostProcessor BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); registerBeanPostProcessors(beanFactory, orderedPostProcessors); // Finally, re-register all internal BeanPostProcessors. sortPostProcessors(internalPostProcessors, beanFactory); registerBeanPostProcessors(beanFactory, internalPostProcessors); --> beanFactory.addBeanPostProcessor(postProcessor);
给容器中添加 创建BeanPostProcessor对象
// First, register the BeanPostProcessors that implement PriorityOrdered. sortPostProcessors(priorityOrderedPostProcessors, beanFactory); registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors); // Next, register the BeanPostProcessors that implement Ordered. List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(); for (String ppName : orderedPostProcessorNames) { BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); orderedPostProcessors.add(pp); if (pp instanceof MergedBeanDefinitionPostProcessor) { internalPostProcessors.add(pp); } } sortPostProcessors(orderedPostProcessors, beanFactory); registerBeanPostProcessors(beanFactory, orderedPostProcessors); // Now, register all regular BeanPostProcessors. List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(); for (String ppName : nonOrderedPostProcessorNames) { BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); nonOrderedPostProcessors.add(pp); if (pp instanceof MergedBeanDefinitionPostProcessor) { internalPostProcessors.add(pp); } } registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors); // Finally, re-register all internal BeanPostProcessors. sortPostProcessors(internalPostProcessors, beanFactory); registerBeanPostProcessors(beanFactory, internalPostProcessors);
这里面 创建 BeanPostProcessor 的方法 getBean 单独拎出来 放到下面统一说。
beanFactory.addBeanPostProcessor(postProcessor);
注册到 beanFactory 中
以上是创建和注册AnnotationAwareAspectJAutoProxyCreator的过程
AnnotationAwareAspectJAutoProxyCreator => InstantiationAwareBeanPostProcessor
比如 业务逻辑 (MathCalculator 对应的组件) 和 切面组件(LogAspect 对应的组件)
步骤 : finishBeanFactoryInitialization(beanFactory);
// Instantiate all remaining (non-lazy-init) singletons. beanFactory.preInstantiateSingletons(); getBean(beanName);
遍历容器中的所有 bean,依次创建对象 getBean(beanName);
在创建bean 的时候,这里会有所不同
1) AnnotationAwareAspectJAutoProxyCreator在所有bean创建之前会有一个拦截,InstantiationAwareBeanPostProcessor,会调用 postProcessBeforeInstantiation()
2) 先从缓存中获取当前bean,如果能获取到,说明bean是之前被创建过的,直接使用,
否则再创建;只要创建好的Bean都会被缓存起来
因为最后获取所有 bean 的 创建。 而有些已经在前面的步骤先行创建好了。 只需要从缓存中获取就好。
// Eagerly check singleton cache for manually registered singletons. Object sharedInstance = getSingleton(beanName); 为空再去创建 bean return createBean(beanName, mbd, args);
所谓的拦截,就是一段代码提前执行。
所在类 : org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java
try { // Give BeanPostProcessors a chance to return a proxy instead of the target bean instance. Object bean = resolveBeforeInstantiation(beanName, mbdToUse); if (bean != null) { return bean; } }
AnnotationAwareAspectJAutoProxyCreator 会在任何bean创建之前先尝试返回bean的实例【BeanPostProcessor是在Bean对象创建完成初始化前后调用的】
执行的方法
@Nullable protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) { Object bean = null; if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) { // Make sure bean class is actually resolved at this point. if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) { Class<?> targetType = determineTargetType(beanName, mbd); if (targetType != null) { // 切面的部分 ++ bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName); if (bean != null) { bean = applyBeanPostProcessorsAfterInitialization(bean, beanName); } } } mbd.beforeInstantiationResolved = (bean != null); } return bean; }
其中 bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
和 bean = applyBeanPostProcessorsAfterInitialization(bean, beanName); 为重要的功能。
只针对 : InstantiationAwareBeanPostProcessor 的后置处理器
@Nullable protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) { for (BeanPostProcessor bp : getBeanPostProcessors()) { if (bp instanceof InstantiationAwareBeanPostProcessor) { InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp; Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName); if (result != null) { return result; } } } return null; }
解析BeforeInstantiation
希望后置处理器在此能返回一个代理对象;如果能返回代理对象就使用,如果不能就继续
这部分放到 切面的部分来说 。 等待补充 TODO
Object beanInstance = doCreateBean(beanName, mbdToUse, args);
doCreateBean 的实现步骤
也就是创建 BeanPostProcessor 的过程。同样的也是创建 bean 的过程
这个时候 bean 只是有一个name 什么都没有。
对应的创建类: org/springframework/beans/factory/support/AbstractBeanFactory.java
具体流程步骤的类 : org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java
源码如下:
if (instanceWrapper == null) { instanceWrapper = createBeanInstance(beanName, mbd, args); } 里面的方法不再过多介绍 最后通过类的无参够着函数 实例化类 // No special handling: simply use no-arg constructor. return instantiateBean(beanName, mbd);
源码如下:
populateBean(beanName, mbd, instanceWrapper);
里面的细节不再过多解释,通过反射。为里面类的属性赋值
源码如下:
exposedObject = initializeBean(beanName, exposedObject, mbd);
初始化 bean 的时候可以做很多工作。
作为 和 https://segmentfault.com/a/1190000021554606 的对比。
本文主要增加了 Aware 部分。
invokeAwareMethods(beanName, bean);
所以初始化 bean 的步骤如下
2)applyBeanPostProcessorsBeforeInitialization():
应用后置处理器的postProcessBeforeInitialization()
initBeanFactory()
debug 的时候 以 AnnotationAwareAspectJAutpProxyCreator 为例。
AnnotationAwareAspectJAutpProxyCreator 也就是 使用 @EnableAspectJAutoProxy 注解定义的 bean