编程中将重复代码提取出来,如果直接调用重复代码,会出现耦合度情况,为了减少类间耦合,但在需要的时候可以加入代码,可以用aop来实现.
官方定义:在运行时,动态的将代码切入到类的指定方法、指定位置上的变成思想就是面向切面编程。
aop 实现了动态的执行一段代码,且这段代码随意改变,不用遍历所有原有代码,改变原有代码。
与动态配置文件的作用进行比较:动态配置文件,可以在运行的时候动态配置参数,参数抽取出来,随时更改配置;aop,将重复代码提取出来,让框架注入给需要的文件,或者可以在不改动原有代码时,添加一段代码插入到很多文件。整合控制很多文件,避免重复代码,以及类间耦合。
使用场景示例:定义了很多抽象类,每个抽象类有A,B两个类继承,可以使用aop,在调用抽象类之前给进程设置选择哪个子类。
使用:
要插入的代码:切面(aspect)
@Aspect //标注为切面,要插入的代码块
@Component //标注此类为bean
public class LoggingAspect {
// execution(执行方法指定) before 为方法前,after为方法后,around为前后都执行
@PointCut("execution(public * com.service.*(..))")
public void judgeSwitch(){}
// 在judgeSwitch()方法前执行
@Before("judgeSwitch()")
public void doAccessCheck() {
System.err.println("[Before] do access check...");
}
// 在judgeSwitch()方法前后都执行
@Around("judgeSwitch()")
public Object doLogging(JoinPoint jp) throws Throwable {
Signature signature = jp.getSignature();
}
}
在使用的类上标注@EnableAspectJAutoProxy。即可标注在这个类之前,spring框架会先找是否有切面要注入进去。
aop除了@EnableAspectJAutoProxy注解,常用的是自定义一个注解,然后在aspect中execution后面写自定义注解名,此时在使用自定义注解的地方即可调用aop切面。