spring注解开发-Aop 及其事务 常用注解

编写流程

编写逻辑

  1. 导入aop模块 :Spring AOP(spring-aspects)
  2. 定义一个业务逻辑类 A
  3. 定义一个切面类 B ;切面类里面的方法需要动态感知业务逻辑类
    通知方法:
    1. 前置通知(@Before) 在目标方法执行之前执行
    2. 后置通知 (@After) 在目标方法运行结束之后运行(无论方法是否正常结束)
    3. 返回通知 (@AfterReturning)在目标方法正常返回之后运行
    4. 异常通知 (@AfterThrowing) 在目标方法出现异常之后执行
    5. 环绕通知(@Around) 动态代理,手动推进目标方法的执行(joinPoint.procced())
  4. 给切面类的目标方法标注何时何地的运行
  5. 将切面类和业务逻辑类都加入到容器中
  6. 给切面类上加注解@Aspect 告诉容器此类是切面类
  7. 给配置类中加@EnableAspectJAutoProxy

总结 分三步

  1. 将业务逻辑组件和切面类都加入到容器中 ;告诉Spring那个是切面类(@Aspect)
  2. 在切面类的每一个通知方法上标注通知注解,告诉Spring何时何地运行(切入点表达式)
  3. 在配置类上开启基于注解的aop模式

SpringAop原理

  1. @EnableAspectJAutoProxy

    • @EnableAspectJAutoProxy 通过@Import(AspectJAutoProxyRegistrar.class)给spring容器中导入了一个AnnotationAwareAspectJAutoProxyCreator。
    • AnnotationAwareAspectJAutoProxyCreator实现了InstantiationAwareBeanPostProcessor,InstantiationAwareBeanPostProcessor是一个BeanPostProcessor。它可以拦截spring的Bean初始化(Initialization)前后和实例化(Initialization)前后。
  2. AnnotationAwareAspectJAutoProxyCreator的postProcessBeforeInstantiation(bean实例化前):会通过调用isInfrastructureClass(beanClass)来判断 被拦截的类是否是基础类型的Advice、PointCut、Advisor、AopInfrastructureBean,或者是否是切面(@Aspect),若是则放入adviseBean集合。这里主要是用来处理我们的切面类。
  3. AnnotationAwareAspectJAutoProxyCreator的BeanPostProcessorsAfterInitialization(bean初始化后):

    1. 首先找到被拦截的Bean的匹配的增强器(通知方法),这里有切入点表达式匹配的逻辑
    2. 将增强器保存到proxyFactory中,
    3. 根据被拦截的Bean是否实现了接口,spring自动决定使用JdkDynamicAopProxy还是ObjenesisCglibAopProxy
    4. 最后返回被拦截的Bean的代理对象,注册到spring容器中
  4. 代理Bean的目标方法执行过程:CglibAopProxy.intercept();

    1. 保存所有的增强器,并处理转换为一个拦截器链
    2. 如果没有拦截器链,就直接执行目标方法
    3. 如果有拦截器链,就将目标方法,拦截器链等信息传入并创建CglibMethodInvocation对象,并调用proceed()方法获取返回值。proceed方法内部会依次执行拦截器链。

声明式事务

编写逻辑

  1. 创建数据源
  2. 使用处理数据库的工具 这里使用的是Spring自带的JdbcTemplate
  3. 配置事务管理器
  4. 开启事务 在配置类上使用@EnableTransactionManagement注解
  5. 编写Sql语句
  6. 在Sql对应的方法上加上@Transactional 注解 来为该方法加上事务

声明式事务实现原理

  1. @EnableTransactionManagement利用TransactionManagementConfigurationSelector给spring容器中导入两个组件:AutoProxyRegistrar和ProxyTransactionManagementConfiguration
  2. AutoProxyRegistrar给spring容器中注册一个InfrastructureAdvisorAutoProxyCreator,InfrastructureAdvisorAutoProxyCreator实现了InstantiationAwareBeanPostProcessor,InstantiationAwareBeanPostProcessor是一个BeanPostProcessor。它可以拦截spring的Bean初始化(Initialization)前后和实例化(Initialization)前后。利用后置处理器机制在被拦截的bean创建以后包装该bean并返回一个代理对象代理对象执行方法利用拦截器链进行调用(同springAop的原理)
  3. ProxyTransactionManagementConfiguration:是一个spring的配置类,它为spring容器注册了一个BeanFactoryTransactionAttributeSourceAdvisor,是一个事务事务增强器。它有两个重要的字段:AnnotationTransactionAttributeSource和TransactionInterceptor。

    1. AnnotationTransactionAttributeSource:用于解析事务注解的相关信息
    2. TransactionInterceptor:事务拦截器,在事务方法执行时,都会调用TransactionInterceptor的invoke->invokeWithinTransaction方法,这里面通过配置的PlatformTransactionManager控制着事务的提交和回滚。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值