1、定义
AOP是面向切面编程,是对面向编程的一种补充。
将各个对象之间的相同处提取出来,并且做统一管理,将这一部分与业务\逻辑代码分离,提高代码的阅读性、扩展性。
2、使用
首先要引用Spring-Aspect
切面方法使用@Aspect
在配置xml中开启自动扫包
在配置xml中开启自动生成代理,扫描@Aspect注解的方法
切面对象只能跟一个实现类生成代理,有多个的话会报错
3、代码实现
此处先用注解的方式实现面向切面编程,只需要在引用的方法上加上注解即可,不需要配指定目录扫描,两种方式各有优劣。
3.1 新建注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Aspt {
}
新建一个注解,名字叫Aspt,@Tatget选择这个注解的作用域,我这边选的是METHOD,也就是说只能加在方法上,然后@Retention选择生命周期,这边选的是RUNTIME.
3.2 编写对应的切面类
@Aspect
@Component
public class CommonAspect {
// 定义切面作用范围
@Pointcut("@annotation(Aspt)")
public void commonAspectCut(){
}
@Before("commonAspectCut()")
public void before(JoinPoint joinPoint){
System.out.println("before running" + LocalDateTime.now());
}
@Around("commonAspectCut()")
public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("around before cut" + LocalDateTime.now());
proceedingJoinPoint.proceed();
System.out.println("around after cut" + LocalDateTime.now());
}
@After("commonAspectCut()")
public void after(JoinPoint joinPoint){
System.out.println("after running" + LocalDateTime.now());
}
@AfterReturning("commonAspectCut()")
public void AfterReturning(JoinPoint joinPoint){
System.out.println("after returning" + LocalDateTime.now());
}
}
新建一个类,然后@Pointcut里选择刚刚我们新建的注解,里面的表达式可以配置很多种,这边用的是@annotation,表示引用这个注解的方法,就会走进这个切面类中。
下面是切面类中五种切点的定义:
@Before
目标方法调用之前执行。
@Around
目标方法执行时候执行。
@After
目标方法调用之后执行,包括返回和抛出异常之后。
@AfterReturning
目标方法返回之后执行。
@AfterThrowing
目标方法抛出异常之后执行。
3.3 目标方法类
@Service
public class CommonConnectServiceImpl implements CommonConnectService {
@Aspt
@Override
public void simpleExample() {
int a = 10;
int b = 20;
int c = a * b;
System.out.println(c);
}
@Async
@Override
public void asyncTest(Integer i) {
for (int j=0;j<10;j++) {
System.out.println(i*10 + j);
}
}
}
新建一个service类,新建个测试方法并加上定义的切面注解,然后调用此方法,发现控制台打印
一个简单的面向切面编程例子就完成了。