同一切面内含有before、around、after-retur

2019-05-06  本文已影响0人  wbpailxt

响应顺序和xml声明通知的顺序有关,但由于响应顺序没有规律(或者说目前我还没找出它的规律),故先将现象列出,并且为编码时规定一个适合理解的约束。
目标对象:

public class AspectBiz {
    public void biz() {
        System.out.println("AspectBiz biz.");
        //throw new RuntimeException();
    }
}

切面:

public class MoocAspect {
    
    public void before() {
        System.out.println("MoocAspect before.");
    }
    
    public void afterReturning() {
        System.out.println("MoocAspect afterReturning.");
    }
    
    public void afterThrowing(Throwable throwing) {
        System.out.println("MoocAspect afterThrowing.");
        /*throwing.printStackTrace();*/
        System.out.println("--------------------------------");
    }
    
    public void after() {
        System.out.println("MoocAspect after.");
    }
    
    public void around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("MoocAspect around 1.");
        pjp.proceed();
        System.out.println("MoocAspect around 2.");
    }
}

测试:

@RunWith(BlockJUnit4ClassRunner.class)
public class TestAOPSchemaAdvice extends UnitTestBase {

    public TestAOPSchemaAdvice() {
        super("classpath:spring-aop-schema-advice.xml");
    }

    @Test
    public void testBiz() {
        AspectBiz biz = super.getBean("aspectBiz");
        biz.biz();
    }
}

xml通知声明顺序1:

<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 
        http://www.springframework.org/schema/beans/spring-beans.xsd  
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">

    <bean id="moocAspect" class="com.groupaop.artifactaop.schema.advice.MoocAspect"></bean>
    
    <bean id="aspectBiz" class="com.groupaop.artifactaop.schema.advice.biz.AspectBiz"></bean>
    
    <aop:config>
        <aop:aspect id="moocAspectAOP" ref="moocAspect">
            <aop:pointcut expression="execution(* com.groupaop.artifactaop.schema.advice.biz.*Biz.*(..))" id="moocPiontcut"/>
            <aop:around method="around" pointcut-ref="moocPiontcut"/>
            <aop:before method="before" pointcut-ref="moocPiontcut"/>

            <aop:after-returning method="afterReturning" pointcut-ref="moocPiontcut"/>

            <aop:after-throwing method="afterThrowing" pointcut-ref="moocPiontcut" throwing="throwing"/>

            <aop:after method="after" pointcut-ref="moocPiontcut"/>
        </aop:aspect>
    </aop:config>
 </beans>
图片.png

xml声明顺序2:

<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 
        http://www.springframework.org/schema/beans/spring-beans.xsd  
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">

    <bean id="moocAspect" class="com.groupaop.artifactaop.schema.advice.MoocAspect"></bean>
    
    <bean id="aspectBiz" class="com.groupaop.artifactaop.schema.advice.biz.AspectBiz"></bean>
    
    <aop:config>
        <aop:aspect id="moocAspectAOP" ref="moocAspect">
            <aop:pointcut expression="execution(* com.groupaop.artifactaop.schema.advice.biz.*Biz.*(..))" id="moocPiontcut"/>

            <aop:before method="before" pointcut-ref="moocPiontcut"/>
            <aop:around method="around" pointcut-ref="moocPiontcut"/>
            <aop:after-returning method="afterReturning" pointcut-ref="moocPiontcut"/>

            <aop:after-throwing method="afterThrowing" pointcut-ref="moocPiontcut" throwing="throwing"/>

            <aop:after method="after" pointcut-ref="moocPiontcut"/>
        </aop:aspect>
    </aop:config>
 </beans>
图片.png

xml声明顺序3:

<?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 
        http://www.springframework.org/schema/beans/spring-beans.xsd  
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">

    <bean id="moocAspect" class="com.groupaop.artifactaop.schema.advice.MoocAspect"></bean>
    
    <bean id="aspectBiz" class="com.groupaop.artifactaop.schema.advice.biz.AspectBiz"></bean>
    
    <aop:config>
        <aop:aspect id="moocAspectAOP" ref="moocAspect">
            <aop:pointcut expression="execution(* com.groupaop.artifactaop.schema.advice.biz.*Biz.*(..))" id="moocPiontcut"/>

            <aop:before method="before" pointcut-ref="moocPiontcut"/>

            <aop:after-returning method="afterReturning" pointcut-ref="moocPiontcut"/>
            <aop:around method="around" pointcut-ref="moocPiontcut"/>
            <aop:after-throwing method="afterThrowing" pointcut-ref="moocPiontcut" throwing="throwing"/>

            <aop:after method="after" pointcut-ref="moocPiontcut"/>
        </aop:aspect>
    </aop:config>
 </beans>
图片.png

xml声明顺序4:

<?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 
        http://www.springframework.org/schema/beans/spring-beans.xsd  
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">

    <bean id="moocAspect" class="com.groupaop.artifactaop.schema.advice.MoocAspect"></bean>
    
    <bean id="aspectBiz" class="com.groupaop.artifactaop.schema.advice.biz.AspectBiz"></bean>
    
    <aop:config>
        <aop:aspect id="moocAspectAOP" ref="moocAspect">
            <aop:pointcut expression="execution(* com.groupaop.artifactaop.schema.advice.biz.*Biz.*(..))" id="moocPiontcut"/>

            <aop:before method="before" pointcut-ref="moocPiontcut"/>

            <aop:after-returning method="afterReturning" pointcut-ref="moocPiontcut"/>

            <aop:after-throwing method="afterThrowing" pointcut-ref="moocPiontcut" throwing="throwing"/>
            <aop:around method="around" pointcut-ref="moocPiontcut"/>
            <aop:after method="after" pointcut-ref="moocPiontcut"/>
        </aop:aspect>
    </aop:config>
 </beans>
图片.png

xml声明顺序5:

<?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 
        http://www.springframework.org/schema/beans/spring-beans.xsd  
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">

    <bean id="moocAspect" class="com.groupaop.artifactaop.schema.advice.MoocAspect"></bean>
    
    <bean id="aspectBiz" class="com.groupaop.artifactaop.schema.advice.biz.AspectBiz"></bean>
    
    <aop:config>
        <aop:aspect id="moocAspectAOP" ref="moocAspect">
            <aop:pointcut expression="execution(* com.groupaop.artifactaop.schema.advice.biz.*Biz.*(..))" id="moocPiontcut"/>

            <aop:before method="before" pointcut-ref="moocPiontcut"/>

            <aop:after-returning method="afterReturning" pointcut-ref="moocPiontcut"/>

            <aop:after-throwing method="afterThrowing" pointcut-ref="moocPiontcut" throwing="throwing"/>

            <aop:after method="after" pointcut-ref="moocPiontcut"/>
            <aop:around method="around" pointcut-ref="moocPiontcut"/>
        </aop:aspect>
    </aop:config>
 </beans>
图片.png

自己总结的一个约束

以“xml顺序声明2”作为以后通知声明顺序的规范,即before->around->after-returning/after-throwing->after。这样around通知就和代码逻辑一样紧绕执行对象前后,after-returning和after通知的响应顺序和xml响应顺序一样。

上一篇 下一篇

猜你喜欢

热点阅读