1.基本概念
切面:
在原有的方法里添加一些新代码,对原有的方法代码进行一次增强处理,而那些增强部分的代码就被称为切面。
切入点:
要对哪些类中的哪些方法进行增强,进行切割,指的是被增强的方法。
连接点:
知道要切哪些方法后,剩下的就算什么时候切,在原方法的哪一个阶段加入增加代码,这个就算连接点。如方法调用前,方法调用后。
通知:
通知被增强的方法该如何被增强,定义切面的具体实现。
目标对象:
被一个或多个切面所通知的对象就算目标对象。
AOP代理对象:
该对象是目标对象的代理对象,代理对象在目标对象的基础上,在相应的连接点调用通知。
织入:
将切面切入到目标方法中,使得目标方法得到增强的过程称为织入。
2.依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.4</version>
</dependency>
3.定义注解类
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SysLog {
String value() default "";
}
4.定义切面类
@Aspect
@Component
public class SysLogAspect {
@Autowired
private SysLogService sysLogService;
//定义切入点
@Pointcut("@annotation(com.example.myaspect.SysLog)")
public void logPointCut(){
}
//定义通知
@Around("logPointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
Object result = point.proceed();
System.out.println("增加方法");
return result;
}
}
5.测试
@Service
public class DemoService {
@SysLog(value = "test")
public void test(){
System.out.println("执行了test方法");
}
}
@RunWith(SpringRunner.class)
@SpringBootTest
public class MyaspectApplicationTests {
@Autowired
private DemoService demoService;
@Test
public void contextLoads() {
demoService.test();
}
}