Spring事务源码核心知识点

postProcessBeforeInitialization 

         这个方法的主要作用是应用所有注册的BeanPostProcessor的postProcessBeforeInitialization方法。BeanPostProcessor是Spring提供的一个扩展点,允许用户在bean的初始化前后插入自定义的逻辑。它在调用bean的初始化方法(如InitializingBean的afterPropertiesSet方法或者自定义的init-method方法)之前被调用。

        postProcessBeforeInitialization方法就是在bean初始化之前被调用的。  以下是一些applyBeanPostProcessorsBeforeInitialization的应用场景:  
属性填充:

       例如,RequiredAnnotationBeanPostProcessor会检查所有的bean属性,如果发现有标注了@Required注解的属性没有被设置,就会抛出异常。  
安全性检查:

       例如,SecuredAnnotationBeanPostProcessor会检查bean的方法,如果发现有标注了@Secured注解的方法,就会为这个bean创建一个代理对象,确保只有具有相应权限的用户才能调用这个方法。  
AOP:

        例如,AnnotationAwareAspectJAutoProxyCreator会检查bean的方法,如果发现有匹配的切点,就会为这个bean创建一个代理对象,实现AOP的功能。

public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport
		implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware {	
.... 
    @Override
	public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) {
		if (bean != null) {
			Object cacheKey = getCacheKey(bean.getClass(), beanName);
			if (this.earlyProxyReferences.remove(cacheKey) != bean) {
				return wrapIfNecessary(bean, beanName, cacheKey);
			}
		}
		return bean;
	}

}

       如果说顺序颠倒的话,先执行invokeInitMethods,在执行postProcessBeforeInitialization 就会导致一些问题,比如:

Bean的状态可能不正确:

            假设我们有一个DataSource Bean,它需要在初始化之前设置一些属性,

如url、username和password。我们可能会有一个BeanPostProcessor,它的postProcessBeforeInitialization方法会从配置文件中读取这些属性并设置到DataSource Bean上。如果postProcessBeforeInitialization在初始化方法afterPropertiesSet之后执行,那么在afterPropertiesSet方法中,DataSource Bean的url、username和password属性可能还没有被正确设置,这将导致DataSource Bean的状态不正确

public class DataSource {
    private String url;
    private String username;
    private String password;

    public void afterPropertiesSet() {
        // 在这个方法中,我们期望url、username和password已经被设置
        // 如果postProcessBeforeInitialization在这个方法之后执行,那么这些属性可能还没有被设置
        connect(url, username, password);
    }

可能破坏AOP代理的创建:例如,AbstractAutoProxyCreator就是一个实现了InstantiationAwareBeanPostProcessor接口的后处理器,它会在postProcessBeforeInstantiation方法中创建代理对象。如果applyBeanPostProcessorsBeforeInitialization在invokeInitMethods之后执行,那么在初始化方法执行时,可能还没有创建代理对象,这可能会导致AOP无法正常工作。举个例子说明下呢

public class MyService {
    public void performTask() {
        // 业务逻辑
    }
}

@Aspect
public class LoggingAspect {

    @Before("execution(* MyService.performTask(..))")
    public void logBefore(JoinPoint joinPoint) {
        // 记录日志
    }

    @After("execution(* MyService.performTask(..))")
    public void logAfter(JoinPoint joinPoint) {
        // 记录日志
    }
}

在这个例子中,AbstractAutoProxyCreator(或者更具体的,例如AnnotationAwareAspectJAutoProxyCreator)会在Bean的初始化阶段创建一个代理对象,这个代理对象会在调用performTask方法时执行LoggingAspect的逻辑。  如果applyBeanPostProcessorsBeforeInitialization在invokeInitMethods之后执行,那么在MyService的初始化方法执行时,代理对象可能还没有被创建。这意味着,即使MyService的初始化方法中调用了performTask方法,LoggingAspect的逻辑也不会被执行,因为此时MyService还不是一个代理对象。这就破坏了我们期望的AOP行为。  因此,applyBeanPostProcessorsBeforeInitialization应该在invokeInitMethods之前执行,以确保代理对象在Bean的初始化方法执行时已经被创建,从而保证AOP能够正常工作。


以上就是applyBeanPostProcessorsBeforeInitialization的一些应用场景,实际上,BeanPostProcessor提供了一个非常强大的扩展机制,用户可以根据自己的需求实现各种各样的功能。

科目明细
Pointcut
MethodMatcher
IntroductionAwareMethodMatcher
MethodMatcher
interface
BeanPostProcessor{
   postProcessBeforeInitialization          

   postProcessAfterInitialization
}        

InstantiationAwareBeanPostProcessor{

         postProcessProperties
}

 

SmartInstantiationAwareBeanPostProcessor{

         determineCandidateConstructors

}

method
applyBeanPostProcessorsBeforeInstantiation

applyBeanPostProcessorsAfterInitialization

applyMergedBeanDefinitionPostProcessors


applyBeanPostProcessorsBeforeInitialization
applyBeanPostProcessorsAfterInitialization

 
    
 
abstract class
AbstractAutoProxyCreator implements SmartInstantiationAwareBeanPostProcessor{
   postProcessBeforeInstantiation
   postProcessAfterInitialization-->
        wrapIfNecessary
}
AbstractAdvisingBeanPostProcessor extends ProxyProcessorSupport implements BeanPostProcessor {
        postProcessAfterInitialization
}

class

AutowiredAnnotationBeanPostProcessor
CommonAnnotationBeanPostProcessor
AnnotationAwareAspectJAutoProxyCreator extends AspectJAwareAdvisorAutoProxyCreator
AspectJAwareAdvisorAutoProxyCreator extends AbstractAdvisorAutoProxyCreator 
Advice:Advice是切面(Aspect)的行为部分,定义了切面需要完成的工作。例如,你可能会有一个Advice,它的任务是在方法调用前后记录日志。Spring AOP支持五种类型的Advice:前置(Before)、后置(After)、返回(After-returning)、异常(After-throwing)和环绕(Around)。  
 
Advisor:Advisor是Spring AOP中的一个概念,它是Advice和Pointcut的组合。Pointcut定义了Advice应该在何处应用,即在哪些方法上应用哪些通知。Advisor可以看作是已经包含了切入点信息的通知,Spring使用Advisor来配置Spring管理的对象,将通知(Advice)应用到目标对象的方法上。
 

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值