(原创文章)
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-cloud-config + spring-cloud-bus-amqp实现分布式集群配置动态更新,可更新实例对象,包含源码包+Rabbitmq安装包和安装说明
spring注解开发使用教程--Bean加载控制(二)案例代码
spring-cloud-config-eureka-bus:配置中心和消息总线示例(配置中心终结版) gateway-service-zuul:Spring Cloud Zuul使用初级篇 网关 均衡负载 spring-cloud-zuul:Spring Cloud Zuul使用高级篇 Filter 鉴权 熔断...
开发工具 spring-beans-4.3.6.RELEASE开发工具 spring-beans-4.3.6.RELEASE开发工具 spring-beans-4.3.6.RELEASE开发工具 spring-beans-4.3.6.RELEASE开发工具 spring-beans-4.3.6.RELEASE开发工具 spring-beans-...
spring bean配置 运行环境:eclipse 构建工具:maven 不提供maven构建,maven用来解决jar包的依赖
spring-beans-5.1.0.RELEASE,最新spring-bean jar包。
【框架源码篇 04】Spring源码手写篇-Bean定义配置化
spring-aop-4.1.6.RELEASE.jar spring-aspects-4.1.6.RELEASE.jar spring-beans-4.1.6.RELEASE.jar spring-context-4.1.6.RELEASE.jar spring-context-support-4.1.6.RELEASE.jar spring-core-4.1.6.RELEASE.jar ...
Spring Boot使用spring-data-jpa配置Mysql多数据源,可用版本
NULL 博文链接:https://jijun87120681.iteye.com/blog/1399235
spring-**beans**-4.3.6.RELEASE.jar:所有应用都要用到的jar包,它包含访问配置文件.创建和管理bean以及进行Inversion ofContro(IOC )或者Dependency injection(DL)操作相关的所有类 spring-**cntext**-4.3.6....
spring-beans-5.1.8.RELEASE.jar //配置、创建、管理Bean,负责Ioc、DI spring-context-5.1.8.RELEASE.jar //提供在基础IoC上的扩展服务 spring-expression-5.1.8.RELEASE.jar //提供对Spring表达式语言的支持
Spring4--2.bean注解和AOP
Spring-data-redis 1.7.6 & source源码
spring-context-3.2.4.RELEASE.jar spring-core-3.2.4.RELEASE.jar spring-beans-3.2.4.RELEASE.jar spring-test-3.2.4.RELEASE.jar spring-web-3.2.4.RELEASE.jar spring-aop-3.2.4.RELEASE.jar spring-webmvc-...
2018-02-08从git_hub上拉取的Spring源码打成的jar,构建Spring-beans5.0以上源码所缺失的两个jar包spring-cglib-repack-3.2.6.jar,spring-objenesis-repack-2.6.jar
spring data jpa的包。spring-data-commons-1.8.0.RELEASE.jar
spring-framework-4.2.4.RELEASE-dist;官网不好下载了。这里分享下资源给大家,完整的spring开发jar包源码包,说明文档,全都有,最新版本不断更新中。
spring-data-commons-1.7.2.RELEASEspring-data-jpa-1.5.2.RELEASE-java datajpa
spring-framework-2.0-with-dependencies.zip spring-framework-2.0-with-dependencies.zip spring-framework-2.0-with-dependencies.zip spring-framework-2.0-with-dependencies.zip spring-framework-2.0-with-...