Spring AOP之代理模式

在一个服务的流程中插入与业务逻辑无关的系统服务逻辑(例如Logging、Security),这样的逻辑称为Cross-cutting concerns,将Cross-cutting concerns独立出来设计为一个对象,这样的特殊对象称之为Aspect,Aspect-oriented programming着重在Aspect的设计上以及与应用程序的织入(Weave)。

从代理机制初探AOP
如想在执行HelloSpeaker的hello()方法时留下日志消息,可以在hello()方法内部写log,或者说将执行log的程序横切入(Cross-cutting)到HelloSpeaker,但这样就使得HelloSpeaker关注了不属于它自己的业务逻辑。如是可以采取代理的机制(代理模式)
代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。 

代理(Proxy)有两种:
静态代理-Static proxy
动态代理-Dynamic proxy

1. 静态代理
为实现静态代理需要为HelloSpeaker写一个HelloProxy类,同样实现IHello接口,并在hello方法执行log,并执行HelloSpeaker的hello()方法。
Java code
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/**
  * 此处可以为接口也可以为抽象类
  * @author ljn
  *
  */
public  interface  IHelloSpeaker {
     public  abstract  void  hello();
}
 
/**
  * 接口实现类日志功能  简单的打印一句话
  * @author ljn
  *
  */
public  class  HelloSpeaker  implements  IHelloSpeaker {
     public  void  hello(){
         System.out.println( "............this is Log" );
     }
}
 
/**
  * 代理类实现IHelloSpeaker接口,同时拥有实际对象的引用(private HelloSpeaker helloObj;//代理类内部引用真实类)
  * 代理必须完成委托对象的动作,也可以添加自己的动作(doBefore,doAfter)。
 
  * @author ljn
 
  */
public  class  HelloProxy  implements  IHelloSpeaker {
 
     private  HelloSpeaker helloObj; // 代理类内部引用委托类
 
     public  HelloProxy(HelloSpeaker helloSpeaker) {
         this .helloObj = helloSpeaker;
     }
 
     private  void  doBefore() {
         System.out.println( "method doBefore invoke!" );
     }
 
     private  void  doAfter() {
         System.out.println( "method doAfter invoke!" );
 
     }
 
     @Override
     public  void  hello() {
         // TODO Auto-generated method stub
         doBefore(); // 其他业务逻辑
         helloObj =  new  HelloSpeaker();
         helloObj.hello(); // 委托类具体的业务逻辑。
         doAfter(); // 其他业务逻辑
     }
}
/**
*测试类
*/
public  class  Test {
     public  static  void  main(String[] args) {
//其中HelloProxy中helloObject为需要代理的对象,在其它地方如下来使用代理机制
         IHelloSpeaker proxy =  new  HelloProxy( new  HelloSpeaker());
         proxy.hello();
     }
}


2:动态代理
Java code
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import  java.lang.reflect.InvocationHandler;
import  java.lang.reflect.Method;
import  java.lang.reflect.Proxy;
 
public  class  LogHandler  implements  InvocationHandler { 
     
     private  Object delegate;
 
     public  Object bind(Object delegate) { 
         this .delegate = delegate; 
         return  Proxy.newProxyInstance( 
                            delegate.getClass().getClassLoader(), 
                            delegate.getClass().getInterfaces(), 
                            this ); 
     }
 
     @Override
     public  Object invoke(Object proxy, Method method, Object[] args)
             throws  Throwable {
         Object result =  null ;         
         try 
             System.out.println( "method starts..." +method);
             result = method.invoke(delegate, args);
             System.out.println( "method starts..." +method);
         catch  (Exception e){ 
             e.printStackTrace();
         }        
         return  result; 
     }
}
//测试程序
public  static  void  main(String[] args) {
         LogHandler logHandler  =  new  LogHandler(); 
         
         IHelloSpeaker helloProxy = 
                 (IHelloSpeaker) logHandler.bind( new  HelloSpeaker()); 
         helloProxy.hello();
     }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值