image.png

BeanFactoryPostProcessor

BeanDefinitionRegistryPostProcessor

  • BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)
    • 可以注册BeanDefinition。
  • BeanFactoryPostProcessor.postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
    • 操作beanfactory了

这两个参数是同一个对象

ConfigurationClassPostProcessor解析@Configuration、@Import、@PropertySource、@ComponentScan、@ImportResource

这个类将处理configuration的类中以下注解:
@Import、@PropertySource、@ComponentScan、@ImportResource、@Bean methods等。将这些注解涉及到的BeanDifinition注册到BeanDefinitionRegistry中。
BeanFactoryPostProcessor&BeanPostProcessor总结 - 图2
ConfigurationClassPostProcessor —— Spring中最!最!最!重要的后置处理器!没有之一!!!java天堂的博客-CSDN博客

MapperScannerConfigurer:Mybatis扫描mapper

纯BeanFactoryPostProcessor

PropertyResourceConfigurer

属性

ConfigurationClassPostProcessor

ConfigurationClassPostProcessor 在 postProcessBeanFactory()中通过
beanDef.setBeanClass(enhancedClass); 修改了@Configuration类的beanclass
image.png
@Component和@Configuration作为配置类的差别_一号搬砖手的博客-CSDN博客_configuration和component的区别

PlaceholderConfigurer:xml配置文件中引用配置文件中的值

各种BeanPostProcessor

MergedBeanDefinitionPostProcessor
SmartInstantiationAwareBeanPostProcessor
这两个一般都内部使用的。

  • InstantiationAwareBeanPostProcessor
    • Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName)
      • 【实例化前】
    • boolean postProcessAfterInstantiation(Object bean, String beanName)
      • 【实例化后,返回bool决定postProcessPropertyValues是否执行】
    • PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName)
      • 【实例化后,填充属性之前】
  • BeanPostProcessor
    • 【初始化前】Object postProcessBeforeInitialization(Object bean, String beanName)
    • 【初始化后】Object postProcessAfterInitialization(Object bean, String beanName)

image.png
绿色InstantiationAwareBeanPostProcessor 紫色BeanPostProcessor

BeanFactoryPostProcessor&BeanPostProcessor总结 - 图5
BeanFactoryPostProcessor&BeanPostProcessor总结 - 图6

InstantiationAwareBeanPostProcessor

postProcessBeforeInstantiation():实例化之前

AbstractAutoProxyCreator为创建代理类做一些工作?

如果没有自定义TargetSource,则走到postProcessAfterInitialization方法创建代理
如果没有自定义TargetSource,则走到postProcessAfterInitialization方法创建代理

  1. public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport
  2. implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware {

AnnotationAwareAspectJAutoProxyCreator

postProcessAfterInstantiation()

如果该方法返回false,并且不需要check,那么postProcessPropertyValues就会被忽略不执行如果返回true,postProcessPropertyValues就会被执行。

postProcessPropertyValues()

顾名思义,处理property,这个property是RootBeanDefinition中的property,property通过InstantiationAwareBeanPostProcessor的处理,在放回BeanWrapper中。

因为根据BeanDefinition构造 BeanWrapper过程中没有设置属性值。直接通过BeanUtils.instantiateClass(class) 来构造出对象。

beanDefinition中的property从哪来的?在哪构建的beanDefinition? 答:通过BeanDefinitionRegistryPostProcessor

beanWrapper和Bean的关系 BeanWrapper顾名思义,bean的包裹器。其中有个属性Object wrappedObject; 存放生成的bean。 BeanWrapper用来给bean设置属性。给BeanWrapper设置properties就是给Bean设置properties。

AutowiredAnnotationBeanPostProcessor处理@Autowired

@Autowired、@Value、@Inject、@Lookup
自定义扩展AutowiredAnnotationBeanPostProcessor
image.png
或者
image.png
创建BeanPostProcessor要使用单独的配置文件,或使用static。

RequiredAnnotationBeanPostProcessor执行@Required注解的检查等等

CommonAnnotationBeanPostProcessor处理@Resource@PostConstruct@PreDestroy

提供对JSR-250规范注解的支持@javax.annotation.Resource、@javax.annotation.PostConstruct和@javax.annotation.PreDestroy等的支持。
处理顺序在AutowiredAnnotationBeanPostProcessor之后。

BeanFactoryPostProcessor&BeanPostProcessor总结 - 图9

BeanPostProcessor

postProcessBeforeInitialization()

实例化(new)、依赖注入完毕(set),初始化之前(init-method)

CommonAnnotationBeanPostProcessor(InitDestroyAnnotationBeanPostProcessor)处理@PostConstruct

class CommonAnnotationBeanPostProcessor extends InitDestroyAnnotationBeanPostProcessor

image.png

BeanValidationPostProcessor处理@Valid注解Bean验证

根据afterInitialization是false/true决定调用postProcessBeforeInitialization或postProcessAfterInitialization来通过JSR-303规范验证Bean,默认false。

ApplicationContextAwareProcessor一些Aware接口的注入

注入那些实现ApplicationContextAware、MessageSourceAware、ResourceLoaderAware、EnvironmentAware、EmbeddedValueResolverAware、ApplicationEventPublisherAware标识接口的Bean需要的相应实例

ServletContextAwareProcessor处理ServletContextAware、ServletConfigAware

postProcessAfterInitialization()

初始化完毕

AbstractAutoProxyCreator 给代理类包装增强?

如果有增强就执行包装目标对象到代理对象