码迷,mamicode.com
首页 > 编程语言 > 详细

Spring AOP

时间:2021-01-28 12:05:29      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:sys   面向切面编程   out   spring容器   步骤   抽取   动作   完整   catch   

AOP
    作用: 可以帮助你抽取共性内容, 简化我们书写, 增强我们的简单类!!!!!
    概念: 面向切面编程(横向开发) OOP: 面向对象编程(竖向开发)
    专业名词
        连接点
            指我们所有的方法
        切入点
            那些想要被增强的方法
            切入点表达式
                完整写法
                    execution(修饰符 返回值类型 包名.类名.方法名(参数类型))
                    *
                        匹配任意字符或者任意类型
                    ..
                        匹配任意个个数或者层级
                    例如
                        execution(* cn..User*.*(..))
                        匹配, 任何返回值,  在cn下就行轮层级, 必须User开头的类, 方法名任意,参数个数任意, 参数类型也任意
        通知
            我们共性内容存放的地方
        切面
            来描述我们"通知"和"切入点"的关系
        织入
            将共性方法还原到切入点的动作
        通知类型(织入类型)
            前置增强
                before
                    织入在原有逻辑之前
            后置增强
                after
                    织入在原有逻辑之后, 即使原有逻辑出现了异常也会执行!!!
            后置返回结果增强
                after-returning
                    只有原有逻辑正常执行完毕后才会增强
            后置出现异常增强
                after-throwing
                    只有原有逻辑出现异常才会增强
            环绕增强
                around
                    包含以上四种的所有特性
    xml方式
        AOP使用步骤
            1.将你所有bean放入spring容器中
            2.需要在配置文件中引入aop标签
                xmlns:aop="http://www.springframework.org/schema/aop"
                http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
            3.需要配置aop, 主要配置"切面"
                   <aop:config>
        <!--
            配置切入点:
            * : 匹配任意内容, 或者任意单个类型
            ..: 匹配任意个数, 如果在包那一块, 任意包不论层级, 如果参数部分, 代表任何个数参数, 类型不限定

         -->
        <aop:pointcut id="pt" expression="execution( * cn..service.UserService.*Update(..))"/>
        <!-- 通过切面将 "切入点" 和 "通知" 整合在一起 -->
        <aop:aspect ref="adivice">
            <!-- 增强类型-->
            <aop:before method="startTraction" pointcut-ref="pt"/>
            <!--  after-returning,只有在方法正常执行完毕后才会执行 -->
            <aop:after-returning method="commit" pointcut-ref="pt"/>
            <!-- after-throwing 出现异常之后才会走 -->
            <aop:after-throwing method="rollBack" pointcut-ref="pt"/>
          
            <aop:around method="manageTransaction" pointcut-ref="pt"/>

        </aop:aspect>
    </aop:config>
        细节问题
            在"通知"中获取"切入点"的参数
                在"通知"中的方法中额外定义一个参数JoinPoint joinPoint
                    joinPoint.getArgs();可以获取所有的原来的参数们
                特点: 每种织入类型都能够拿到参数
            在"通知"中获取"切入点"的返回值
                特点: 只有after-returning和around可以拿到
                after-returning
                    可以 在我们"通知"的方法中额外定义一个参数用来接受返回值 Object result
                          //提交事务
    public void commit(Object result){// after -returning
        System.out.println("提交事务");
    }
                    需要在配置文件中使用 returning的指向我们"通知"的方法中的参数名, 名字要对应
                         <aop:after-returning method="commit" pointcut-ref="pt" returning="result"/>
                around
                    同上
            在"通知"中获取"切入点"的异常
                特点: 只有around 和after-throwing
                after-throwing
                    可以 在我们"通知"的方法中额外定义一个参数用来接受返回值 Throw e
                            public void startTraction(Throwable e){// before

        System.out.println("开启事务");
    }
                    需要在配置文件中使用throwing的指向我们"通知"的方法中的参数名, 名字要对应
                        <aop:after-throwing method="startTraction" pointcut-ref="pt" throwing="e"/>
                around
                    可以直接拿到异常, 直接try,catch包裹一样, 在自己catch里面即可拿到
    注解方式
        AOP使用步骤
            1.需要定义"通知类", 在通知类中添加@Aspect,代表切面
            2.编写切点表达式
                局部
                    @Before("execution(切点表达式)")
                全局
                    需要定义一个方法, 这个方法无参无返回值, 需要@PointCut(execution(切点表达式))
                    需要引入切点表达式
                        @Before("切点表达式所在的方法名()")
            细节问题
                同xml方式
            需要在主配置中加入扫描AOP的东西
                   <!-- 扫描跟component有关的这些注解 -->
    <context:component-scan base-package="cn.itcast"/>
   <!-- 扫描跟aop有关的注解 -->
    <aop:aspectj-autoproxy/>
                在配置类中使用纯注解开启aop的解析
                    @EnableAspectJAutoProxy

Spring AOP

标签:sys   面向切面编程   out   spring容器   步骤   抽取   动作   完整   catch   

原文地址:https://www.cnblogs.com/zhenyuantian/p/14337085.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!