我的开发经验分享(一)-Spring业务bean零配置

系统 1713 0

 注:在JavaEye注册不久,前些天这篇文章发布在了blog首页,似乎大家都在论坛活动多,因此转移到论坛这边分享

关键字: spring 动态bean管理 零配置

1. Spring业务bean配置的困扰

    利用Spring IoC 容器进行项目开发的一个重要工作就是在 applicationContext.xml 中进行bean管理。然而,业务bean(BO或Service),DAO bean的配置量随项目的功能规模增长而增长,对于大型项目而言,庞大的 bean配置文件维护起来极为痛苦。例如:

  1. <!-- 业务对象 -->         
  2. < bean   id = "authService"   parent = "baseTransactionProxy" >         
  3.      < property   name = "target" >         
  4.          < bean   class = "com.sr.jsfuser.service.AuthorityService" >         
  5.              < property   name = "authDao"   ref = "authDao"   />         
  6.          </ bean >         
  7.      </ property >         
  8. </ bean >         
  9.         
  10. < bean   id = "userService"   parent = "baseTransactionProxy" >         
  11.      < property   name = "target" >              
  12.          < bean   class = "com.sr.jsfuser.service.pojo.UserService" >         
  13.              < property   name = "userDao"   ref = "userDao"   />         
  14.          </ bean >         
  15.      </ property >         
  16. </ bean >         
  17. <!-- 数据访问对象 -->         
  18. < bean   id = "authDao"   class = "com.sr.jsfuser.dao.jdbc.AuthorityDao" >         
  19.      < property   name = "dataSource"   ref = "dataSource"   />         
  20. </ bean >         
  21.         
  22. < bean   id = "userDao"   class = "com.sr.jsfuser.dao.jdbc.UserDao" >         
  23.      < property   name = "dataSource"   ref = "dataSource"   />         
  24. </ bean >       

上例为两个功能的配置,鉴权(auth)和用户(user)。这种Service bean和DAO bean 的管理方式是按功能的管理方式,即one by one,配置量是
         F=f(n)
   

   其中 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原理有以下要点:
1) 利用了Spring ApplicationContext 的 registerBeanDefinition方法和动态bean注册技术;
2) 作为bean管理的一个规范:要求Service类实现 setDAO(DAO dao)方法,以便统一注入dao实例;
3) 作为bean管理的一个规范:调用 dao.setDatasource(datasource)方法进行数据源注入;
4) 作为bean管理的一个规范:内部使用className作为 service bean 和dao bean的内部id;
5) 作为bean管理的一个规范:ServiceFactory内获取bean实例时,都采用prototype scope


ServiceFactory内部实现序列图如下:



使用ServiceFactory 进行业务开发,代码如下:



UserService userService = (UserService)ServiceFactory.createService(UserService.class); User user = userService.findUser("admin");
              
                 

                
                  这样,第一节中列出的spring配置片段中大量的业务bean配置将不再需要,使得配置工作量大大减少。
                
              
            

至于事务管理,即可使用向service注入transactionManager; 也可以使用 Spring 的
    org.springframework.transaction.interceptor.TransactionInterceptor ,
    org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator,
    org.springframework.aop.support.NameMatchMethodPointcutAdvisor
     三者配合,将 *Service类的 特定方法纳入事务范围。我们项目中使用的是后者,更为简便和松耦.


3. 通用的动态Bean管理(自定义BeanFactory类)   

     在上例中,注意新增了一个BeanFactory,区别于Spring 的 BeanFactory 接口。自定义 BeanFactory 通过 createBean(className) 进行动态bean注册和创建,
        

Object bean = BeanFactory.createBean(UserService.class);
      

    相当于替代了Object bean = new UserService();

  这相当于替代了 Java语言级的 new Object() ,并且使得类实例和Spring容器关联了起来,这样使用Spring的AOP配置就可以极为方便的对bean进行控制。(而上例中的ServiceFactory是该项目中利用BeanFactory的特定封装,其他项目的ServiceFactory实现可能不同,可参考实现)

4. JDK问题

     以上方案主要针对1.4。 但同样适用1.5及以上。有朋友说,1.5中用 annotation + <context:component-scan/>标签也能完成类似的工作,但那样需要在 Java 代码中写很多 annotation , 个人不偏好使用 annotation ,因为它相当于xml配置移到了 Java代码中,并且维护不方便。

我的开发经验分享(一)-Spring业务bean零配置


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论