Spring study 1-AOP 动态代理学习
In Beijing on 2007-6-10
最近开始了学习Spring,再学习和实现中遇到了一些问题,记录下来希望大家共同探讨。
曾经在以前了解过Spring的一些相关内容,学习了它的一些思想,但是不曾深入学习以及进行实践。在上个月参加完成软考以后,在平时有了些空闲时间,便有了再次学习spring的计划。本次学习主要的参考书籍为 Spring in action,通过学习中遇到的种种问题,记录下来,以便可以回顾自己的学习的过程。
我们知道Spring提供了代理功能,可以很好的支持AOP编程。实现代理功能有两种方式,一种为声明ProxyFactoryBean代理类,定义它的Target属性,再通过interceptorNames属性定义其各种切面(采用Spring in action 中的翻译方式)。此方式可以灵活的调整各个配置参数,不足的地方为我们不能如此劳累的定义每一个需要在Spring中使用的bean。第二种代理方式为声明BeanNameAutoProxyCreator类,同ProxyFactoryBean一样定义其interceptorNames属性,再通过beanNames属性定义其匹配的代理类型,从而实现自动为配置文件中匹配beanNames属性的bean实现代理功能。
在Spring in action 书中,定义了一个简单的例子,也没有提供完整的代码,另外对具体应用范围也没有很清除的进行阐述。这里依据我做的一些试验进行补充说明。
1、 实现自动代理必须通过ApplicationContext接口类进行才可以,不能通过BeanFactory方式实现。(注-没有进一步研究,但是直接通过BeanFacotry装配是不可以实现的)
2、 被实现代理的Bean可以是使用接口的类,也可以是没有实现接口的普通类,但如果你的类实现了接口,你必须使用接口声明方式从ApplicationContext获取Bean,没有实现接口类的Bean则直接通过类声明的方式获取Bean。这里存在一个问题,如果你的类实现了某个接口,但是一些不是实现接口的方法则无法使用自动代理的功能(是否有些不太灵活)。
3、 使用接口方式实现自动代理是直接采用jdk方式实现的,而采用类方式则是使用cglib类库实现,因此需要在类路径中加入cglib类库文件。
4、 在spring的1.2版本,还发现了一个bug,我声明的Advise(通知,采用Spring in action 译法),在实现自动代理中,Advise本身把自己也给代理了,在版本2以后,看来已经修复了此问题。