前面一篇是xml实现的,现在用注解方式实现一下,测试类还是原来的,xml的配置中多余的部分这里就不在贴出来了。
applicationContext.xml的配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <context:component-scan base-package="annotationAop"></context:component-scan> <aop:aspectj-autoproxy></aop:aspectj-autoproxy> <bean id="testBean" class="controller.logController"></bean> </beans>
上一篇漏了测试用的controller类这里补上
package controller; public class logController { public void firsttest1(){ System.out.println("第一个test1执行中"); } public void secondtest1(){ System.out.println("第二个test1执行中"); } public void throwtest1() throws Exception { System.out.println("要抛异常了"); throw new Exception("测试异常"); } public void aroundtest1(){ System.out.println("环绕方法测试"); } public String returntest1(){ return "返回值测试"; } public void firsttest2(){ System.out.println("第一个test2执行中"); } public void secondtest2(){ System.out.println("第二个test2执行中"); } }
注解切面类
package annotationAop; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.stereotype.Component; @Component @Aspect public class AspectClass { @Pointcut("execution(void controller.*.*test1(..))") public void pointCut(){ } @Before(value = "pointCut()") public void before(){ System.out.println("注解测试方法执行前"); } @After(value = "pointCut()") public void after(){ System.out.println("注解测试方法执行后"); } @AfterReturning(value = "pointCut()") public void returnMehtod(){ System.out.println("注解测试方法返回后执行"); } @AfterThrowing(value = "pointCut()") public void throwMethod(){ System.out.println("注解测试方法异常尝试后执行"); } @Around(value = "pointCut()") public void aroundMethod(ProceedingJoinPoint joinPoint){ System.out.println("注解测试方法环绕方法执行前"); try{ joinPoint.proceed(); System.out.println("注解测试方法环绕方法执行后"); }catch(Throwable throwable){ throwable.printStackTrace(); } } }
测试类(和上一篇一样)
public class App { public static void main( String[] args ) throws Exception { //加载spring配置文件 AbstractApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml"); //获取测试用bean logController test = (logController)context.getBean("testBean"); //会被拦截的方法 test.firsttest1(); System.out.println("----------------------"); test.secondtest1(); System.out.println("----------------------"); test.aroundtest1(); System.out.println("----------------------"); test.returntest1(); System.out.println("----------------------"); test.throwtest1(); System.out.println("----------------------"); //不会被拦截的方法 test.firsttest2(); System.out.println("----------------------"); test.secondtest2(); }
测试结果
注解测试方法环绕方法执行前
注解测试方法执行前
第一个test1执行中
注解测试方法环绕方法执行后
注解测试方法执行后
注解测试方法返回后执行
----------------------
注解测试方法环绕方法执行前
注解测试方法执行前
第二个test1执行中
注解测试方法环绕方法执行后
注解测试方法执行后
注解测试方法返回后执行
----------------------
注解测试方法环绕方法执行前
注解测试方法执行前
环绕方法测试
注解测试方法环绕方法执行后
注解测试方法执行后
注解测试方法返回后执行
----------------------
----------------------
注解测试方法环绕方法执行前
注解测试方法执行前
要抛异常了
注解测试方法执行后
注解测试方法返回后执行
----------------------
第一个test2执行中
----------------------
第二个test2执行中
java.lang.Exception: 测试异常
at controller.logController.throwtest1(logController.java:15)
at controller.logController$$FastClassBySpringCGLIB$$7d45bb2e.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:721)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:52)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)
at annotationAop.AspectClass.aroundMethod(AspectClass.java:41)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:629)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:618)
at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.aspectj.AspectJAfterAdvice.invoke(AspectJAfterAdvice.java:47)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.adapter.AfterReturningAdviceInterceptor.invoke(AfterReturningAdviceInterceptor.java:52)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:62)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:656)
at controller.logController$$EnhancerBySpringCGLIB$$dfb6add3.throwtest1(<generated>)
at logbackmvn.App.main(App.java:28)