码迷,mamicode.com
首页 > 编程语言 > 详细

Spring 之定义切面尝试(基于 XML)

时间:2017-07-12 13:34:50      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:color   location   exp   port   定义   1.0   logs   auto   classpath   

有些场景下只能基于 XML 来定义切面。

【Spring 之定义切面尝试】

1、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:context="http://www.springframework.org/schema/context"
       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/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!-- 启用 Aspectj 自动代理 不启动也能用???-->
    <aop:aspectj-autoproxy />

    <bean id="audience" class="concert.Audience" />

    <aop:config>
        <aop:aspect ref="audience">
            <aop:before method="silenceCellPhones"
                        pointcut="execution(* concert.Performance.perform(..))" />
            <aop:before method="takeSeats"
                        pointcut="execution(* concert.Performance.perform(..))" />
            <aop:after-returning method="applause"
                        pointcut="execution(* concert.Performance.perform(..))" />
            <aop:after-throwing method="demandRefund"
                        pointcut="execution(* concert.Performance.perform(..))" />
        </aop:aspect>
    </aop:config>

    <bean id="theShow" class="concert.TheShow" />

</beans>

使用 <aop:pointcut> 定义命名切点

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

    <!-- 启用 Aspectj 自动代理 不启动也能用???-->
    <aop:aspectj-autoproxy />

    <bean id="audience" class="concert.Audience" />

    <aop:config>
        <aop:aspect ref="audience">
            <aop:pointcut id="performance" expression="execution(* concert.Performance.perform(..))" />
            <aop:before method="silenceCellPhones"
                        pointcut-ref="performance" />
            <aop:before method="takeSeats"
                        pointcut-ref="performance" />
            <aop:after-returning method="applause"
                                 pointcut-ref="performance" />
            <aop:after-throwing method="demandRefund"
                                pointcut-ref="performance" />
        </aop:aspect>
    </aop:config>

    <bean id="theShow" class="concert.TheShow" />

</beans>

修改为环绕通知:

package concert;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;

public class Audience {

    public void performance() {}

    public void watchPerformance(ProceedingJoinPoint jp) {
        try {
            System.out.println("Silencing cell phones");
            System.out.println("Taking seats");
            jp.proceed();
            System.out.println("CLAP CLAP CLAP!!!AP CLAP!!!AP CLAP!!!AP CLAP!!!");
        } catch (Throwable e) {
            System.out.println("Demanding a refund");
        }
    }
}
<?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:context="http://www.springframework.org/schema/context"
       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/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

    <aop:aspectj-autoproxy />

    <bean id="audience" class="concert.Audience" />

    <aop:config>
        <aop:aspect ref="audience">
            <aop:pointcut id="performance" expression="execution(* concert.Performance.perform(..))" />

            <aop:around method="watchPerformance"
                        pointcut-ref="performance" />
        </aop:aspect>
    </aop:config>

    <bean id="theShow" class="concert.TheShow" />

</beans>

 

2、测试所定义的切面

package concert;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
    public static void main(String[] args) {
        // 导入配置
        ApplicationContext ctx = new ClassPathXmlApplicationContext("concert-config.xml");

        Performance performance = (Performance) ctx.getBean("theShow");
        performance.perform();
    }
}

 一切正常。。。

Spring 之定义切面尝试(基于 XML)

标签:color   location   exp   port   定义   1.0   logs   auto   classpath   

原文地址:http://www.cnblogs.com/xkxf/p/7154450.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!