zoukankan      html  css  js  c++  java
  • Spring之AOP

     Spring AOP介绍

     本质上就是反射,动态代理

     必须要有接口,如果没有接口,不能使用,这种方式使用jdk提供的reflect包下的类

     但是在生产环境中不能保证每个类都有实现的接口,所以有第二种cglib

     cglib在实现的时候有没有接口都无所谓

     核心概念及术语

     

      模型

     

      AOP通知类型

    开启包的扫描

    开启aop的注解功能

    cglib早期比动态代理快,现在二者速度差不多

    两种通配符

    * 匹配方法

    • 匹配一个或者多个字符
    • 只能匹配一层路径,不能匹配多个路径
    • 不能够匹配访问修饰符
    • 返回值可以用*来代替

    . 匹配参数

    代替所有

    execution(**(..))
    execution(* com..*(..))

    在使用表达式的时候,支持逻辑运算, && || !,

    execution(public int com.test.service.MyCalculator.*(..) && execution(* *(..)))
    execution(public int com.test.service.MyCalculator.*(..) || execution(* *(..)))
    !execution(public int com.test.service.MyCalculator.add(..))

    通知方法在定义的时候有没有特殊的要求

    通知方法在定义的时候对于方法内修饰符,返回值类型都没有明确要求

    但要注意,参数不能随便添加

    多个匹配的表达式相同,能否做抽象

    定义一个无返回值的空方法,给该方法添加@PointCut注解,后续使用可以直接调用方法名称

    此处方法只起一个声明作用,能够提供内部其他方法进行调用

    环绕通知在执行的时候是优先于普通通知的

    如果是正常结束,顺序是:

    • 环绕前置通知
    • @Before
    • 环绕后置通知
    • 环绕返回通知
    • @After
    • @AfterReturning

    如果是异常结束,顺序是:

    • 环绕前置通知
    • @Before
    • 环绕异常通知
    • 环绕返回通知
    • @After
    • @AfterThrowing

    应用程序中包含多个切面类的时候,决定的执行顺序

    按照切面类的名称的首字母进行排序操作,按照字典序,可以在切面类添加@Order注解

    同时可添加具体的值,值越小越优先

    XML方式

    beans从官方文档里面粘贴

    <bean id="logUtil" class="com.test.util.logUtil"></bean>
    <bean id="securityUtil" class="com.test.util.securityUtil"></bean>
    <bean id="myCalculator" class="com.test.service.myCalculator"></bean>
    <aop:config>
        <aop:aspect ref="logUtil">
            <aop:before method="start" pointcut="execution(Integer com.test.service.myCalculator.*(..))"></aop:before>
            <aop:after></aop:after>
        </aop:aspect> 
    </aop:config>

    声明式事务的简单配置

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!--配置事务管理器的bean对象-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.dataSourceTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!--开启基于注解的事务管理器的配置-->
    <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
    public class BookService{
    
        @Autowired
        private BookDao bookDao;
    
        @Transactional
        public void buyBook(){
            bookDao.getPrice(1);
            bookDao.updateBalance("张三", 100);
            bookDao.updateBalance(1);
        }
    }

    propagation:传播特性,表示不同的事务之间执行的关系

    isolation:隔离级别,4种隔离级别,会引发不同的错乱问题

    • timeout:超时时间,表示事务需要花费的时间是多久
    • readonly:只读事务,如果配置了只读事务,那么在事务运行期间,不允许对数据进行修改,否则抛出异常
    • noRollBackfor:设置不回滚的异常
    • noRollbackForClassName:设置回滚的异常
    • rollBackfor
    • rollbackForClassName

    设置超时时间

    @Transactional(timeout = 4),超时时间4s

    设置不回滚的异常

    @Transactional(noRollbackFor = {ArithmeticExcepton.class})

    @Transactional(noRollbackFor = {"java.lang.ArithmeticExcepton"})

    设置回滚的异常

    @Transactional(RollbackFor = {FileNotfoundExcepton.class})

    @Transactional(rollbackForClassName = {"java.io.FileNotFoundException"}) 

    隔离级别

    @Transactional(isolation = Isolation.DEFAULT)

    @Transactional(isolation = Isolation.READ_COMMITTED)

    @Transactional(isolation = Isolation.REPEATABLE_READ)

    @Transactional(isolation = Isolation.SERIALIZABLE)

    事务的传播特性

    @Transactional(propagation = Propagation.REQUIRED)

    @Transactional(propagation = Propagation.REQUIRED_NEW)

    @Transactional(propagation = Propagation.SUPPORTS)

    @Transactional(propagation = Propagation.NOT_SUPPORTS)

    @Transactional(propagation = Propagation.MANDATORY)

    @Transactional(propagation = Propagation.NEVER)

    @Transactional(propagation = Propagation.NESTED)

     REQUIRED,REQUIRES_NEW,NESTED问的比较多,REQUIRES_NEW用的多

     总结

    论读书
    睁开眼,书在面前
    闭上眼,书在心里
  • 相关阅读:
    SqlServer触发器的创建与使用
    SqlServer存储过程的创建与使用
    SqlServer视图的创建与使用
    U盘重装系统:手把手教你怎么使用U盘重装系统、清除登录密码
    附034.Kubernetes_v1.21.0高可用部署架构二
    附032.Kubernetes实现蓝绿发布
    CKS考试心得分享
    001.IT运维面试问题-Linux基础
    附031.Kubernetes_v1.20.4高可用部署架构二
    深入Netty逻辑架构,从Reactor线程模型开始
  • 原文地址:https://www.cnblogs.com/YC-L/p/14233334.html
Copyright © 2011-2022 走看看