Este artigo apresenta principalmente a primeira parte do ciclo de vida do springbean, a estratificação de cada parte é concluída de acordo com o pós-processador BeanPostProcessor.
O conteúdo completo deste artigo é
1. Armazene os objetos que precisam ser um proxy de op na coleção (o objeto existente AppConfig.class conclui o aprimoramento de CGLIB por meio de BeanFactoryPostProcessor)
BeanPostProcessor # AnnotationAwareAspectJAutoProxyCreator # postProcessBeforeInstantiation ();
2. Método de construção inferida para inicializar o objecto ( primavera-ioc-inferida construtor-manual de montagem , -mola-ioc inferida montagem construtor-automático )
BeanPostProcessor # AutowiredAnnotationBeanPostProcessor # determineCandidateConstructors ();
3. Merge beanDefinition (suplementado posteriormente, algum processamento de mesclagem foi feito no método BeanFactoryPostProcessor anterior)
4. Lidar com dependências circulares (dependências spring-ioc-cyclic )
BeanPostProcessor # AnnotationAwareAspectJAutoProxyCreator # getEarlyBeanReference ();
Este artigo apresenta primeiro as duas imagens do artigo anterior
Conforme mostrado na figura, existem 6 pós-processadores de bean neste momento. Agora adicionamos o suporte de ativação de aop para a classe de configuração do ambiente de teste
@EnableAspectJAutoProxy terá mais um AnnotationAwareAspectJAutoProxyCreator
Como de costume, dê uma olhada no diagrama de herança BeanPostProcessor e há muitas classes de implementação ...
个人觉得springbean的生命周期就是从创建bean开始的AbstractAutowireCapableBeanFactory#createBean() 所以我们有了 BeanPostProcessor 后置处理器的第一步解决了将需要进行代理的对象存到了一个集合中,下面来看代码
BeanPostProcessor # AnnotationAwareAspectJAutoProxyCreator # postProcessBeforeInstantiation ();
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
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. // 判断是否为一个合成的bd(默认false) && 默认true 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; }
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; } AnnotationAwareAspectJAutoProxyCreator --postProcessBeforeInstantiation -- advisedBeans.put(object,false)--处理后返回null advisedBeans 已经有appconfig 呢,bean工厂后置处理器已代理
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) { Object cacheKey = getCacheKey(beanClass, beanName); if (!StringUtils.hasLength(beanName) || !this.targetSourcedBeans.contains(beanName)) { if (this.advisedBeans.containsKey(cacheKey)) { return null; } // 判断这个对象是否是一个代理对象,已经存在AppConfig.class if (isInfrastructureClass(beanClass) || shouldSkip(beanClass, beanName)) { this.advisedBeans.put(cacheKey, Boolean.FALSE); return null; } }
// Existem cortes
}
protected boolean isInfrastructureClass(Class<?> beanClass) { return (super.isInfrastructureClass(beanClass) || (this.aspectJAdvisorFactory != null && this.aspectJAdvisorFactory.isAspect(beanClass))); }
public boolean isAspect(Class<?> clazz) { return (hasAspectAnnotation(clazz) && !compiledByAjc(clazz)); } //返回true 包含注解@Aspect private boolean hasAspectAnnotation(Class<?> clazz) { return (AnnotationUtils.findAnnotation(clazz, Aspect.class) != null); }
//返回false 获取到属性值 BServiceBo bServiceBo getName不包含AJC_MAGIC private boolean compiledByAjc(Class<?> clazz) { for (Field field : clazz.getDeclaredFields()) { if (field.getName().startsWith(AJC_MAGIC)) { return true; } } return false; }
Tratamento de dependências circulares (consulte as dependências spring-ioc-cyclic )
Se a classe de configuração não estiver anotada com @EnableAspectJAutoProxy, então este pós-processador não estará presente. O código de getEarlyBeanReference () também retornará vazio diretamente. Se for adicionado, estará no mapa earlyProxyReferences.put (cacheKey, bean )
BeanPostProcessor # AnnotationAwareAspectJAutoProxyCreator # getEarlyBeanReference ();
A razão pela qual o método de construção não pode resolver o problema da dependência circular é que o pós-processador primeiro processa a inicialização do método de construção antes de resolver a dependência circular, e a ordem é diferente.
Consulte o fluxograma redesenhado