浏览 9998 次
锁定老帖子 主题:初识AOP
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-11-02
最后修改:2009-11-10
百事通信息网
学习Spring AOP之前,先来了解一下AOP。 AOP应用到项目中的好处,能够将与业务逻辑不相关的代码(如:日志、权限等)分离出来,减小相关业务类负担,并能让一些通用需求(如:事务)得到更广泛的复用。 AOP的实现是利用了java核心的代理机制,分静态代理与动态代理。 静态代理要求代理对象与被代理对象都实现同一个接口 接口: public interface IBusiness{ public void doBusiness(); } 实现: public class BusinessImpl implements IBusiness{ public void doBusiness(){ System.out.println("业务主体部分"); } } 代理: public class BusinessProxy implements IBusiness{ private BusinessImple bi=null; public BusinessProxy(BusinessImple bi){ this.bi=bi; } public void doBusiness(){ System.out.println("事务、日志、权限等操作"); bi.doBusiness(); System.out.println("事务、日志、权限等操作"); } } 应用: public class AOPAppDemo{ public static void main(String[] args){ BusinessImpl bi=new BusinessImple(); BusinessProxy proxy=new BusinessProxy(bi); proxy.doBusiness(); } } 上述代码就是通过静态代理实现了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 对象表示的基础方法,应该这时才真正代理执行了业务逻辑(这里我是这样理解的,不知对不对)。 接下来用代码说明上述动态代理原理,与静态代理相比接口与实现保持不变 接口: public interface IBusiness{ public void doBusiness(); } 实现: public class BusinessImpl implements IBusiness{ public void doBusiness(){ System.out.println("业务主体部分"); } } 执行器: public class BusinessHandler implements InvocationHandler{ private BusinessImpl bi=null; public BusinessHandler(BusinessImpl bi){ this.bi=bi; } public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{ System.out.println("事务、日志、权限等操作"); method.invoke(bi,args); System.out.println("事务、日志、权限等操作"); } } } 应用: public class AOPAppDemo{ public static void main(String[] args){ BusinessImple bi=new BusinessImple(); BusinessHandler bh=new BusinessHandler(bi); IBusiness proxy=(IBusiness)Proxy.newProxyInstance(bi.getClass().getClassLoader(),bi.getClass().getInterfaces(),bh); proxy.doBusiness(); } } 夜深了,今天就先到这里吧,下一次接着学习Spring AOP。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-11-09
关注中
|
|
返回顶楼 | |
发表时间:2006-11-15
wiley:
在matrix也看到你的文章,请问这个proxy有没有通过配置文件实现,不然的话,每次进行日志、权限操作的时候都要进行上述main函数操作 |
|
返回顶楼 | |
发表时间:2006-11-16
呵呵,期待楼主的Spring AOP心得。
|
|
返回顶楼 | |
发表时间:2006-11-21
引用 IBusiness proxy=(IBusiness)Proxy.newProxyInstance(bi.getClass().getClassLoader(),bi.getClass().getInterfaces(),bh);
楼主能不能 详细解释一下这句话 ? 谢谢。 |
|
返回顶楼 | |
发表时间:2006-11-24
lz的
public BusinessProxy(BusinessImple bi){ this.bi=bi; } 传入的参数应该是:IBusiness接口,而不是接口的实现类吧 |
|
返回顶楼 | |
发表时间:2006-12-01
pro_ygw 写道 wiley:
在matrix也看到你的文章,请问这个proxy有没有通过配置文件实现,不然的话,每次进行日志、权限操作的时候都要进行上述main函数操作 spring 的aop就是通过ioc实现配置的。原理上都是一样的,都是通过反射使用动态代理来完成的。 |
|
返回顶楼 | |