首页 > 代码库 > sping 面向切面编程之引入通知

sping 面向切面编程之引入通知

必须了解其他四个通知:Sping之aop面向切面编程通知案例

引入通知的目的就是在任意的连接点引入我想要的通知,例如前面四个通知案例的运行结果:

前置通知被调用
调用环绕通知前
hi 王大锤
调用环绕通知后
后置通知被调用
前置通知被调用
调用环绕通知前
bye 王大锤
调用环绕通知后
后置通知被调用

可以看出在被代理类Test1Service的sayHello()以及sayBye()方法(这个两个连接点)切入通知;可是现在我只想在sayHello()方法(这一个连接点)上切入通知该怎么办呢?这就要使用到引入通知,其实说白了就是在配置文件中进行配置。(我现在要求环绕通知只切入到sayHello()方法上)

修改前面案例的配置文件beans.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:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">


    <!-- 配置被代理的对象 -->
    <bean id="test1Service" class="com.hubin.aop.Test1Service">
        <property name="name" value=http://www.mamicode.com/"王大锤" />
    </bean>
    <!-- 配置前置通知 -->
    <bean id="myMethodBeforeAdvice" class="com.hubin.aop.MyMethodBeforeAdvice" />

    <!-- 配置后置通知 -->
    <bean id="myMethodAfterAdvice" class="com.hubin.aop.MyMethodAfterAdvice" />

    <!-- 配置环绕通知 -->
    <bean id="myMethodAroundAdvice" class="com.hubin.aop.MyMethodAroundAdvice" />

    <!-- 配置异常通知 -->

    <bean id="myMethodThrowsAdvice" class="com.hubin.aop.MyMethodThrowsAdvice" />

    <!-- 引入通知定义通知的切入点 -->
    <bean id="annotationAdvice"
        class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
        <property name="advice" ref="myMethodAroundAdvice"></property>
        <property name="mappedNames">
            <list>
                <value>sayHello</value>
            </list>
        </property>
    </bean>


    <!-- 配置代理对象(代理对象不需要我们自己写,已经有现成的ProxyFactoryBean类存在了) -->
    <bean id="proxyFactoryBean" class="org.springframework.aop.framework.ProxyFactoryBean">
        <!-- 代理接口集 -->
        <property name="proxyInterfaces">
            <list>
                <!--ProxyFactoryBean类会实现下列接口(必须是接口的全路径) -->
                <value>com.hubin.aop.TestServiceInter</value>
                <value>com.hubin.aop.TestServiceInter2</value>
            </list>
        </property>

        <!-- 把通知织入到代理对象相当于将通知和代理对象关联 -->
        <property name="interceptorNames">
            <list>
                <!-- 必须和配置通知的ben的id对应值是相同的 -->
                <value>myMethodBeforeAdvice</value>
                <value>myMethodAfterAdvice</value>

                <!-- 绑定引用通知 -->
                <value>annotationAdvice</value>

                <value>myMethodThrowsAdvice</value>
            </list>
        </property>

        <!-- 配置被代理对象,ref必须和配置代理对象的id对应值相同 -->
        <property name="target" ref="test1Service" />
    </bean>
</beans>

运行结果:

前置通知被调用
调用环绕通知前
hi 王大锤
调用环绕通知后
后置通知被调用

前置通知被调用
bye 王大锤
后置通知被调用