AspectJ.java
package aspectj.annotation;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class MyAspect {
@Pointcut("execution(* aspectj.dao.*.*(..))")
private void myPointCut() {
}
@Before("myPointCut()")
public void before(JoinPoint jp) {
System.out.print("前置通知:模拟权限控制");
System.out.println(",目标类对象:" + jp.getTarget()
+ ",被增强处理的方法:" + jp.getSignature().getName());
}
@AfterReturning("myPointCut()")
public void afterReturning(JoinPoint jp) {
System.out.print("后置返回通知:" + "模拟删除临时文件");
System.out.println(",被增强处理的方法:" + jp.getSignature().getName());
}
@Around("myPointCut()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("环绕开始:执行目标方法前,模拟开启事务");
Object obj = pjp.proceed();
System.out.println("环绕结束:执行目标方法后,模拟关闭事务");
return obj;
}
@AfterThrowing(value = "myPointCut()", throwing = "e")
public void except(Throwable e) {
System.out.println("异常通知:" + "程序执行异常" + e.getMessage());
}
@After("myPointCut()")
public void after() {
System.out.println("最终通知:模拟释放资源");
}
}
程序的主入口运行文件
package aspectj.config;
import aspectj.dao.TestDao;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class AOPTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext appCon =
new AnnotationConfigApplicationContext(AspectjAOPConfig.class);
TestDao testDaoAdvice = appCon.getBean(TestDao.class);
System.out.println("========程序开始执行========");
testDaoAdvice.save();
System.out.println("================");
testDaoAdvice.modify();
System.out.println("================");
testDaoAdvice.delete();
appCon.close();
}
}
运行结果
"C:\Program Files\Java\jdk1.8.0_60\bin\java.exe" "-javaagent:D:\IntelliJ IDEA 2020.2.2_Professional\lib\idea_rt.jar=60154:D:\IntelliJ IDEA 2020.2.2_Professional\bin" -Dfile.encoding=UTF-8 -classpath "C:\Users\Administrator\Desktop\Code\springboot\ch1_4\build\classes;C:\Program Files\Java\jdk1.8.0_60\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\rt.jar;C:\Users\Administrator\Desktop\Code\springboot\ch1_4\WebContent\WEB-INF\lib\aspectjweaver-1.9.2.jar;C:\Users\Administrator\Desktop\Code\springboot\ch1_4\WebContent\WEB-INF\lib\commons-logging-1.2.jar;C:\Users\Administrator\Desktop\Code\springboot\ch1_4\WebContent\WEB-INF\lib\spring-aop-5.1.4.RELEASE.jar;C:\Users\Administrator\Desktop\Code\springboot\ch1_4\WebContent\WEB-INF\lib\spring-core-5.1.4.RELEASE.jar;C:\Users\Administrator\Desktop\Code\springboot\ch1_4\WebContent\WEB-INF\lib\spring-beans-5.1.4.RELEASE.jar;C:\Users\Administrator\Desktop\Code\springboot\ch1_4\WebContent\WEB-INF\lib\spring-aspects-5.1.4.RELEASE.jar;C:\Users\Administrator\Desktop\Code\springboot\ch1_4\WebContent\WEB-INF\lib\spring-context-5.1.4.RELEASE.jar;C:\Users\Administrator\Desktop\Code\springboot\ch1_4\WebContent\WEB-INF\lib\spring-expression-5.1.4.RELEASE.jar" aspectj.config.AOPTest
========程序开始执行========
环绕开始:执行目标方法前,模拟开启事务
前置通知:模拟权限控制,目标类对象:aspectj.dao.TestDaoImpl@544fa968,被增强处理的方法:save
保存
环绕结束:执行目标方法后,模拟关闭事务
最终通知:模拟释放资源
后置返回通知:模拟删除临时文件,被增强处理的方法:save
================
环绕开始:执行目标方法前,模拟开启事务
前置通知:模拟权限控制,目标类对象:aspectj.dao.TestDaoImpl@544fa968,被增强处理的方法:modify
修改
环绕结束:执行目标方法后,模拟关闭事务
最终通知:模拟释放资源
后置返回通知:模拟删除临时文件,被增强处理的方法:modify
================
环绕开始:执行目标方法前,模拟开启事务
前置通知:模拟权限控制,目标类对象:aspectj.dao.TestDaoImpl@544fa968,被增强处理的方法:delete
删除
环绕结束:执行目标方法后,模拟关闭事务
最终通知:模拟释放资源
后置返回通知:模拟删除临时文件,被增强处理的方法:delete
Process finished with exit code 0
使用Java类来代替spring的配置文件,就是说不写.xml这个配置文件
package aspectj.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
@Configuration
@ComponentScan("aspectj")
@EnableAspectJAutoProxy
public class AspectjAOPConfig {
}