如何在Guice1.0中使用AOP
因为项目上需要使用Guice,而Guice并不像Spring那样提供一整套的解决方案(Spring是一个容器,而厌烦了容器的我选择了不属于容器的Guice1.0)。因此,在事务支持方面肯定不是依赖于Guice自己来实现。而我们都知道无论是日志还是事务,使用Aop的方案都是比较好的,而在学习过程中没有发现比较好的材料,于是通过官方的文档,还有Robbie Vanbrabant的书Apress.Google.Guice.Agile.Lightweight Dependency Injection Framework第四章的知识,总结出下面的内容。
?
其中代码示例来自于Robbie的原著,在这里相当于转载。
?
将aopalliance.jar放在Classpath下,我是与Guice-1.0.jar放在一起,程序就可以工作并使用AOP了。
?
1.Guice1.0如何实现Aop
Guice将使用代理的方式包装原来的类(我称之为目标类),为每一个目标类创建一个代理,通过代理实现Aop的功能,而创建的过程只需要通过在Module中绑定就可以完成,因此感觉不出代理类的创建。由于Guice的目标就是帮我们解决类的高效的创建问题,因此,对于代理类的创建应该也是很快的,因为还没有看过Guice的源代码,暂时不清楚其“快”是如何实现的。
?
2.Guice1.0的Aop的作用范围
因为还没有完全使用过Guice的所有功能,目前,我所知道的是Guice1.0仅支持对方法进行Aop操作。而Bob Lee自己也是Aop方面的专家,因此我感觉Guice的后续版本应该会支持更多更灵活的Aop操作。
?
3.Guice1.0是否可用
我看过Guice2.0的规划,与Guice1.0有98%的兼容,并且功能比Guice1.0更加全面,包括Aop的支持,而现在Guice1.0的功能已经足够充当一个完整的IoC框架了,因此现在Guice1.0已经进入了可用的状态。
?
4.Guice1.0在Module中对Aop的配置
import static com.google.inject.matcher.Matchers.only;import static com.google.inject.matcher.Matchers.returns;import static com.google.inject.matcher.Matchers.subclassesOf;import com.google.inject.AbstractModule;public class PhoneModule extends AbstractModule { protected void configure() { bindInterceptor( subclassesOf(Phone.class), returns(only(Receiver.class)), new PhoneLoggerInterceptor(), new PhoneRedirectInterceptor() ); }}?5.这时,在重新发起打电话的操作(执行第三步创建的类),就可以从console中看到输出的结果了。
?
以上就是Guice的一个Aop的例子,在使用的时候还是比较方便简单的,并且速度上也很快,也很容易理解。而Guice的Aop可以对拦截设定范围,具体的范围可以看一下Api文档,比较简洁的几个操作(但基本上都够用了)。
?
有了这种Aop的操作,就可以在一定程度上对系统的日志(非Log4J这种日志),还有事务,权限等操作进行 Aop编程了。
?
再次感谢Robbie和Robbie所做的工作。
?
Thanks for Bob lee's Guice and Robbie's good book: Apress.Google.Guice.Agile.Lightweight Dependency Injection Framework. All code quoted from this book. Thank you, Robbie Vanbrabant.
1 楼 arpenker 2008-11-21 thanks!