1.连接点:AOP将接口方法和实现类中的方法统称为连接点(所有方法)
2.切入点:在未来,这些方法中会有共性点,我会将他挖走 的方法(仅有共性功能的方法)
3.通知:就是共性功能
4.切面:切入点 和 通知 之间的关系
5.目标对象:最终简化开发出来的代码的对象
6.织入:目标对象并不能运行,需要将之前挖走的共性方法再还回去的过程
7.代理:目标对象类变化得来的一个新的代理类的过程
8.引入:代理类可以自己开发自己的特性
切入点、通知、切面;需要我们在AOP中做
AOP开发过程
开发阶段(我们要完成的)
正常的制作程序
将非共性功能开发到对应的目标对象类中,并制作成切入点方法
将共性功能独立开发出来,制作成通知
在配置文件中,声明切入点
在配置文件中,声明切入点与通知间的关系,即:切面
运行阶段
Spring容器加载配置文件,监控所有配置的切入点方法的执行
当监控到切入点方法被运行,使用代理机制,动态创建目标对象的代理对象
根据通知类别,在代理对象的对应位置将同志对应的功能织入,完成完整的代码逻辑并运行
AOP随手案例
1.第一步:导入坐标
2.共性功能:save方法中的共性功能被挖走了
3.专门存放被挖走的共性功能
4.核心:让Spring知道AOP 先导入命名空间
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>
命令讲解
AOP注解操作
配置过程
1.配置坐标
2.开启AOP注解支持
在ApplicationContext.xml中
<aop: aspectj-autoproxy/>
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(){}
}
对比:
如果我连.xml中的bean注解也想去掉,那么使用:
配置bean
注意事项
AOP通知执行顺序
方法定义的顺序已经定死了,不管你在前定义还是后定义
注: 对方法名进行1、2的设置Advice1、Advice2可以区分执行顺序 对类名进行1、2的设置可以区分执行顺序 在类的上方书写@Order(1)可以先执行,@Order(2)后执行
AOP纯注解(就是使用Junit)
1.导入坐标
2.配置文件(不再使用.xml)SpringConfig
3.测试类