3、AOP及源码分析

if( 你有spring源码基础 ){

请继续;

}else{

请放弃;

}

开启AOP

常用注解

@EnableAspectJAutoProxy

通过@EnableAspectJAutoProxy注解开启AOP功能

@Aspect 代表切面类,定义通知和切面

  • @Before
  • @After
  • @Around:注意使用Around时,其他消息会失效
  • @AfterThrowing
  • @AfterRetruning
  • @Pointcut :公共切入点

调用消息时,如要获取切入点(被增强方法)的参数等信息,

在消息方法加入 JoinPoint 参数:

@Before(value = "cn.danaohu.aspect.CarProxy.gongGong()")
public void test1(JoinPoint joinPoint) {
    Object[] args = joinPoint.getArgs();
    System.out.println("args = " + args);
}

@EnableAspectJAutoProxy注解

打开spring源码,进入EnableAspectJAutoProxy类,发现有@Import这个元注解,意思是注册一个或者多个bean来完成注解的功能。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AspectJAutoProxyRegistrar.class)
public @interface EnableAspectJAutoProxy {
……

AspectJAutoProxyRegistrar 提供beanDefinition信息用于注册bean。来处理AOP

具体被注册的beanDefinition为:AnnotationAwareAspectJAutoProxyCreator

翻译为:注解装配模式的Aspect切面自动代理创建器,属于一个后置处理器,并能获取BeanFactory

代码如下:

//这个类的继承关系如下
Object (java.lang)
ProxyConfig (org.springframework.aop.framework)
ProxyProcessorSupport (org.springframework.aop.framework)
AbstractAutoProxyCreator (org.springframework.aop.framework.autoproxy)
AbstractAdvisorAutoProxyCreator (org.springframework.aop.framework.autoproxy)
AspectJAwareAdvisorAutoProxyCreator (org.springframework.aop.aspectj.autoproxy)
AnnotationAwareAspectJAutoProxyCreator (org.springframework.aop.aspectj.annotation)

//其中AbstractAutoProxyCreator代码如下 
//说明这个bean将被注册为一个后置处理器,用来进行aop操作,并能够获取BeanFactory
public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport
		implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware {
    ...

//其中在初始化AnnotationAwareAspectJAutoProxyCreator这个bean的时候,会判断type是否
//属于BeanFactoryAware,是的话会调用其setBeanFactory,将spring容器注入其中,代码如下
private void invokeAwareMethods(String beanName, Object bean) {
        ...
   if (bean instanceof BeanFactoryAware) {
((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
	}       
    ...

spring 中 AOP 始化过程

beanPostProcessor bean 也是bean ,初始化过程基本一致

1、传入配置类,创建是spring ioc容器

2、注册配置类,调用refresh,初始化单例bean

3、在refresh方法中,调用registerBeanPostProcessors,用于初始化后置处理器

  • 获取容器中所有需要创建的BeanPostProcessors的Defintion信息
  • AOP的definition信息由配置类的@EnableAspectAutoPorxy注解来注册
  • 定义BeanPostProcessor的优先级用于区分
    • 优先注册实现了PriorityOrderd接口的BeanPostProcessor
    • 其次注册实现了Orderd接口的BeanPostProcessor(AOP的BeanPostPorcessor实现了该接口)
    • 最后注册普通的BeanPostProcessor
  • 注册AnnotationAwareAspectJAutoProxyCreator到容器(Bean)(beanDefinition.beanName=internalAutoProxyCreator)
    • 创建bean对象
    • populateBean:给bean的属性赋值
    • initializeBean:初始化bean
      • invokeAwareMethods() 为相对应的Aware接口调用set方法赋值
      • applyBeanPostProcessorsBeforeInitalization() 应用后置处理器的初始化前处理方法
      • invokeInitMethods() 执行自定义的初始化方法
      • applyBeanPostProcessorsAfterInitalization() 应用后置处理器的初始化后处理方法
    • AnnotationAwareAspectJAutoProxyCreator bean 创建成功

4、将初始化好的后置处理器添加到spring容器(一级缓存、单例池)

spring 处理 AOP

未完待续

spring 声明式事务

准备工作

  • 开启@EnableTransactionManagement注解
  • 注册连接池
  • 注册TransactionManagement事务管理器(执行事务的回滚提交等操作)
  • serverice 上开启@Transaction注解
posted @ 2021-06-25 23:03  danaohu  阅读(114)  评论(0)    收藏  举报