精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-09-11
(原创文章)1. Spring业务bean配置的困扰利用Spring IoC 容器进行项目开发的一个重要工作就是在 applicationContext.xml 中进行bean管理。然而,业务bean(BO或Service),DAO bean的配置量随项目的功能规模增长而增长,对于大型项目而言,庞大的 bean配置文件维护起来极为痛苦。例如:
<!-- 业务对象 --> <bean id="authService" parent="baseTransactionProxy"> <property name="target"> <bean class="com.sr.jsfuser.service.AuthorityService"> <property name="authDao" ref="authDao" /> </bean> </property> </bean> <bean id="userService" parent="baseTransactionProxy"> <property name="target"> <bean class="com.sr.jsfuser.service.pojo.UserService"> <property name="userDao" ref="userDao" /> </bean> </property> </bean> <!-- 数据访问对象 --> <bean id="authDao" class="com.sr.jsfuser.dao.jdbc.AuthorityDao"> <property name="dataSource" ref="dataSource" /> </bean> <bean id="userDao" class="com.sr.jsfuser.dao.jdbc.UserDao"> <property name="dataSource" ref="dataSource" /> </bean>
上例为两个功能的配置,鉴权(auth)和用户(user)。这种Service bean和DAO bean 的管理方式是按功能的管理方式,即one by one,配置量是 其中 n 是项目中功能的数量。上例虽充分体现了Spring IoC容器依赖注入的优良特性,但配置量过大,维护和管理难度很大,不是一种最佳实践。
2. 零配置的动态Service Bean管理(ServiceFactory)
有没有一种既能发挥Spring优势,又能节省配置的模式呢?我们可以观察到,每个功能的Service bean的配置,只有 dao 注入是不同的,其他如Service类的命名,Service的事务管理器注入,Service类和DAO类的命名关系等都具有相似性或者完全相同;dao bean配置类似。 因此,可以采用动态bean管理(Dynamic Bean Management)思想简化业务bean配置。动态bean管理使用新定义的 ServiceFactory 的createService方法来创建业务类Service实例, ServiceFactory 在创建时,自动进行dao创建,datasource注入等,不再需要进行bean的配置。原理如下图所示。
ServiceFactory原理有以下要点:
使用ServiceFactory 进行业务开发,代码如下:
UserService userService = (UserService)ServiceFactory.createService(UserService.class); User user = userService.findUser("admin");
这样,第一节中列出的spring配置片段中大量的业务bean配置将不再需要,使得配置工作量大大减少。 至于事务管理,即可使用向service注入transactionManager; 也可以使用 Spring 的
3. 通用的动态Bean管理(自定义BeanFactory类) 在上例中,注意新增了一个BeanFactory,区别于Spring 的 BeanFactory 接口。自定义 BeanFactory 通过 createBean(className) 进行动态bean注册和创建,
Object bean = BeanFactory.createBean(UserService.class);
4. 开发包下载 spring-beanext.jar - 用于bean的动态创建。 开发指南:BeanFactory.createBean(UserService.class); 默认创建的是prototype;
4. 附录: AOP式事务配置 请参考我下一次的日志。
参考资料: 1. Spring 2.0.6 官方文档和源代码。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-09-11
不灵,绑在Spring上,不易于测试。
|
|
返回顶楼 | |
发表时间:2008-09-11
为什么不用annotation呢?
<context:component-scan base-package="abc.xyz"/> 这样一行就解决了你的问题了 |
|
返回顶楼 | |
发表时间:2008-09-12
fcoffee 15 小时前
为什么不用annotation呢? 文章中的设计主要源于项目采用的是WAS 6.0 ,weblogic 8.0,只能支持 JDK1.4,annotation暂时还无法使用。 不过,即便在 1.5 下, 我个人也不喜欢 用 annotation。 楼下网友 fcoffee 提到的配置 <context:component-scan base-package="abc.xyz"/> 看似简单,实际上在Java类 Service,DAO中仍要写很多 annotation注释,而且同样需要开发对应的Annotation类,相当于将xml配置变为了 annotation而已,工作量依然没有减少。 而文中的模式不再需要任何业务bean的配置。 话说回来,而annotation实质上是一种硬编码,耦合度过大,有变动的时候,修改维护起来仍是一件痛苦的事。 |
|
返回顶楼 | |
发表时间:2008-09-12
java的注释出来很久了,可是我从来不喜欢用(可能是我不习惯用吧,哈哈或者是不会用)
|
|
返回顶楼 | |
发表时间:2008-09-12
不认为是好方法:
1:没有基于接口编程,破坏了面向对象的基本原则 2:不好测试,业务逻辑类或Action类的测试依赖于ServiceFactory 这样做的话,就走EJB2.X的老路了,依赖对象的查询需要自己做,虽然在你写的代码中要容易一些 建议你去看一本书:Expert One-on-One J2EE Development without EJB中文版 你这种做法,在第6章 轻量级容器与控制反转 中有介绍 |
|
返回顶楼 | |
发表时间:2008-09-12
raymond2006k 写道 fcoffee 15 小时前
为什么不用annotation呢? 文章中的设计主要源于项目采用的是WAS 6.0 ,weblogic 8.0,只能支持 JDK1.4,annotation暂时还无法使用。 不过,即便在 1.5 下, 我个人也不喜欢 用 annotation。 楼下网友 fcoffee 提到的配置 <context:component-scan base-package="abc.xyz"/> 看似简单,实际上在Java类 Service,DAO中仍要写很多 annotation注释,而且同样需要开发对应的Annotation类,相当于将xml配置变为了 annotation而已,工作量依然没有减少。 而文中的模式不再需要任何业务bean的配置。 话说回来,而annotation实质上是一种硬编码,耦合度过大,有变动的时候,修改维护起来仍是一件痛苦的事。 使用 <context:component-scan base-package="com.company.demo.dao"> <context:include-filter type="regex" expression=".*Service"/> </context:component-scan> |
|
返回顶楼 | |
发表时间:2008-09-22
引用 不灵,绑在Spring上,不易于测试。 我觉得既然用了spring就多多使用她已经帮我们完成的东西,不要自己再去实现,如果做项目一味考虑解偶没有意义,万事都有度。 其实你说的service实现上有annotation对你移植没有任何影响。 |
|
返回顶楼 | |
浏览 4816 次