zoukankan      html  css  js  c++  java
  • spring的一些总结3

    现在切点也有了,就要搞完整切面了,完整切面也叫通知者,直接在xml中配置.
    Xml代码 复制代码
    1. <!--定义完整切面,把定义好的切点和通知放进来就行了 spring定义方式-->  
    2.   <bean id="audienceAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">  
    3.        <property name="pointcut" ref="springpointcut"/>  
    4.        <property name="advice" ref="audienceAdvice"/>  
    5.    </bean>  
    6.    <!--定义完整切面,aspectJ定义方式-->  
    7.   <bean id="audienceAdvisor" class="org.springframework.aop.aspectj.AspectJExpressionPointcutAdvisor">  
    8.        <property name="expression" value="execution(* Performer+.perform(..))"/>  
    9.        <property name="advice" ref="audienceAdvice"/>  
    10.    </bean>  
    <!--定义完整切面,把定义好的切点和通知放进来就行了 spring定义方式--> <bean id="audienceAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor"> <property name="pointcut" ref="springpointcut"/> <property name="advice" ref="audienceAdvice"/> </bean> <!--定义完整切面,aspectJ定义方式--> <bean id="audienceAdvisor" class="org.springframework.aop.aspectj.AspectJExpressionPointcutAdvisor"> <property name="expression" value="execution(* Performer+.perform(..))"/> <property name="advice" ref="audienceAdvice"/> </bean>

    切面有了,基本的事情都好了,现在可以想办法把切面用到目标类上了,aop的原理是通过代理实现的,所以我们要声明代理bean了。

    首先,之前的ShowBoy和ShowGirl要改在xml中声明的id,他们现在是目标类,所以XML要改为Xml代码 复制代码
    1. <bean id="showBoyTarget" class="com.spring.springcase.ShowBoy"/>  
    2.     <bean id="showGirlTarget" class="com.spring.springcase.ShowGirl"/>  
    <bean id="showBoyTarget" class="com.spring.springcase.ShowBoy"/> <bean id="showGirlTarget" class="com.spring.springcase.ShowGirl"/>
    现在制作一个代理:
        Xml代码 复制代码
    1. <!--定义代理类,第一个参数是要代理的对象,第2个是使用的切面,第3个是实现的接口-->  
    2.    <bean id="showBoy" class="org.springframework.aop.framework.ProxyFactoryBean">  
    3.        <property name="target" ref="showBoyTarget"/>  
    4.        <property name="interceptorNames">  
    5.            <list>  
    6.                <value>audienceAdvice</value>  
    7.            </list>  
    8.        </property>  
    9.        <property name="proxyInterfaces">  
    10.            <list>  
    11.                <value>com.spring.springcase.Perform</value>  
    12.            </list>  
    13.        </property>  
    14.    </bean>  
    <!--定义代理类,第一个参数是要代理的对象,第2个是使用的切面,第3个是实现的接口--> <bean id="showBoy" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="target" ref="showBoyTarget"/> <property name="interceptorNames"> <list> <value>audienceAdvice</value> </list> </property> <property name="proxyInterfaces"> <list> <value>com.spring.springcase.Perform</value> </list> </property> </bean>

    现在就把代理类伪装成showBoy了,为什么要这样,上一篇已经说过了。
        现在测试一下
    Java代码 复制代码
    1. public class performTest extends TestCase{  
    2.      ApplicationContext ctx;  
    3.     @Override  
    4.     protected void setUp() throws Exception {  
    5.          ctx = new ClassPathXmlApplicationContext("spring-springcase.xml");  
    6.      }  
    7.     public void testShowBoy(){  
    8.          Perform perform = (Perform)ctx.getBean("showBoy");  
    9.          perform.perform();  
    10.      }  
    11. }  
    12. 打印结果:  
    13. 观众们找到自己的座位,都坐下来了  
    14. 请所有观众确定手机已经关闭  
    15. 表演街舞  
    16. 观众们大声鼓掌,啪啦啪啦啪啦  
    public class performTest extends TestCase{ ApplicationContext ctx; @Override protected void setUp() throws Exception { ctx = new ClassPathXmlApplicationContext("spring-springcase.xml"); } public void testShowBoy(){ Perform perform = (Perform)ctx.getBean("showBoy"); perform.perform(); } } 打印结果: 观众们找到自己的座位,都坐下来了 请所有观众确定手机已经关闭 表演街舞 观众们大声鼓掌,啪啦啪啦啪啦
    如果现在要showGirl也代理,那么就要写它的xml:
    Xml代码 复制代码
    1. <bean id="showGril" class="org.springframework.aop.framework.ProxyFactoryBean">  
    2.         <property name="target" ref="showGirlTarget"/>  
    3.         <property name="interceptorNames">  
    4.             <list>  
    5.                 <value>audienceAdvice</value>  
    6.             </list>  
    7.         </property>  
    8.         <property name="proxyInterfaces">  
    9.             <list>  
    10.                 <value>com.spring.springcase.Perform</value>  
    11.             </list>  
    12.         </property>  
    13.     </bean>  
    <bean id="showGril" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="target" ref="showGirlTarget"/> <property name="interceptorNames"> <list> <value>audienceAdvice</value> </list> </property> <property name="proxyInterfaces"> <list> <value>com.spring.springcase.Perform</value> </list> </property> </bean>
    如果再有一个呢,那非给把你累死,发现定义代理,大部分代码是一样的,就是引用的目标类不同,这时就要把共有的代码抽出来,自己去写变换的那部分。
    定义一个代理的父类,实现了2个参数,其中的目标类由自己写。
    Xml代码 复制代码
    1. <bean id="audienceProxyBase" class="org.springframework.aop.framework.ProxyFactoryBean" abstract="true">  
    2.        <property name="interceptorNames">  
    3.            <list>  
    4.                <value>audienceAdvice</value>  
    5.            </list>  
    6.        </property>  
    7.        <property name="proxyInterfaces">  
    8.            <list>  
    9.                <value>com.spring.springcase.Perform</value>  
    10.            </list>  
    11.        </property>  
    12.    </bean>  
    <bean id="audienceProxyBase" class="org.springframework.aop.framework.ProxyFactoryBean" abstract="true"> <property name="interceptorNames"> <list> <value>audienceAdvice</value> </list> </property> <property name="proxyInterfaces"> <list> <value>com.spring.springcase.Perform</value> </list> </property> </bean>

    重新声明伪装类就简单很多了
    Xml代码 复制代码
    1. <bean id="showBoy" parent="audienceProxyBase">  
    2.     <property name="target" ref="showBoyTarget"/>  
    3. </bean>  
    4. <bean id="showGirl" parent="audienceProxyBase">  
    5.     <property name="target" ref="showGirlTarget"/>  
    6. </bean>  
    <bean id="showBoy" parent="audienceProxyBase"> <property name="target" ref="showBoyTarget"/> </bean> <bean id="showGirl" parent="audienceProxyBase"> <property name="target" ref="showGirlTarget"/> </bean>
    但是,许多人还是觉得要定义这么一大堆东西,还是太麻烦,没错,我也觉得是麻烦,spring有更好的实现方式。明天再接着总结。

    引用
    写的不错,不过应该吧xml文件的名称写清楚
    所有的xml都写在spring-springcase.xml这个配置文件中
  • 相关阅读:
    5月读书日志
    把代码搬到Git Hub 吧(一)
    RTX二次开发(二)(基于ASP.NET)
    RTX二次开发(一)(基于ASP.NET)
    文件夹下迭代查询文件
    JS URL传递中文参数时出现乱码的处理
    js实现上下滑动侧边栏
    基本select语句的生命周期
    NodeJs下的测试框架Mocha
    带新人感想
  • 原文地址:https://www.cnblogs.com/danghuijian/p/4400775.html
Copyright © 2011-2022 走看看