springAOP的使用:
需要进行方法增强的类:
public class Log {
//业务逻辑方法
public int log(int i, int j) {
System.out.println("业务逻辑方法-----------------");
return i / j;
}
}
新建我们的切面类:
//日志切面类
@Aspect
public class LogAspects {
/**
* pointCut :指定要增强的方法
*/
@Pointcut("execution(public int com.enjoy.cap10.aop.Log.*(..))")
public void pointCut(){}
//执行业务逻辑方法前,要执行的方法
@Before("pointCut()")
public void logStart(JoinPoint joinPoint){
System.out.println("除法运行之前...参数是:{"+ 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 logThrow(Exception exception){
System.out.print("除法运行异常...异常原因是:{"+exception+"}");
}
//环绕通知
@Around("pointCut()")
public Object around(ProceedingJoinPoint proceedingJoinPoint){
System.out.println("执行@Around目标方法之前....");
Object proceed = null;
try {
proceed = proceedingJoinPoint.proceed();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
System.out.println("执行@Around目标方法之后....");
return proceed;
}
}
在这里插入代码片
配置我们的配置类,主要是把我们的切面类和日之类交给spring容器进行管理:
@Configuration
@EnableAspectJAutoProxy
public class Cap10MainConfig {
@Bean
public Log log(){
return new Log();
}
@Bean
public LogAspects logAspects(){
return new LogAspects();
}
}
引入我们的测试类:
public class Cap10Test {
@Test
public void Test(){
AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(Cap10MainConfig.class);
Log log = (Log) app.getBean("log");
log.log(3,4);
app.close();
}
}
最后的测试结果:
"C:\Program Files\Java\jdk1.8.0_202\bin\java.exe" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:E:\javaSoft\idea\IntelliJ IDEA 2018.3.2\lib\idea_rt.jar=59999:E:\javaSoft\idea\IntelliJ IDEA 2018.3.2\bin" -Dfile.encoding=UTF-8 -classpath "E:\javaSoft\idea\IntelliJ IDEA 2018.3.2\lib\idea_rt.jar;E:\javaSoft\idea\IntelliJ IDEA 2018.3.2\plugins\junit\lib\junit-rt.jar;E:\javaSoft\idea\IntelliJ IDEA 2018.3.2\plugins\junit\lib\junit5-rt.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\rt.jar;F:\code\springPractice\target\test-classes;F:\code\springPractice\target\classes;E:\javaSoft\repository\org\springframework\spring-context\5.0.6.RELEASE\spring-context-5.0.6.RELEASE.jar;E:\javaSoft\repository\org\springframework\spring-aop\5.0.6.RELEASE\spring-aop-5.0.6.RELEASE.jar;E:\javaSoft\repository\org\springframework\spring-beans\5.0.6.RELEASE\spring-beans-5.0.6.RELEASE.jar;E:\javaSoft\repository\org\springframework\spring-core\5.0.6.RELEASE\spring-core-5.0.6.RELEASE.jar;E:\javaSoft\repository\org\springframework\spring-jcl\5.0.6.RELEASE\spring-jcl-5.0.6.RELEASE.jar;E:\javaSoft\repository\org\springframework\spring-expression\5.0.6.RELEASE\spring-expression-5.0.6.RELEASE.jar;E:\javaSoft\repository\org\springframework\spring-aspects\5.0.6.RELEASE\spring-aspects-5.0.6.RELEASE.jar;E:\javaSoft\repository\org\aspectj\aspectjweaver\1.8.13\aspectjweaver-1.8.13.jar;E:\javaSoft\repository\junit\junit\4.12\junit-4.12.jar;E:\javaSoft\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar" com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit4 com.enjoy.test.Cap10Test,Test
四月 27, 2020 8:28:01 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@12bc6874: startup date [Mon Apr 27 20:28:01 CST 2020]; root of context hierarchy
执行@Around目标方法之前....
除法运行之前...参数是:{[3, 4]}
业务逻辑方法-----------------
执行@Around目标方法之后....
log 除法运行结束...
除法正常运行结束...返回结果是:{0}
四月 27, 2020 8:28:02 下午 org.springframework.context.support.AbstractApplicationContext doClose
信息: Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@12bc6874: startup date [Mon Apr 27 20:28:01 CST 2020]; root of context hierarchy
Process finished with exit code 0
几个重要的注解的解释:
@Aspect 表示为切面类,告诉spring容器我这个类是切面类
@EnableAspectJAutoProxy 开启基于注解的AOP模式
@Pointcut:指定我们要进行增强的方法
JoinPoint 可以获取到我们方法的一些信息,参数,方法名…
环绕通知方法中,需要我们传入参数ProceedingJoinPoint,必须我们手动执行
proceedingJoinPoint.proceed()方法,返回值为我们的方法返回值
需要注意的地方:
我们声明的切面类和我们要增强的类,都必须注入到spring容器中