利用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,配置量是
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 进行业务开发,代码如下:
至于事务管理,即可使用向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代码中,并且维护不方便。
相关推荐
- **作者简介**:Craig Walls是一位经验丰富的软件开发者,具有超过13年的开发经验,涉及通信、金融等多个领域。他是Spring框架的忠实支持者,曾撰写《Spring in Action》等书籍,并在多个场合分享Spring相关的技术...
书中可能涵盖如何配置Spring容器、创建bean、实现AOP、处理数据访问、构建Web应用等多个主题,并结合作者的实际项目经验分享最佳实践和技巧。对于想要掌握Spring的开发者来说,这是一份宝贵的资源。
10. **最佳实践**:除了技术讲解,作者还会分享Spring开发的最佳实践,帮助读者提升开发效率,编写出高质量、可维护的代码。 《Spring in Action》这本书对于希望深入理解并掌握Spring框架的开发者来说是一本不可或...
《JavaEE开发的颠覆者:Spring Boot实战》一书深入探讨了Spring Boot这一JavaEE开发领域的革新框架。Spring Boot以其简化配置、快速启动和高效运行的特性,成为了现代企业级应用开发的首选工具。本节将围绕Spring ...
- **SpringCloud Gateway优质参考博客**:社区博客通常包含实践案例和经验分享,可以帮助开发者解决实际问题。 SpringCloud Gateway通过其强大的路由和过滤器机制,为微服务架构提供了一种高效的API管理解决方案。...
SSH是Java开发中常见的三大框架——Struts2、Spring和Hibernate的缩写,它们分别用于MVC模式的展现层、业务层管理和数据持久层操作。这个压缩包包含了一个完整的SSH集成项目的配置文件和源代码,适合初学者进行学习...
《Spring框架中文文档详解》 Spring框架是Java开发领域中不可或缺的重要组成部分,它...在学习过程中,不断查阅源码、参与社区讨论,以及参考其他开发者的经验分享,将有助于你更好地掌握Spring,提升自己的开发技能。
#### 六、实战经验分享 - 本书还包含了许多作者在实际项目中的经验和心得,这些实践经验对于读者理解和应用Spring MVC非常有帮助。 总之,《Spring MVC中文教程》是一本非常适合初学者的指南,它不仅详细介绍了...
Spring框架在此中的作用主要体现在两方面:一是管理Bean,通过XML或注解方式定义Bean及其依赖关系,实现Bean的自动装配;二是提供事务管理,确保数据操作的一致性。在与Hibernate集成时,Spring可以管理Hibernate的...
- **Spring 框架概述**:Spring 是一个开源框架,它为 Java 应用程序提供了一种轻量级的方式来管理和组织业务对象。Spring 通过依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented Programming, ...
Spring MVC是一个流行的Java框架,用于开发Web应用程序,遵循MVC(Model-View-Controller)设计模式。...这显示了Spring MVC社区的活跃度和开发者之间的互助精神,有助于开发者快速解决问题并分享经验。
- 社区论坛: 用户可以在这里提问和分享经验。 - 示例代码: 包含了Spring与JBPM集成的完整示例。 #### 六、总结 通过Spring与JBoss JBPM的集成,可以构建出灵活、可靠的工作流管理系统。这不仅能够提高业务流程的...
BeanPostProcessor接口是Spring中实现开闭原则的一个重要工具,允许开发者在Spring容器初始化Bean前后进行自定义操作,增强了框架的可扩展性。作者探讨了如何利用BeanPostProcessor实现特定的业务逻辑,以及在两个...
本书内容主要来自作者多年的软件开发和教学、培训经验,通过实例由浅入深地介绍MyEclipse的基本应用,是一本强调实践技能的实用性指导图书。 本书内容丰富、技术全面、案例实用,而且所有的实例都以MyEclipse工程的...
1. **Spring框架基础**:Spring是Java企业级应用程序开发中的一个关键框架,它提供了依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented Programming, AOP)的核心特性,有助于简化项目结构,...
Spring框架是Java开发中的核心组件,它为应用程序提供了一个全面的基础设施,支持bean的依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)以及数据访问等众多功能。本套"Spring培训课件PPT格式"旨在帮助学习...