springframework(十二)AOP之aop标签的支持

spring2.0提供了基于XML Schema的设置和基于Annotation的支持,这两种方式对于AOP在使用上的简化都大有帮助,这里我们只是介绍基于xml的设置。
1、定义一个Advice类,这个advice类不同于以往的,需要集成一些什么advice类。直接就是一个单独的advice类文件。
 例如:

[java] view plain copy
  1. package com.itcast.aop.xml;  
  2. //测试aop标签  
  3. import org.aspectj.lang.JoinPoint;;  
  4. public class TestAdvice {  
  5.     public void fff(JoinPoint jointPoint){  
  6.         System.out.println("测试aop标签:"+jointPoint.getSignature().getName());  
  7.     }  
  8. }  

其中这个JoinPoint可以省略掉
2)、在配置文件上引入新的xmlns
<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-2.0.xsd
  http://www.springframework.org/schema/aop
  http://www.springframework.org/schema/aop/spring-aop-2.0.xsd ">
3、配置使用,配置文件中声明advice bean。同时使用aop标签来设定适用范围
[xhtml] view plain copy
  1. <!-- 基于aop标签方式的配置 -->  
  2. <bean id="testTag" class="com.itcast.aop.xml.TestAdvice"></bean>  
  3. <aop:config>  
  4.   <aop:aspect id="logging" ref="testTag">  
  5.    <aop:before pointcut="execution(* com.itcast.aop.IHello.*(..))"  
  6.    method="fff"/>  
  7.   </aop:aspect>  
  8. </aop:config>  
  9. <bean id="helloSpeaker" class="com.itcast.aop.HelloSpeaker"></bean>  

如上的pointcut中方法名称:
com.itcast.aop.IHello.*(..)表示Ihello方法所声明的任何方法都符合,参数类型设置“(..)”表示任何参数类型声明都符合
 Method方法:指明了Advice上要调用的方法名称,这里是TestAdvice中的fff方法
 Aop:before表示Advice将作为BeforeAdvice

4、测试类

[java] view plain copy
  1. package com.itcast.aop.xml;  
  2.   
  3. //测试spring的aop配置  
  4. import org.springframework.context.ApplicationContext;  
  5. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  6. import com.itcast.aop.IHello;  
  7. public class SpringAOPMain {  
  8.     public static void main(String[] args) throws Exception {  
  9.         ApplicationContext ctx = new ClassPathXmlApplicationContext("bean-config.xml");  
  10.         IHello helloSpeaker = (IHello)ctx.getBean("helloSpeaker");  
  11.         helloSpeaker.hello("aaaaaaaaaaaaaaa");  
  12.         helloSpeaker.helloAaa("bbbbbbbbbbbbbbb");  
  13.         helloSpeaker.helloBbb("ccccccccccccccc");  
  14.     }  
  15. }  

5、输出结果

[xhtml] view plain copy
  1. 测试aop标签:hello  
  2. Hello aaaaaaaaaaaaaaa  
  3. 测试aop标签:helloAaa  
  4. Hello in aaa bbbbbbbbbbbbbbb  
  5. 测试aop标签:helloBbb  
  6. Hello in bbb ccccccccccccccc  

透过控制台输出的结果可以看到,任何实现了IHello接口类中的方法调用都调用,都被我们声明的advice给拦截了。

相关的hello接口以及实现类,以及声明,参照如下:

[java] view plain copy
  1. package com.itcast.aop;  
  2. //要实现的接口  
  3. public interface IHello {  
  4.     public void hello(String name) throws Exception;  
  5.     public void helloAaa(String name);  
  6.     public void helloBbb(String name);  
  7. }  
  8.   
  9. package com.itcast.aop;  
  10. import java.util.logging.*;  
  11. //实现方法1  
  12. public class HelloSpeaker implements IHello{  
  13. //  private Logger logger = Logger.getLogger(this.getClass().getName());  
  14.     public void hello(String name) throws Exception{  
  15. //      logger.info("hello method start");  
  16.         System.out.println("Hello "+ name);  
  17. //      throw new Exception("自定义的异常");  
  18. //      logger.info("hello method end");  
  19.     }  
  20.     public void helloAaa(String name) {  
  21.         System.out.println("Hello in aaa "+ name);  
  22.     }  
  23.     public void helloBbb(String name) {  
  24.         System.out.println("Hello in bbb "+ name);  
  25.     }  
  26. }  

 

总结:spring的aop标签支持需要在xmlschemal上声明命名空间。并需要编写一个特定格式的advice类,最终使用aop标签完成advice对类的拦截。当我们调用bean的时候,如果符合了aop标签声明的监控范围,他将拦截我们的类。

note:不知道aop标签的写法,看一下spring的reference

你可能感兴趣的:(springframework(十二)AOP之aop标签的支持)