AOP的使用
aop:面向切面编程(底层就是动态代理)是指程序在运行期间,将某段代码切入到某个位置运行的编程方式
我们还是先看如何使用:
@EnableAspectJAutoProxy
@Configuration
public class MainConfig {
@Bean
public Calculator calculator() {
return new Calculator();
}
@Bean
public LogAspects logAspects() {
return new LogAspects();
}
}
在POM.XML中导入spring-aspects依赖包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.0.6.RELEASE</version>
</dependency>
新建立一个业务逻辑类Calculator.java
public class Calculator {
public int div(int i, int j) {
return i / j;
}
}
新建一个日志切面类.
@Aspect
public class LogAspects {
@Pointcut(value = " execution(public int com.enjoy.cap10.aop.Calculator.*(..))")
public void pointCut() {
}
;
@Before("pointCut()")
public void logStart(JoinPoint joinPoint) {
System.out.println(joinPoint.getSignature().getName() + "除法运行....参数列表是:{" + Arrays.asList(joinPoint.getArgs()) + "}");
}
@After("pointCut()")
public void logEnd(JoinPoint joinPoint) {
System.out.println(joinPoint.getSignature().getName() + "除法结束......");
}
@AfterReturning(value = "pointCut()", returning = "result")
public void logReturn(Object result) {
System.out.println("除法正常返回......运行结果是:{" + result + "}");
}
@AfterThrowing(value = "pointCut()", throwing = "exception")
public void logException(Exception exception) {
System.out.println("运行异常......异常信息是:{" + exception + "}");
}
@Around("pointCut()")
public Object Around(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("@Arount:执行目标方法之前...");
Object obj = joinPoint.proceed();//相当于开始调div地
System.out.println("@Arount:执行目标方法之后...");
return obj;
}
}
日志切面类的方法需要动态感知到div()方法运行到哪里了, 然后再执行, 如果除法开始, 就日志开始方法, 也叫通知方法, 分以下几种:
-
前置通知: logStart(),在目标方法(div)运行之前运行 (@Before)
-
后置通知:logEnd(), 在目标方法(div)运行结束之后运行,无论正常或异常结束 (@After)
-
返回通知:logReturn, 在目标方法(div)正常返回之后运行 (@AfterReturning)
-
异常通知:logException, 在目标方法(div)出现异常后运行(@AfterThrowing)
-
环绕通知:以上没写,动态代理, 手动执行目标方法运行joinPoint.procced(),最底层通知,手动指定执行目标方法(@Around), 执行之前相当于前置通知, 执行之后相当于返回通知
其实就是通过反射执行目标对象的连接点处的方法;
源码分析
实在懒得打字了,把额哦整理的xmind贴出来的吧
