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
posted @ 2022-03-07 18:04  叕叕666  阅读(70)  评论(0)    收藏  举报