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这个配置文件中
原文地址:https://www.cnblogs.com/danghuijian/p/4400775.html