Spring之AOP

97 阅读3分钟

1.连接点:AOP将接口方法和实现类中的方法统称为连接点(所有方法)

2.切入点:在未来,这些方法中会有共性点,我会将他挖走 的方法(仅有共性功能的方法)

3.通知:就是共性功能

4.切面:切入点 和 通知 之间的关系

5.目标对象:最终简化开发出来的代码的对象

6.织入:目标对象并不能运行,需要将之前挖走的共性方法再还回去的过程

7.代理:目标对象类变化得来的一个新的代理类的过程

8.引入:代理类可以自己开发自己的特性

切入点、通知、切面;需要我们在AOP中做

AOP开发过程

开发阶段(我们要完成的)

正常的制作程序
将非共性功能开发到对应的目标对象类中,并制作成切入点方法
将共性功能独立开发出来,制作成通知
在配置文件中,声明切入点
在配置文件中,声明切入点与通知间的关系,即:切面

运行阶段

Spring容器加载配置文件,监控所有配置的切入点方法的执行
当监控到切入点方法被运行,使用代理机制,动态创建目标对象的代理对象
根据通知类别,在代理对象的对应位置将同志对应的功能织入,完成完整的代码逻辑并运行

AOP随手案例

图片.png

1.第一步:导入坐标 图片.png

2.共性功能:save方法中的共性功能被挖走了 图片.png

图片.png

3.专门存放被挖走的共性功能

图片.png

4.核心:让Spring知道AOP 先导入命名空间

图片.png

1.配置共性功能成为spring的bean,这个是存储共性功能的文件夹
<bean id = "myAdvice" class = "com.itheima.aop.AOPAdvice"/>

2.开启AOP命名空间
<bean id = "userService" class="...UserServiceImpl"/>

3.配置AOP
<aop:config>
    4.切入点
        <aop:pointcut id = "pt" expresssion="execution(* *..*(..))" />

    5.切面(切入点与通知的关系)
    <aop:aspect ref="myAdvice">   我要绑定对应的类(通知)
    
    
    在该功能的前方挖的东西,切入点的位置
    
    method:来自于存储共性功能中文件的具体哪一个方法名
    
    参照pt的切入点
    6.
        <aop:before method="function" pointcut-ref="pt"/> 切入点
        
        
    </aop:aspect>
</aop:config>

命令讲解

图片.png

图片.png

AOP注解操作

图片.png


图片.png

配置过程

图片.png

1.配置坐标

图片.png

2.开启AOP注解支持 在ApplicationContext.xml中 <aop: aspectj-autoproxy/>

图片.png

3.在通知中配 在AOPAdvice(专门存放共有属性的)

@Aspect
public class AOPAdvice{
    @Pointcut("execution(* *..*(..))")
    public void pt(){}
    
    @Before("pt()")
    public void before(){前置通知}
    
    @After("pt()")
    public void after(){后置通知}
    
    @AfterReturing("pt()")
    public void afterReturing(){}
    
    
    @AfterThrowing("pt()")
    public void afterThrowing(){}
    
    @Around("pt()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable(){}
}

对比:

图片.png

如果我连.xml中的bean注解也想去掉,那么使用:

图片.png

图片.png

配置bean

图片.png

图片.png

注意事项

图片.png

AOP通知执行顺序

方法定义的顺序已经定死了,不管你在前定义还是后定义 图片.png

注: 对方法名进行1、2的设置Advice1、Advice2可以区分执行顺序 对类名进行1、2的设置可以区分执行顺序 在类的上方书写@Order(1)可以先执行,@Order(2)后执行

图片.png

图片.png

AOP纯注解(就是使用Junit)

图片.png

1.导入坐标

图片.png

2.配置文件(不再使用.xml)SpringConfig

图片.png

3.测试类

图片.png