AOP是面向切面的编程。使用AOP的方式可以减少代码直接的耦合,后期维护起来较为方便。先看看最普通的Spring项目来配置AOP。
需要的Jar包
Spring
需要的Jar
:spring-core.xx.jar,spring-beans.xx.jar,spring-context.xx.jar,spring-context-support.xx.jar,spring-expression.xx.jar
AOP需要的包:spring-aop.xx.jar,spring-aspects.xx.jar,aopalliance.xx.jar,aspectjrt.jar,aspectjweaver.jar
XML方式
- 配置好通知类,Spring的基础内容
- 使用xml
<aop:config> <aop:aspect id="time" ref="timeHandler1"> <!-- 前置通知 --> <aop:before method="printStartTime" pointcut="execution(* com.xx.service.*.*(..))"/> <!-- 后置通知 --> <aop:after method="printEndTime" pointcut="execution(* com.xx.service.*.*(..))"/> </aop:aspect> </aop:config>
至此,切入成功。
注解方式
- 在XML中开启AOP的自动代理(SpringBoot中默认开启的)
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
- 在类上注解
@Aspect
表示切面 - 在方法上注释
@Before
或@After
表示前置/后置通知。@Before("AOP表达式")
定义切入点
@Before
和@After
中的表达式一样时,可以定义一个空的方法,作为切入点
@Asspect public LogHandler{ @PointCut("execution ...") public void pointTest(){} @Before("pointTest()") // @PointCut定义方法的名字 public void printStartTime(){ // ... } @After("pointTest()") public void printEndTime(){ // ... } }
环绕通知
@Aspect public class TimeHandler { @Around("execution(* com.xx.service.*.*(..))") public void aroundTime(ProceedingJoinPoint pjp) { System.out.println("环绕通知-->前"); try { // 业务逻辑通过proceed()方法执行,相当于嵌入到这来 pjp.proceed(); } catch (Throwable e) { e.printStackTrace(); } System.out.println("环绕通知-->后"); } }
来源:https://www.cnblogs.com/to-red/p/12013578.html