关于AOP中相关知识理解

一:基础知识

1.AOP:是一种思想,是面向切面编程,其中spring基于AOP的思想提供了一定的实现,其底层原理是动态代理:在不改动源代码的情况下,对目标对象的方法进行功能增强。基础应用:过滤器,拦截器,异常处理器以及事务等等

2.其中的专业术语:(用更简单易懂的语言)

1、连接点
    类中可以被进行功能增强的方法。即 可以被AOP控制的方法
2、增强/通知
    补充了原始方法没有的功能的代码。即 指哪些重复的逻辑,也就是共性功能
3、切入点
    真正被增强了功能的连接点
    匹配连接点的条件,通知仅会在切入点方法执行时被应用
4、切面
    切入点 + 通知 结合在一起
    描述通知与切入点的对应关系(通知+切入点)
5、目标对象
    真正增强了功能的方法所在的对象
6、代理对象
    由Spring在程序运行期间生成的对象

二:2、AOP进阶
    1、通知类型
        执行顺序 2,但是只能执行一个
        1、环绕通知
            1、是需要手动调用目标方法,且必须定义返回值的
            2、环绕通知可以在方法执行的任何时刻增强功能
                1、方法开始前
                2、方法正常结束后
                3、方法出异常
                4、方法执行完了
                
        2、前置通知
            在方法开始前执行
                执行顺序 1
        3、后置通知
            在方法执行后执行,无论方法是否正常执行,都会执行
                执行顺序 3
        4、返回通知
            在方法正常结束后执行
        5、异常通知
            在方法出异常时执行
    2、切面执行顺序
        默认:按类名字母排序
        手动指定执行顺序
            @Order(执行顺序的值)
                执行值,是一个正整数,值越小,优先级越高。默认值 int 的最大值
            
    3、切点表达式
        1、execution
            完整语法
                execution(访问修饰符?  返回值  包名.类名.方法名(方法参数) throws 异常?)
                其中带 ? 的表示可以省略的部分
                    访问修饰符:可省略(比如: public、protected)
                    throws 异常:可省略(注意是方法上声明抛出的异常,不是实际抛出的异常)
            最终版语法
                execution(  返回值  包名.类名.方法名(方法参数) )
            通配符
                * :单个独立的任意符号,可以通配任意返回值、包名、类名、方法名、任意类型的一个参数,也可以通配包、类、方法名的一部分
                .. :多个连续的任意符号,可以通配任意层级的包,或任意类型、任意个数的参数
            案例
                切业务层所有的方法
                    execution(  *  com..service.impl.*.*(..) )
                切控制层中所有的add方法
                    execution(  *  com..controller.*.add(..) )
                切Mapper层中返回值为int类型的方法
                    execution(  int  com..mapper.*.*(..) )
                切所有方法名为update,且参数为Emp的类型
                    execution( * ..*.update(com.itheima.pojo.Emp) )
                切业务层两个int类型的方法
                    execution(  *  com..service.impl.*.*(int, int) )
                切Mapper所有增删改方法
                    切入点没办法配符了,那就切全部,然后再通知中去通过方法信息进行过滤
                    使用注解


        2、@annotation
            1、需求
                切Mapper层所有增删改方法
                为Mapper层的增删改方法做增强
            2、如何实现
                1、自定义一个注解
                    MyLog
                        
                2、在Mapper层所有的增删改方法上打自定义注解MyLog
                    
                3、切点表达式指定使用哪个注解
                    
                
    4、连接点
        1、需求
            在通知中获取连接点的信息
        2、只需要在通知对应的方法的第一个参数定义JoinPoint即可
            通过JoinPoint就可以获取到切入点的详细信息,如类名,方法名,方法参数等等
        3、图示
            

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值