🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
定义切面类 ``` @Component @Aspect public class LogAspect { /* @Pointcut("execution(* com.neuedu.aop.business.*.*(..))") public void anyMethod() { } @Before("execution(* com.neuedu.aop.business.*.*(..))") public void before() { System.out.println("方法开始了"); } @After("execution(* com.neuedu.aop.business.*.*(..))") public void after() { System.out.println("方法结束了"); } @AfterThrowing(pointcut="anyMethod()",throwing="ex") public void exception(Exception ex) { System.out.println("方法抛出异常了"); //记录在日志文件。 ex.printStackTrace(); } @AfterReturning(pointcut="anyMethod()",returning="str") public void afterreturnning(String str) { System.out.println(str); System.out.println("方法正常结束"); }*/ @Around("execution(* com.neuedu.aop.business.*.*(..))") public void round(ProceedingJoinPoint jp) { //before通知 //1. 获得当前时间 Date d1 = new Date(); System.out.println(jp.getSignature().getName()+"开始了"); try { jp.proceed();//执行目标方法 } catch(Throwable e) { //记日志 after throwing System.out.println(e.getMessage()); } //after System.out.println(jp.getSignature().getName()+"结束了"); //2. 获得当前时间 Date d2 = new Date(); System.out.println("方法运行,耗时:"+ (d2.getTime() - d1.getTime())); } } ``` applicationContext.xml ``` <!-- 启用注解方式的aop --> <!-- 默认值:proxy-target-class="false" 使用jdk的代理模式, 特殊注意:如果没有实现接口,自动调用cglib的方式--> <!-- proxy-target-class="true" 使用cglib增强模式,有没有接口都支持 --> <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy> <context:component-scan base-package="com.neuedu.aop"></context:component-scan> ``` 测试类的实现: ``` @Test public void testAOP1() { //启动ioc容器 ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); // TestAspect testAspect = ctx.getBean(TestAspect.class); testAspect.test(); //spring aop的实现基于动态代理的设计模式 //1。被代理类需要实现一个接口(TestAspect implements ITestAspect)-> JDK自带功能(调用相应的类,方法,就可以自己写这种动态代理) //2.被代理类不需要实现接口,aop生成目标类的子类。-》 JDK不支持,第三方工具cglib支持(调用相应的类,方法,就可以自己写这种动态代理)。 //3. aspectj静态织入,直接修改目标类的class文件,更灵活 //spring引入aspectj,目的是使用aspectj注解语法(aspect,before),内部机制仍然是动态代理, 即第一种和第二种。 } ```