springframework(六)AOP之静态代理

来源:互联网 发布:梦幻邮箱数据 编辑:程序博客网 时间:2024/05/20 20:55
spring的AOP是基于代理的。java的事务控制是基于代理的。这两句话熟悉吧,一些老鸟就喜欢用这些词汇让我们犯晕,让我们感到他们很专业。这里我们将打破这个神话,本篇先介绍基于代理的AOP。这里我们先展示下什么叫做代理,先从静态代理开始。

一个静态代理的例子。

1、定义一个接口

[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. }  

2、一个实现接口的实例

[c-sharp] view plain copy
  1. package com.itcast.aop;  
  2. //实现方法1  
  3. public class HelloSpeaker implements IHello{  
  4. //  private Logger logger = Logger.getLogger(this.getClass().getName());  
  5.     public void hello(String name) throws Exception{  
  6.         System.out.println("Hello "+ name);  
  7.     }  
  8.     public void helloAaa(String name) {  
  9.         System.out.println("Hello in aaa "+ name);  
  10.     }  
  11.     public void helloBbb(String name) {  
  12.         System.out.println("Hello in bbb "+ name);  
  13.     }  
  14. }  
3、调用的静态代理类
[java] view plain copy
  1. package com.itcast.aop;  
  2.   
  3. import java.util.Date;  
  4. import java.util.logging.Logger;  
  5. //静态代理类  
  6. public class HelloProxy implements IHello {  
  7. private Logger logger = Logger.getLogger(this.getClass().getName());  
  8. private IHello helloObj;  
  9. public HelloProxy(IHello helloObj){  
  10.     this.helloObj=helloObj;  
  11. }  
  12. public void hello(String name) {  
  13.     logger.info("method start at "+new Date());  
  14.     try {  
  15.         helloObj.hello(name);  
  16.     } catch (Exception e) {  
  17.         e.printStackTrace();  
  18.     }  
  19.     logger.info("method end at "+new Date());  
  20. }  
  21. public void helloAaa(String name) {  
  22.     System.out.println("Hello in aaa"+ name);  
  23. }  
  24. public void helloBbb(String name) {  
  25.     System.out.println("Hello in bbb"+ name);  
  26. }  
  27. //静态代理类的测试方法  
  28. public static void main(String[] args){  
  29.     IHello proxy = new HelloProxy(new HelloSpeaker());  
  30.     try {  
  31.         proxy.hello("tester");  
  32.     } catch (Exception e) {  
  33.         e.printStackTrace();  
  34.     }  
  35. }  
  36. }  

上边就是我们的静态代理类,代理了我们IHello接口的实现类,并加上了自己的日志输出,在IHello的实现类的hello方法每次被调用的时候,都会被在其前后加上日志。

结果如下:

信息: method start at Sun Mar 15 10:57:31 CST 2009
2009-3-15 10:57:32 com.itcast.aop.HelloProxy hello
信息: method end at Sun Mar 15 10:57:32 CST 2009

 

以上就是静态代理,原理很简单,目的也很简单,就是调用接口实现类的某个方法之前或者之后调用另外的操作。

总结下开发步骤:

 1、创建一个接口

 2、创建一个接口的实现类

 3、创建一个代理类,这个代理类也实现了上边的接口,但是将 要被代理的实现类传入到代理类中,在代理类的接口实现方法中调用,并在调用前后加上一些操作(上边的就是日志操作而已)

0 0
原创粉丝点击