Spring ( AOP )笔记

Aop

- 通知方法
- 前置通知 (@Before)
- 后置通知(@After)
- 返回通知(@AfterReturning)
- 异常通知(@AfterThrowing)
- 过程
- 首先建立被代理类和代理类
- 在代理类上标注@Aspect注解,然后在不同的通知方法上标注不同的通知注解
- 例@Before的参数填写被代理类中的方法引用(方法的权限定名)
- 除了在注解中写方法引用,还可以使用@PointCut注解,注解参数可以填写execution表达式作为value值,创建一个空方法体的方法,标注@PointCut,其他通知注解如果想使用这个切点表达式,将@PointCut标注的方法的方法名作为值填入即可,例@Before("pointCut()")
- execution表达式execution(<修饰符模式>?<返回类型模式><方法名模式>(<参数模式>)<异常模式>?),切点表达式中方法入参部分比较复杂,可以使用””和“…”通配符,其中“”表示任意类型的参数,而“…”表示任意类型参数且参数个数不限。
- 如果想在代理类中的代理方法中使用运行是被代理类的信息,可以在代理方法中填写JoinPoint类型的参数,注意一点,如果填写JoinPoint参数,这个参数必须是方法参数列表的第一个.
- 返回通知@AfterReturning除了可以写value参数,还可以有returning参数,如果标注了returning="result"参数,可以再方法参数填写Object result,随后在方法体内可以使用.
- 异常通知@AfterThrowing除了可以写value参数,还可以有throwing参数,如果标注了throwing="exception"参数,可以再方法参数填写Exception exception,如果发生异常,会调用并返回异常信息

AOP原理 (很乱,别看)

  • @EnableAspectJAutoProxy
    • 注解内部@Import(AspectJAutoProxyRegistrar.class):给容器导入AspectJAutoProxyRegistrar组件
    • AspectJAutoProxyRegistrar组件自定义给容器注入bean,AnnotationAwareAspectJAutoProxyCreator看一下这个bean的继承树
      F10s8f.png
    • 可以看到这个bean在底层实现了BeanPostProcessor(Bean创建前后做了什么)和BeanFactoryAware(如何创建),我们需要搞清楚这两个bean做了什么
    • 从Main开始的流程
      • 传入配置类,创建ioc容器
      • 注册配置类,调用refresh(),刷新容器
      • registerBeanPostProcessor(beanFactory);注册bean的后置处理器BeanPostProcessor方便拦截bean的创建
        • 先获取ioc容器已经定义了的需要创建对象的所有BeanPostProcessor
        • 给容器中注册别的BeanPostProcessor
        • 优先注册实现类PriorityOrderd接口的BeanPostProcessor
        • 再给容器注册实现了Ordered接口的BeanPostProcessor
        • 注册没有实现优先级接口的BeanPostProcessor
        • 所谓的注册,就是创建BeanPostProcessor对象,保存在容器中.
          • 创建bean的实例
          • populateBean 给bean赋值
          • 初始化bean
            • 处理Aware接口的回调
            • 调用初始化前的方法
            • 调用初始化方法
            • 调用初始化后的方法
          • BeanPostProcessor创建成功,
        • BeanPostProcessor注册到BeanFactory
        • 以上是创建后置处理器的过程,创建BeanPostProcessor的作用是,为以后创建bean提供后置处理器
      • 完成BeanFactory的初始化工作,创建剩下的单实例bean
        • 遍历容器内的bean,依次创建对象
        • 首先getBean从缓存中获取bean,如果存在,就不创建,否则再创建,只要创建好的bean,都会被缓存起来
        • 创建bean
          • 希望后置处理器能返回一个代理对象,如果不能返回,到下一步
          • 真正的创建一个bean实例
          • 后置处理器返回代理对象,

看不懂了,先不写了

Spring 事务

  • 配置数据源-配置类中的@Bean
  • 创建JdbcTemplate操作数据
  • 给需要添加事务的方法标注@Transactional表示当前方法是一个事务方法
  • 给配置类添加@EnableTransactionManagement开启事务管理功能
  • 在配置类中添加事务管理器来控制事务@Bean方法返回一个PlatformTransactionManage类型对象,一般是DataSourceTransactionManager

猜你喜欢

转载自blog.csdn.net/qq_36865108/article/details/84863722