Spring 在xml中配置AOP
定义切面对象:
public class MyAspect {
public void myBefore(){
System.out.println("myBefore");
}
public void myAfter(){
System.out.println("myAfter");
}
public void myAfterReturning(){
System.out.println("myAfterReturning");
}
public void myAfterThrowing(){
System.out.println("myAfterThrowing");
}
public void myAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("myAround - Before");
proceedingJoinPoint.proceed();
System.out.println("myAround - After");
}
}
定义业务方法:
public class AopTest {
public void test(){
System.out.println("----------------------------");
System.out.println("I am test()!!!");
System.out.println("----------------------------");
}
}
在resources目录下创建spring.spring_aop.xml,写入:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 配置bean -->
<bean id="aoptest" class="com.mine.service.AopTest"></bean>
<bean id="myaspect" class="com.mine.aop.MyAspect"></bean>
<aop:config>
<aop:aspect id="myaspect" ref="myaspect">
<!-- execution 可使用通配符 -->
<aop:pointcut id="test" expression="execution(* com.mine.service.AopTest.test())"/>
<!-- 执行方法前 -->
<aop:before method="myBefore" pointcut-ref="test"></aop:before>
<!-- 执行方法后最后执行,即使方法出现异常也会执行 -->
<aop:after method="myAfter" pointcut-ref="test"></aop:after>
<!-- 执行方法后,出现异常不会执行 -->
<aop:after-returning method="myAfterReturning" pointcut-ref="test"></aop:after-returning>
<!-- 出现异常执行 -->
<aop:after-throwing method="myAfterThrowing" pointcut-ref="test"></aop:after-throwing>
<!-- 相当于 before + after-returning -->
<aop:around method="myAround" pointcut-ref="test"></aop:around>
</aop:aspect>
</aop:config>
</beans>
public class MyMain {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/spring_aop.xml");
AopTest aopTest = (AopTest) context.getBean("aoptest");
aopTest.test();
}
}
结果:
myAround - Before
----------------------------
I am test()!!!
----------------------------
myAround - After
myAfterReturning
myAfter
Process finished with exit code 0
更改业务方法:
public class AopTest {
public void test(){
System.out.println("----------------------------");
String str = null;
str.length();
System.out.println("I am test()!!!");
System.out.println("----------------------------");
}
}
public class MyMain {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/spring_aop.xml");
AopTest aopTest = (AopTest) context.getBean("aoptest");
aopTest.test();
}
}
结果:
myBefore
myAround - Before
----------------------------
myAfterThrowing
myAfter
Exception in thread "main" java.lang.NullPointerException
at com.mine.service.AopTest.test(AopTest.java:8)
at com.mine.service.AopTest$$FastClassBySpringCGLIB$$19638e0d.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:88)
at com.mine.aop.MyAspect.myAround(MyAspect.java:25)
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:644)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633)
at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)
at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:62)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)
at org.springframework.aop.framework.adapter.AfterReturningAdviceInterceptor.invoke(AfterReturningAdviceInterceptor.java:55)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)
at org.springframework.aop.aspectj.AspectJAfterAdvice.invoke(AspectJAfterAdvice.java:47)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)
at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:56)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691)
at com.mine.service.AopTest$$EnhancerBySpringCGLIB$$499a9d0a.test(<generated>)
at MyMain.main(MyMain.java:11)
Process finished with exit code 1