posts - 22, comments - 17, trackbacks - 0, articles - 15
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

初识AOP

Posted on 2006-12-02 15:52 码农cz 阅读(146) 评论(0)  编辑  收藏 所属分类: Spring what I know

AOP是被看做Spring框架中的一个重头戏。所以介绍一下。

学习Spring AOP之前,先来了解一下AOP。
AOP应用到项目中的好处,能够将与业务逻辑不相关的代码(如:日志、权限等)分离出来,减小相关业务类负担,并能让一些通用需求(如:事务)得到更广泛的复用。
AOP的实现是利用了java核心的代理机制,分静态代理与动态代理。
静态代理要求代理对象与被代理对象都实现同一个接口

 1  //接口:
 2 public interface IBusiness{
 3         public void doBusiness();
 4 }
 5 //实现:
 6 public class BusinessImpl implements IBusiness{
 7         public void doBusiness(){
 8                 System.out.println("业务主体部分");
 9         }
10 }
11 //执行器:
12 public class BusinessHandler implements InvocationHandler{
13         private BusinessImpl bi=null;
14         public BusinessHandler(BusinessImpl bi){
15                 this.bi=bi;
16         }
17         public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{
18                 System.out.println("事务、日志、权限等操作");
19                 method.invoke(bi,args);
20                 System.out.println("事务、日志、权限等操作");
21         }
22         }
23 }
24 //应用:
25 public class AOPAppDemo{
26         public static void main(String[] args){
27                 BusinessImple bi=new BusinessImple();
28                 BusinessHandler bh=new BusinessHandler(bi);
29                 IBusiness proxy=(IBusiness)Proxy.newProxyInstance(bi.getClass().getClassLoader(),bi.getClass().getInterfaces(),bh);
30                   proxy.doBusiness();
31         }
32 }

上述代码就是通过静态代理实现了AOP,BusinessProxy代理了BusinessImpl的doBusiness方法。但是静态代理一般不能满足我们项目开发的需求,如果业务需求很多它得为每一个业务方法一一做代理,动态代理正好解决了这一缺点,接下来我们来说说动态代理吧。
动态代理,需实现一个InvocationHandler的接口,重写invoke(Object proxy,Method method,Object[] args)方法,代理对象实例由Proxy.newProxyInstance(ClassLoader loader,Class interfaces,InvocationHandler h)方法生成,当代理对象的方法被执行时,通知执行器(InvocationHandler)执行invoke(Object proxy,Method method,Object[] args)方法,invoke方法内调用了method.invoke(Object obj,Object... args)方法,该方法对带有指定参数的指定对象调用由此 Method 对象表示的基础方法,应该这时才真正代理执行了业务逻辑(这里我是这样理解的,不知对不对)。
接下来用代码说明上述动态代理原理,与静态代理相比接口与实现保持不变

 1 //接口:
 2 public interface  IBusiness{
 3         public void
 doBusiness();
 4 
}
 5 //实现:

 6 public class BusinessImpl implements  IBusiness{
 7         public void
 doBusiness(){
 8                 System.out.println("业务主体部分"
);
 9 
        }
10 
}
11 //代理:

12 public class BusinessProxy implements  IBusiness{
13         private
 BusinessImple bi;
14         public
 BusinessProxy(BusinessImple bi){
15                 this.bi=
bi;
16 
        }
17         public void
 doBusiness(){
18                 System.out.println("事务、日志、权限等操作"
);
19 
                bi.doBusiness();
20                 System.out.println("事务、日志、权限等操作"
);
21 
        }
22 
}
23 //应用:

24 public class  AOPAppDemo{
25         public static void
 main(String[] args){
26                 BusinessImpl bi=new
 BusinessImple();
27                 BusinessProxy proxy=new
 BusinessProxy(bi);
28 
                proxy.doBusiness();
29 
        }
30 
}
31 

只有注册用户登录后才能发表评论。


网站导航:
相关文章: