(原创文章)
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,配置量是
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. 开发包下载
spring-beanext.jar - 用于bean的动态创建。
开发指南:BeanFactory.createBean(UserService.class); 默认创建的是prototype;
如果需要创建singleton,需要调用BeanFactory.createBean(UserService.class,true);
4. 附录:
AOP式事务配置 请参考我下一次的日志。
参考资料:
1. Spring 2.0.6 官方文档和源代码。
- 大小: 18 KB
- 大小: 4.9 KB
分享到:
相关推荐
在本项目中,Spring作为容器,管理着所有Bean的生命周期,通过XML配置文件或Java配置类来定义Bean的创建、初始化、销毁等过程。同时,Spring MVC作为其Web层组件,处理HTTP请求,实现业务逻辑和视图的解耦。 二、...
《Spring Boot 2.0 参考指南》 Spring Boot 是一个由 Pivotal 团队提供的全新框架,其设计目标是为了简化 ...《Spring Boot 2.0 参考指南》将详细讲解这些特性和更多实践技巧,是学习和掌握 Spring Boot 的重要资料。
通过MyBatis-Spring,我们可以将MyBatis的Mapper配置为Spring的Bean,从而利用Spring的依赖注入特性,使数据库操作更加简洁和可测试。 在"spring-mybatis-spring-2.1.0.zip"这个资源包中,包含了Spring与MyBatis...
1. MyBatis-Spring:这是一个连接Spring和MyBatis的桥梁,它提供了一套便捷的配置和API,使得Spring管理的Bean可以直接与MyBatis的SqlSession交互,无需手动处理SqlSession的生命周期。 2. Spring的DataSource:...
《Spring Boot集成Activiti实战详解》 在现代企业级应用开发中,流程管理扮演着至关重要的...通过深入学习和实践这个项目,开发者能够更好地理解和掌握Activiti在Spring Boot中的应用,以及业务流程建模和转换的技巧。
总结起来,"Spring-Demo-2.zip" 提供了一个实战平台,帮助我们理解并掌握 Spring AOP 的核心概念和实践技巧。通过这个示例,开发者可以更好地学习如何利用 Spring AOP 实现代码的模块化和解耦,提高代码的可维护性和...
- **最佳实践和示例**:提供了一系列的实际应用场景和最佳实践,帮助开发者更好地应用Spring框架。 通过阅读《Spring2.5-中文参考手册》,开发者不仅可以学习到Spring的基础知识,还能了解到各种实战技巧和解决常见...
在IT行业中,Spring框架是Java开发者的首选工具之一,它为构建高效、可维护的应用提供了强大的支持。...在`ssmdemo`项目中,开发者可以参考上述步骤进行实践,从而掌握Spring与Redis集群整合的技巧。
4. **最佳实践**:Spring的源码实践了许多Java的最佳实践,如异常处理、资源管理等,是提升编程技巧的宝贵资源。 总的来说,深入学习Spring Framework 5.2.9.RELEASE的源码,不仅可以帮助我们更好地利用这个框架,...
《自己动手写Spring框架》是一份详实的学习资料,涵盖了从IOC(Inversion of Control,...通过学习和实践这些代码,你不仅可以理解Spring的工作原理,还能提升自己的编程技巧,为阅读和理解Spring源码打下坚实基础。
在Spring中,我们可以通过配置XML或使用Java配置类来管理Bean的生命周期和依赖关系。 2. **MyBatis**:MyBatis是一个持久层框架,它允许开发者将SQL语句写在XML映射文件或者Mapper接口中,通过简单的API进行数据...
2. Core模块:提供了ApplicationContext接口,它是Spring的IoC容器,用于加载配置并管理bean的生命周期。 三、Data Access/Integration(数据访问/集成) 1. JDBC模块:提供了一种抽象层,简化了JDBC的使用,避免...
初学者可以从官方文档、在线教程和实战书籍入手,逐步熟悉并掌握Spring的核心概念和实践技巧。随着经验的增长,可以进一步研究Spring Data、Spring Security等高级主题,提升自己的开发能力。 总结,Spring ...
### Spring配置全书知识点概述 ...综上所述,《Spring配置全书》不仅涵盖了Spring框架的基础配置知识,还深入探讨了高级配置技巧和最佳实践,是Java开发人员学习和使用Spring框架不可或缺的参考资料。
1. **Spring配置文件**:包含XML、Java配置或注解配置,定义了bean及其依赖关系。 2. **模拟bean的定义**:通过@MockBean或Mockito创建模拟对象,并指定它们的行为。 3. **测试类**:使用Spring Test和Mockito编写...
7. **IoC(控制反转)与DI(依赖注入)**: Bean类在Spring等框架中常作为依赖注入的对象,通过配置文件或注解方式,可以在运行时自动装配Bean的依赖,提高代码的灵活性和可测试性。 8. **序列化与反序列化**: 如果...
本文将通过分析"spring-boot-sample"这个样例项目,深入探讨 Spring Boot 的核心概念和实践技巧。 首先,"spring-boot-sample"项目名称暗示这是一个用于演示 Spring Boot 功能的实例。在实际开发中,这样的样例代码...
在IT行业中,消息队列(Message Queue)是分布式系统中常用的一种组件,它主要用于解耦应用程序,提高...通过深入学习和实践,你可以熟练掌握RabbitMQ与Spring的整合技巧,为你的项目带来高效、稳定的异步通信能力。
2. **配置Spring**:编写bean定义,定义Service和DAO接口及其实现类,配置数据源,以及事务管理。 3. **配置Struts**:编写struts.xml配置文件,定义Action类,指定请求路径和处理方法。 4. **配置MyBatis**:创建...
开发者可以在配置文件中定义Bean及其依赖关系,由Spring自动创建和管理Bean,降低了组件之间的耦合度。 三、面向切面编程(AOP) Spring的AOP模块支持声明式事务管理、日志记录、性能监控等多种切面功能。3.2.0...