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中。
ConfigurationClassPostProcessor —— Spring中最!最!最!重要的后置处理器!没有之一!!!java天堂的博客-CSDN博客
MapperScannerConfigurer:Mybatis扫描mapper
纯BeanFactoryPostProcessor
PropertyResourceConfigurer
ConfigurationClassPostProcessor
ConfigurationClassPostProcessor 在 postProcessBeanFactory()中通过
beanDef.setBeanClass(enhancedClass); 修改了@Configuration类的beanclass
@Component和@Configuration作为配置类的差别_一号搬砖手的博客-CSDN博客_configuration和component的区别
PlaceholderConfigurer:xml配置文件中引用配置文件中的值
各种BeanPostProcessor
- MergedBeanDefinitionPostProcessor
- SmartInstantiationAwareBeanPostProcessor
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)
- 【实例化后,填充属性之前】
- Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName)
- BeanPostProcessor
- 【初始化前】Object postProcessBeforeInitialization(Object bean, String beanName)
- 【初始化后】Object postProcessAfterInitialization(Object bean, String beanName)
绿色InstantiationAwareBeanPostProcessor 紫色BeanPostProcessor
InstantiationAwareBeanPostProcessor
postProcessBeforeInstantiation():实例化之前
AbstractAutoProxyCreator为创建代理类做一些工作?
如果没有自定义TargetSource,则走到postProcessAfterInitialization方法创建代理
如果没有自定义TargetSource,则走到postProcessAfterInitialization方法创建代理
public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport
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
或者
创建BeanPostProcessor要使用单独的配置文件,或使用static。
RequiredAnnotationBeanPostProcessor执行@Required注解的检查等等
CommonAnnotationBeanPostProcessor处理@Resource@PostConstruct@PreDestroy
提供对JSR-250规范注解的支持@javax.annotation.Resource、@javax.annotation.PostConstruct和@javax.annotation.PreDestroy等的支持。
处理顺序在AutowiredAnnotationBeanPostProcessor之后。
BeanPostProcessor
postProcessBeforeInitialization()
实例化(new)、依赖注入完毕(set),初始化之前(init-method)
CommonAnnotationBeanPostProcessor(InitDestroyAnnotationBeanPostProcessor)处理@PostConstruct
class CommonAnnotationBeanPostProcessor extends InitDestroyAnnotationBeanPostProcessor
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 给代理类包装增强?
如果有增强就执行包装目标对象到代理对象
- AspectJAwareAdvisorAutoProxyCreator处理xml风格的AOP
< aop:config> AnnotationAwareAspectJAutoProxyCreator处理@Aspectj注解风格
< aop:aspectj-autoproxy> @AspectScheduledAnnotationBeanPostProcessor
通过查找Bean对象类上的@Scheduled注解来创建ScheduledMethodRunnable对象并注册任务调度方法
AbstractAdvisingBeanPostProcessor
MethodValidationPostProcessor
- AsyncAnnotationBeanPostProcessor
PersistenceExceptionTranslationPostProcessor
DestructionAwareBeanPostProcessor
postProcessBeforeDestruction()
CommonAnnotationBeanPostProcessor处理@PreDestroy
参考文章
spring中的MergedBeanDefinitionPostProcessor接口是干啥的 - manong的回答 - SegmentFault 思否
- Spring开闭原则的表现-BeanPostProcessor的扩展点-1 - 《亿级流量网站架构核心技术》~ - ITeye博客
- Spring开闭原则的表现-BeanPostProcessor扩展点-2 - 《亿级流量网站架构核心技术》~ - ITeye博客