从源码理解Spring后置处理器
什么是Bean的生命周期拓展点
Spring为每个开发者提供了开箱即用的方便属性,更是将对象的创建和管理全都交给了spring容器,对于降低开发难度和代码维护难度有着不小的贡献,但是傻瓜式的使用同时也伴有这一定缺点,比如说如果我想在Bean创建的过程中改变一下这个Bean,该怎么办呢?Bean是spring创建的呀。
Spring当然考虑到这一点(毕竟spring自己也有这个需求○ω○),它给开发者提供了Bean和Bean Factory创建过程中的多个后置处理器(postProcess)。开发者可以通过这些拓展点干涉Bean的创建,在任意一个Bean的实例化或初始化之前以及实例化或初始化之后去额外的做一些用户自定义的逻辑
有哪些拓展点可以使用
-
BeanFactory的后置处理器
-
BeanFacctoryPostProcessor
- BeanFactoryPostProcessor为BeanFactory的后置处理器,可以通过实现此接口拿到BeanFactory,拿到BeanFactory就可以做很多事情了,例如获取BeanDefinition,并且修改BeanDefinition的属性
- 作用在Spring容器初始化的时候,也就是创建Bean之前
- 自己实现一个例子:
@Component public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor { @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { // 匹配到自己的这个Bean,拿到BeanDefinition BeanDefinition beanDefinition = beanFactory.getBeanDefinition("myService"); // 给Bean换一个名字 definition.setBeanClassName("yourService"); } }
- 官方实现类
- EventListenerMethodProcessor
- 作用: 用来处理@EventListener注解的
- 我们来看看它是如何实现接口的方法的:
@Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) { this.beanFactory = beanFactory; // 从BeanFactory中拿出所有EventListenerFactory类型的FactoryBean // 默认会拿出DefaultEventListenerFactory Map<String, EventListenerFactory> beans = beanFactory.getBeansOfType(EventListenerFactory.class, false, false); List<EventListenerFactory> factories = new ArrayList<>(beans.values()); // 获取配置的@Order注解,将所有EventListenerFactory的Bean进行排序 AnnotationAwareOrderComparator.sort(factories); this.eventListenerFactories = factories; }
-
BeanDefinitionRegistryPostProcessor
- 上面的后置处理器只给我们提供了获取BeanDefinition的接口,但是没办法干涉BeanDefinition的注册,所以Spring提供了BeanDefinitionRegistryPostProcessor拓展点,通过实现该拓展点就能实现自定义注册BeanDefinition
- BeanDefinitionRegistryPostProcessor也是BeanFactoryPostProcessor的子类,也能够修改BeanDefinition
- 例如:
@Component public class ZhouyuBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor { @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { //创建一个空的BeanDefinition AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition(); // 给空的BeanDefinition设置类对象 beanDefinition.setBeanClass(MyBean.class); // 注册BeanDefinition registry.registerBeanDefinition("myBean", beanDefinition); } @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { // do something } }
- 官方实现类
- ConfigurationClassPostProcessor
- 作用:用于处理@Configuration配置类,并且实现了排序功能
- 来看看实现的接口方法是怎样的
@Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) { // 获取注册id int registryId = System.identityHashCode(registry); if (this.registriesPostProcessed.contains(registryId)) { throw new IllegalStateException( "postProcessBeanDefinitionRegistry already called on this post-processor against " + registry); } if (this.factoriesPostProcessed.contains(registryId)) { throw new IllegalStateException( "postProcessBeanFactory already called on this post-processor against " + registry); } this.registriesPostProcessed.add(registryId); // 在这个方法里面解析配置类 processConfigBeanDefinitions(registry); }
-
BeanDefinition的后置处理器
为了方便大家看清楚脉络,标题只列出了方法名,从方法名称可以很清楚的看到Bean的生命周期
-
postProcessBeforeInstantiation()
- 接口: InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation()
- 作用时期: 顾名思义, Bean在实例化前会调用这个拓展点
- 示例:
@Component public class MyBeanPostProcessor implements InstantiationAwareBeanPostProcessor { @Override public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException { if ("myService".equals(beanName)) { System.out.println("===实例化前==="); } return null; } } ```
-
-
postProcessMergedBeanDefinition()
- 接口: MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition()
- 作用时期: 创建对象之后,给属性赋值之前
- 示例:
@Component public class MyMergedBeanDefinitionPostProcessor implements MergedBeanDefinitionPostProcessor { @Override public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) { if ("myService".equals(beanName)) { beanDefinition.getPropertyValues().add("token","testToken" ); } } }
-
postProcessAfterInstantiation()
- 接口: InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation()
- 作用时期: 实例化结束之后
- 示例:
@Component public class MyInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor { @Override public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException { if ("myService".equals(beanName)) { Myservice myservice = (UserService) bean; myservice.test(); } return true; } }
-
postProcessProperties()
- 接口: InstantiationAwareBeanPostProcessor.postProcessProperties()
- 作用时期: 属性赋值时,可以实现此拓展点实现自己的自动注入
- 示例:
@Component public class MyProcessorProperties implements InstantiationAwareBeanPostProcessor { @Override public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException { if ("myService".equals(beanName)) { // 获取所有的属性 for (Field field : bean.getClass().getFields()) { // 遇到我们自己定义的注解类执行自定义逻辑 if (field.isAnnotationPresent(MyImport.class)) { field.setAccessible(true); try { field.set(bean, "test"); } catch (IllegalAccessException e) { e.printStackTrace(); } } } } return pvs; } }
-
postProcessBeforeInitialization()
- 接口: BeanPostProcessor.postProcessBeforeInitialization()
- 作用时期: bean初始化前
- 示例:
@Component public class MyBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { if ("myService".equals(beanName)) { System.out.println("初始化前"); } return bean; } }
-
postProcessAfterInitialization()
- 接口: BeanPostProcessor.postProcessAfterInitialization()
- 作用时期: bean初始化后
- 示例:
@Component public class MyBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if ("myService".equals(beanName)) { System.out.println("初始化后"); } return bean; } } ```
-
这些拓展点在源码的哪里被加载
-
BeanFactory的后置处理器
-
BeanFacctoryPostProcessor
-
Spring加载容器有非常重要的三个步骤
public AnnotationConfigApplicationContext(Class<?>... componentClasses) { // 父类的GenericApplicationContext在构造方法中初始化了一个构造DefaultListableBeanFactory this(); register(componentClasses); refresh(); }
- this()构造方法主要创建DefaultListableBeanFactory和AnnotatedBeanDefinitionReader、ClassPathBeanDefinitionScanner
- register()主要处理@Lazy@Scope等注解以及注册配置类的BeanDefinition
- refresh(), refresh方法做的事情非常多,整个Bean的生命周期都是在这个方法中完成,也就是我们所有的拓展点加载过程都可以在这个方法及其分支中找到,同样BeanFacctoryPostProcessor的postProcessBeanFactory()方法也是在这个过程中加载
-
源码加载处
AbstractApplicationContext的refresh()方法@Override public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { ..... try { ..... // 前面的方法都在准备容器环境 // 为BeanFactory配置类加载器,添加BeanPostprocessor等准备工作 // BeanFactory准备就绪后开始执行BeanFactoryPostProcessor,开始对BeanFactory进行处理 invokeBeanFactoryPostProcessors(beanFactory); ..... } }
invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory)方法
protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) { // 执行工厂的后置处理器就是在这个方法中了 PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors()); .... }
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors()方法
public static void invokeBeanFactoryPostProcessors( ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) { // BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor .... // 先执行BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry()方法 ..... // 再执行BeanDefinitionRegistryPostProcessor的postProcessBeanFactory()方法 invokeBeanFactoryPostProcessors(registryProcessors, beanFactory); // 再执行手动添加的普通BeanFactoryPostProcessor的postProcessBeanFactory()方法 invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory); .... }
这个方法中做了很多事情,如果想要了解Spring的启动过程非常建议自己去看看源码
-
-
BeanDefinitionRegistryPostProcessor
- 也是在上面的PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors()方法中执行
List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>(); // 执行扫描出来的BeanDefinitionRegistryPostProcessor // 先执行实现了PriorityOrdered的BeanDefinitionRegistryPostProcessors String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false); for (String ppName : postProcessorNames) { if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) { currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class)); processedBeans.add(ppName); } } // 升序排序 sortPostProcessors(currentRegistryProcessors, beanFactory); registryProcessors.addAll(currentRegistryProcessors); // 执行postProcessBeanDefinitionRegistry()方法 invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup()); currentRegistryProcessors.clear(); // 然后执行实现了Ordered的BeanDefinitionRegistryPostProcessor postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false); for (String ppName : postProcessorNames) { // processedBeans表示该beanFactoryPostProcessor的postProcessBeanDefinitionRegistry()方法已经执行过了,不再重复执行 if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) { currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class)); processedBeans.add(ppName); } } sortPostProcessors(currentRegistryProcessors, beanFactory); registryProcessors.addAll(currentRegistryProcessors); invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup()); currentRegistryProcessors.clear(); // 最后执行没有实现PriorityOrdered和Ordere接口的BeanDefinitionRegistryPostProcessor // 在这个过程中可能会向BeanFactory中注册另外的BeanDefinitionRegistryPostProcessor,所以需要while,直到确定所有的BeanDefinitionRegistryPostProcessor都执行完 // 在这个过程中注册的BeanDefinitionRegistryPostProcessor,所实现的PriorityOrdered或Ordered接口可能会不按顺序执行 boolean reiterate = true; while (reiterate) { reiterate = false; postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false); for (String ppName : postProcessorNames) { if (!processedBeans.contains(ppName)) { currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class)); processedBeans.add(ppName); reiterate = true; } } sortPostProcessors(currentRegistryProcessors, beanFactory); registryProcessors.addAll(currentRegistryProcessors); invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup()); currentRegistryProcessors.clear(); }
- 也是在上面的PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors()方法中执行
-
-
BeanDefinition的后置处理器
-
postProcessBeforeInstantiation()
- 前面BeanFactory加载执行后就到了Bean的后置处理器加载执行,还是在refresh()方法中
- 首先是注册这些PostProcessors
看看这个registerBeanPostProcessors()方法, 调用到PostProcessorRegistrationDelegate.registerBeanPostProcessors()方法@Override public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { ..... try { ..... // 前面的方法都在准备容器环境 // 为BeanFactory配置类加载器,添加BeanPostprocessor等准备工作 // BeanFactory准备就绪后开始执行BeanFactoryPostProcessor,开始对BeanFactory进行处理 invokeBeanFactoryPostProcessors(beanFactory); // Register bean processors that intercept bean creation. // 将扫描到的BeanPostProcessor排序后添加到BeanFactory的beanPostProcessors属性中去 registerBeanPostProcessors(beanFactory); ..... } }
public static void registerBeanPostProcessors( ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) { String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false); // beanProcessorTargetCount表示BeanFactory中所有的BeanPostProcessor数量,+1包含下面的BeanPostProcessorChecker int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length; beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount)); // 先添加实现PriorityOrdered接口的PostProcessor // 再添加实现ordered接口的PostProcessor List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>(); List<BeanPostProcessor> internalPostProcessors = new ArrayList<>(); List<String> orderedPostProcessorNames = new ArrayList<>(); List<String> nonOrderedPostProcessorNames = new ArrayList<>(); for (String ppName : postProcessorNames) { if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) { BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); priorityOrderedPostProcessors.add(pp); // 所有MergedBeanDefinitionPostProcessor最后单独注册 if (pp instanceof MergedBeanDefinitionPostProcessor) { internalPostProcessors.add(pp); } } else if (beanFactory.isTypeMatch(ppName, Ordered.class)) { orderedPostProcessorNames.add(ppName); } else { nonOrderedPostProcessorNames.add(ppName); } } // 首先注册实现了PriorityOrdered. // 升序排序 sortPostProcessors(priorityOrderedPostProcessors, beanFactory); registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors); // 其次注册实现了Ordered. List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size()); 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); // 注册所有普通的BeanPostProcessors List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size()); for (String ppName : nonOrderedPostProcessorNames) { BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); nonOrderedPostProcessors.add(pp); if (pp instanceof MergedBeanDefinitionPostProcessor) { internalPostProcessors.add(pp); } } registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors); // 注册所有MergedBeanDefinitionPostProcessors sortPostProcessors(internalPostProcessors, beanFactory); registerBeanPostProcessors(beanFactory, internalPostProcessors); // Re-register post-processor for detecting inner beans as ApplicationListeners, // moving it to the end of the processor chain (for picking up proxies etc). // ApplicationListenerDetector放在所有BeanPostProcessor之后 beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext)); }
- 其次执行postProcessBeforeInstantiation()
这里经历的过程比较复杂,注册完所有的PostProcessors后,Spring又- 初始化了MessageSource
- 设置了ApplicationContext的applicationEventMulticaster
- 将实现了ApplicationListener类注册到ApplicationContext中去,添加事件监听器并执行在此之前所发布的事件
- 最后实例化所有非懒加载的Bean,我们的Bean扩展点就是在这里调用
来看看源码,还是refresh方法()
真正实例化Bean的代码在finishBeanFactoryInitialization()这个方法中,我们来看下@Override public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { .... invokeBeanFactoryPostProcessors(beanFactory); // scanner.scan() // 将扫描到的BeanPostProcessors实例化并排序,并添加到BeanFactory的beanPostProcessors属性中去 registerBeanPostProcessors(beanFactory); .... // 初始化了MessageSource initMessageSource(); // 设置了ApplicationContext的applicationEventMulticaster initApplicationEventMulticaster(); // 给子类的模板方法 onRefresh(); // 扫描并添加事件监听器 registerListeners(); // 实例化所有非懒加载的Bean finishBeanFactoryInitialization(beanFactory); .... }
这个方法是个门面方法,由DefaultListableBeanFactory实现,这个方法其中没有什么,核心是调用AbstractBeanFactory的getBean()方法获取Bean对象,getBean()方法又调用自身的 doGetBean() 方法,这个方法才是创建Bean的核心方法,这里如果你感兴趣可以自己去看看逻辑实现,这里只展示调用拓展点的代码protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) { // 看源码,先不看if分支,会干扰对整个脉络的理解,我们往下捋一捋 // 实例化的所有非懒加载的Bean的方法在最后 .... // 实例化所有非懒加载的Bean beanFactory.preInstantiateSingletons(); }
不管是创建哪种类型的bean,其核心方法都是createBean(), 这也是个门面方法,是由子类AbstractAutowireCapableBeanFactory实现的,也是在这里开始了Bean的生命周期protected <T> T doGetBean( String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly) throws BeansException { // 前面是各种Bean类型的判断和处理 .... // 这里开始实例化Bean,包括单例Bean原型Bean等 if (mbd.isSingleton()) { sharedInstance = getSingleton(beanName, () -> { try { // 核心方法,在这里创建Bean,也是在这里执行的beanPostProcessors return createBean(beanName, mbd, args); } catch (BeansException ex) { // 销毁Bean destroySingleton(beanName); throw ex; } }); beanInstance = getObjectForBeanInstance(sharedInstance, name, beanName, mbd); } // 原型Bean else if (mbd.isPrototype()) { // It's a prototype -> create a new instance. Object prototypeInstance = null; try { beforePrototypeCreation(beanName); // 核心方法也是在这里 prototypeInstance = createBean(beanName, mbd, args); } finally { afterPrototypeCreation(beanName); } beanInstance = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd); } .... // 下面还有对于Scope的判断,核心和上面一样也是createBean() }
很明显resolveBeforeInstantiation()方法就是调用了我们的InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation()@Override protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException { .... 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; } } .... try { // 创建Bean Object beanInstance = doCreateBean(beanName, mbdToUse, args); if (logger.isTraceEnabled()) { logger.trace("Finished creating instance of bean '" + beanName + "'"); } return beanInstance; } }
@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. // 如果是合成bean则不会经过BeanPostProcessor的处理 if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) { Class<?> targetType = determineTargetType(beanName, mbd); if (targetType != null) { // 这个方法中调用实例化前后置处理器 bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName); // 如果bean已经被创建了调用实例化后后置处理器 if (bean != null) { bean = applyBeanPostProcessorsAfterInitialization(bean, beanName); } } } mbd.beforeInstantiationResolved = (bean != null); } return bean; }
-
postProcessMergedBeanDefinition()
- 上面的createBean方法处理完实例化前后置处理器后,紧接着就是调用AbstractAutowireCapableBeanFactory.doCreateBean()方法开始实例化bean对象
看看applyMergedBeanDefinitionPostProcessors()方法中是如何实现的,和前面的实现差不多protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException { // 先实例化bean // Instantiate the bean. BeanWrapper instanceWrapper = null; if (mbd.isSingleton()) { // 有可能在本Bean创建之前,就有其他Bean把当前Bean给创建出来了(比如依赖注入过程中) instanceWrapper = this.factoryBeanInstanceCache.remove(beanName); } if (instanceWrapper == null) { // 创建Bean实例 instanceWrapper = createBeanInstance(beanName, mbd, args); } .... // 后置处理合并后的BeanDefinition // Allow post-processors to modify the merged bean definition. synchronized (mbd.postProcessingLock) { if (!mbd.postProcessed) { try { // 在这里处理MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition() applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName); } catch (Throwable ex) { throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Post-processing of merged bean definition failed", ex); } mbd.postProcessed = true; } }
protected void applyMergedBeanDefinitionPostProcessors(RootBeanDefinition mbd, Class<?> beanType, String beanName) { for (MergedBeanDefinitionPostProcessor processor : getBeanPostProcessorCache().mergedDefinition) { processor.postProcessMergedBeanDefinition(mbd, beanType, beanName); } }
- 上面的createBean方法处理完实例化前后置处理器后,紧接着就是调用AbstractAutowireCapableBeanFactory.doCreateBean()方法开始实例化bean对象
-
postProcessAfterInstantiation()
- 这个后置处理器是在实例化后,属性赋值前,所以很容易猜到在源码中的位置
我们回到刚才那个创建Bean的方法:AbstractAutowireCapableBeanFactory.doCreateBean()
这里Spring没有单独写方法处理实例化后后置处理器,而是直接融合到属性填充中,这是非常巧妙的一个做法,在Bean的生命周期中,只要属性开始注入了,那么实例化一定完成了,不管我们怎么拓展实例化期间的代码,总能保证Spring处理实例化后后置处理器的时候一定是实例化完成之后。protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException { // 实例化bean ... //处理MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition() ... // 解决循环依赖,添加Bean到三级缓存 ... // 属性填充 populateBean(beanName, mbd, instanceWrapper); ... }
处理后置处理器的代码依旧是大同小异@SuppressWarnings("deprecation") // for postProcessPropertyValues protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) { .... // 实例化之后,属性设置之前 if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) { for (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) { if (!bp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) { return; } } } .... }
- 这个后置处理器是在实例化后,属性赋值前,所以很容易猜到在源码中的位置
-
postProcessProperties()
- 属性注入后后置处理器,当然和上面一样也是在populateBean()方法中
protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) { .... // 实例化之后,属性设置之前,处理实例化后后置处理器 .... // 处理Autowired注解,属性自动注入 .... // 判断是否有实现InstantiationAwareBeanPostProcessors接口的类 boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors(); boolean needsDepCheck = (mbd.getDependencyCheck() != AbstractBeanDefinition.DEPENDENCY_CHECK_NONE); PropertyDescriptor[] filteredPds = null; if (hasInstAwareBpps) { if (pvs == null) { pvs = mbd.getPropertyValues(); } for (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) { // 调用AutowiredAnnotationBeanPostProcessor的postProcessProperties()方法,直接给对象中的属性赋值 PropertyValues pvsToUse = bp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName); // 这里不会处理pvs,直接返回 if (pvsToUse == null) { if (filteredPds == null) { filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching); } pvsToUse = bp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName); if (pvsToUse == null) { return; } } pvs = pvsToUse; } } ... }
- 属性注入后后置处理器,当然和上面一样也是在populateBean()方法中
-
postProcessBeforeInitialization()
- 属性注入后就到初始化了,当然在初始化之前Spring要处理初始化前后置处理器。
还是回到doGetBean()方法:
spring的脉络是非常清晰的,还是那句话,看主脉络,熟悉整体框架再来看细节,initializeBean()这个方法中处理了初始化前和初始化后后置处理器protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException { // 实例化bean ... //处理MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition() ... // 解决循环依赖,添加Bean到三级缓存 ... try { // 属性填充 populateBean(beanName, mbd, instanceWrapper); // 初始化 exposedObject = initializeBean(beanName, exposedObject, mbd); }catch (Throwable ex) { .... } ... }
具体的处理方法就不用看了,和之前一样,循环获取所有的processors,调用postProcessBeforeInitialization()方法protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) { // 初始化前 if (mbd == null || !mbd.isSynthetic()) { wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName); } // 初始化 try { invokeInitMethods(beanName, wrappedBean, mbd); } catch (Throwable ex) { ... } // 初始化后 AOP if (mbd == null || !mbd.isSynthetic()) { wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName); } .... }
- 属性注入后就到初始化了,当然在初始化之前Spring要处理初始化前后置处理器。
-
postProcessAfterInitialization()
- 源码调用处见上
-
该怎么用这些拓展点
- 该怎么用这些拓展点见仁见智,每个项目都有不同的需求,但是Spring的做法可能会给你一些参考
- 比如Spring事务,主要是通过AutoProxyRegistrar向Spring容器中注册了一个InfrastructureAdvisorAutoProxyCreator的Bean。
InfrastructureAdvisorAutoProxyCreator继承了AbstractAdvisorAutoProxyCreator,AbstractAdvisorAutoProxyCreator继承了AbstractAutoProxyCreator,AbstractAutoProxyCreator实现了InstantiationAwareBeanPostProcessor的子类,重写了postProcessBeforeInstantiation()、postProcessAfterInitialization()方法,会在实例化前步骤处理targetSource(SpringAop的核心内容),在初始化后创建代理对象,从而实现事务管理 - 比如mybatis-Spring新版实现了BeanDefinitionRegistryPostProcessor接口,容器启动时调用postProcessBeanDefinitionRegistry()方法,创建一个ClassPathMapperScanner扫描mapper对象
- 再比如官方提供的@PostConstruct注解,可以让你在属性注入后,初始化前做一些个性化定制,比如获取自己的session连接或者socket连接等
- 比如Spring事务,主要是通过AutoProxyRegistrar向Spring容器中注册了一个InfrastructureAdvisorAutoProxyCreator的Bean。
Spring源码还有很多精彩的地方需要自己去阅读探究,此篇文章仅是抛砖引玉,希望能帮助你理解部分Spring的思路,如果觉得文章还不错或者帮助到你了,帮忙点个赞吧