- 浏览: 969253 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
qq_15946053:
基于spring的项目要导出成jar怎么做呢用eclipse的 ...
Spring项目导出可运行的JAR -
flyfeifei66:
baseservice、dao代码是同一个,但是实例配置多个, ...
Spring通过父类注入公用属性的技巧 -
yuechao4039:
写得不错,望楼主再接再厉
Spring中配置和读取多个Properties文件 -
xinglianxlxl:
psubscribe对我有用
Jedis的Publish/Subscribe功能的运用 -
Fenix87:
js中怎么调用配置文件的参数呢
Spring中配置和读取多个Properties文件
XML配置方式提取父类
在使用Spring + Hibernate框架,或者SSH2等框架的时候,在开发中只有一个基本的DAO是现在的非常流行的做法。然后,在看过多份这种代码以后,都是在每个业务类中声明了一个DAO属性,并且在Bean配置中,对每个业务类分别注入DAO。具体情形示例如下:
BaseDAO代码:
public class BaseDAO { public String service() { return "Success!"; } }
Services代码:
//第一个业务类 public class ServiceA { public String service() { return baseDAO.service(); } protected BaseDAO baseDAO; public void setBaseDAO(BaseDAO baseDAO) { this.baseDAO = baseDAO; } } //第二个业务类 public class ServiceB { public String service() { return baseDAO.service(); } protected BaseDAO baseDAO; public void setBaseDAO(BaseDAO baseDAO) { this.baseDAO = baseDAO; } }
Spring的Bean配置如下:
<bean id="baseDAO" class="com.watson.BaseDAO" /> <bean id="serviceA" class="com.watson.ServiceA"> <property name="baseDAO" ref="baseDAO" /> </bean> <bean id="serviceB" class="com.watson.ServiceB"> <property name="baseDAO" ref="baseDAO" /> </bean>
这样的做法是现在的主流。这样做不是说那里错了,还是那句老话:这样做肯定不优美,谁让人有时候是一根筋呢?
能够想到的办法是用一个父类来包含一些业务层公用的业务逻辑和属性。所以可以将上面的代码和配置。
Services代码改写如下:
//所有业务类的父类 public class BaseService { protected BaseDAO baseDAO; public void setBaseDAO(BaseDAO baseDAO) { this.baseDAO = baseDAO; } } //第一个业务类 public class ServiceA extends BaseService { public String service() { return baseDAO.service(); } } //第二个业务类 public class ServiceB extends BaseService { public String service() { return baseDAO.service(); } }
Spring的Bean配置改写如下:
<bean id="baseDAO" class="com.watson.BaseDAO" /> <bean id="BaseService" class="com.watson.BaseService" /> <property name="baseDAO" ref="baseDAO" /> </bean> <bean id="serviceA" class="com.watson.ServiceA" /> <bean id="serviceB" class="com.watson.ServiceB" />
这样一来是不简洁了很多?尤其在实际项目有太多Bean的时候。然后,这里不会达到我们预想的结果,因为这里会出现如下的错误:
exception: org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException ...... root cause: java.lang.NullPointerException:......
而出错代码就是每个业务中调用baseDAO的那行代码。这说明注入失败了。翻阅Spring的Bean注入详解之后,很快就可以找应该设置子类Bean配置的parent属性。所以这里可以修改设置。
Spring的Bean配置改写如下:
<bean id="baseDAO" class="com.watson.BaseDAO" /> <bean id="BaseService" class="com.watson.BaseService" /> <property name="baseDAO" ref="baseDAO" /> </bean> <bean id="serviceA" class="com.watson.ServiceA" parent="baseService" /> <bean id="serviceB" class="com.watson.ServiceB" parent="baseService" />
这个时候再运行,就不会报错了。原理是:在Spring的子类Bean配置中,其parent属性作用是指定其父类,并继承父类的注入属性。不仅如此,子类还可以修改或者覆盖父类的属性值。例如上述代码中的子类修改父类的baseDAO到属性:
<bean id="BaseService" class="com.watson.BaseService" /> <property name="baseDAO" ref="baseDAO" /> </bean> <bean id="serviceA" class="com.watson.ServiceA" parent="baseService" /> <property name="baseDAO" ref="baseDAO2" /> </bean>
而对于父类的List等集合属性,子类可以继承父类的值,并且在其基础上进行增加新的值:
<bean id="BaseService" class="com.watson.BaseService" /> <property name="listValue"> <list> <value>listValue1</value> <value>listValue2</value> </list> </property> </bean> <bean id="serviceA" class="com.watson.ServiceA" parent="baseService" /> <property name="listValue"> <list> <value>listValue3</value> <value>listValue4</value> </list> </property> </bean>
Annotation方式提取父类
上面的方法是在XML配置文件中进行的配置。而对现在Spring3流行的Annotation方式,其实更加的方便,完整示例如下:
BaseDAO代码:
@Component public class BaseDAO { public String service() { return "Success!"; } }
Services代码:
//所有业务类的父类 public class BaseService { @Autowired protected BaseDAO baseDAO; } //第一个业务类 @Component public class ServiceA extends BaseService { public String service() { return baseDAO.service(); } } //第二个业务类 @Component public class ServiceB extends BaseService { public String service() { return baseDAO.service(); } }
Action层代码:
@Controller @RequestMapping(value = "/testaction") public class TestAction { @Autowired private ServiceA service; @RequestMapping(value = "/") public @ResponseBody String home(Model model) { return service.service(); } }
这里根本就不需要进行parent属性子类的配置,可以完美的提取父类,并且可以顺利的使用父类的公用属性。至于原理,没有去看源码的处理方式,估计和上述XML配置是异曲同工的,只是在这里增加了对父类的检测。
评论
<bean id="BaseService2" class="com.watson.BaseService" />
<property name="baseDAO2" ref="baseDAO2" />
</bean>
<bean id="baseDAO2" class="com.watson.BaseDAO" >
数据源属性
</bean>
这样完成不同的基类service访问不同的数据源,这样做可以吗?
发表评论
-
Spring项目导出可运行的JAR
2013-09-05 20:01 16224一、在使用MAVEN的打包插件。 1.背景 ... -
Spring Security3实践总结
2013-07-22 18:12 19194在线项目最近要对管理系统进行细粒度的权限控 ... -
Spring中配置和读取多个Properties文件
2013-05-31 16:45 61515一个系统中通常会存在如下一些以Properties形式存在 ... -
Spring多数据源的配置和使用(2)
2012-11-22 11:40 18673本文以Spring2.5 + Hibernat ... -
Spring定时任务的多种使用方法总结
2012-08-04 17:34 10379这里使用的是Spring2.5,需要的jar包:sprin ... -
Spring多数据源的配置和使用(1)
2012-08-04 14:51 22570最近开发一个数据同步的小功能,需要从A主机的Ora ... -
Spring3 MVC
2012-04-24 17:16 0个人学习参考所用,勿喷! 1.搭建一个基于S ... -
Spring3 MVC的最佳实践和理解(9)
2012-04-25 09:10 2490个人学习参考所用,勿喷! 9.创建一个资源多种实现的 ... -
Spring3 MVC的最佳实践和理解(8)
2012-04-25 09:10 2285个人学习参考所用,勿喷! 8.Bean的注解式 ... -
Spring3 MVC的最佳实践和理解(7)
2012-04-25 09:09 4083个人学习参考所用, ... -
Spring3 MVC的最佳实践和理解(6)
2012-04-25 09:09 1990个人学习参考所用, ... -
Spring3 MVC的最佳实践和理解(5)
2012-04-24 17:01 22019个人学习参考所用, ... -
Spring3 MVC的最佳实践和理解(4)
2012-04-24 16:59 4779个人学习参考所用,勿喷! 4.区域解析和外部化区 ... -
Spring3 MVC的最佳实践和理解(3)
2012-04-24 16:56 4471个人学习参考所用,勿喷! 3.使用拦截器 Sp ... -
Spring3 MVC的最佳实践和理解(2)
2012-04-24 16:55 5037个人学习参考所用,勿 ... -
Spring3 MVC的最佳实践和理解(1)
2012-04-24 16:53 3724个人学习参考所用,勿喷! 1.搭建一个基 ... -
Spring RESTful服务接收和返回JSON最佳实践
2012-04-16 17:13 108452个人学习参考所用,勿喷! 返回JSON ... -
Spring的JNDI数据源连接池配置示例及Spring对JNDI实现分析
2012-04-10 16:00 89418个人学习参考所用,勿喷! 在使用 Tomcat服 ... -
Spring属性注入和构造函数注入参考
2012-02-25 23:23 4379个人学习参考所用,勿喷! 1.Pojo如下: ...
相关推荐
主要介绍了Spring使用@Autowired为抽象父类注入依赖代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
NULL 博文链接:https://bijian1013.iteye.com/blog/2299135
Spring注解注入属性
1.spring 普通属性注入 2.xml中 map集合标签与其他标签不通-- 3.用junit测试
主要为大家详细介绍了Spring boot工具类静态属性注入,及多环境配置详解,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
spring各种属性的注入 spring各种属性的注入 spring各种属性的注入
Spring中事务的传播属性详解,Spring中事务的传播属性详解
在spring中,当属性是由工厂方法创造的,而不是用new关键字实例化的,就需要在applicationContext.xml配置工厂方法,是spring容器为我们自动注入属性
一个spring设值注入的例子,自己也是初学者。希望高手都知道啊……
Spring Boot系列四 Spring @Value 属性注入使用总结一
spring注入方式 set注入 构造注入 自动注入
模拟Spring IOC 自己实现依赖注入 自己的Spring 自己的代码模拟spring的依赖注入 自己写的 绝对独一无二
我们学习了spring框架spring框架里面有3个优势第一个是轻量级的IOC也叫控制反转后来改名为DI也叫依赖注入,依赖注入里面有3中注入方法分别是set注入,构造器注入,注解注入,我传的是set注入的视频
Spring属性注入:关于Spring的属性注入一共有两种方式,分别为XML方式与注解方式,其中XML方式又分为Set注入与构造方法注入,注解方式分为java注解与Spring注解
本项目为Java项目,使用Spring实现依赖注入,实现采用ApplicationContext,不再直接使用XmlBeanFactory方式。适合初学者了解Spring依赖注入的实现。
主要给大家介绍了关于spring boot中几种注入方法的一些个人看法,文中通过示例代码介绍的非常详细,对大家学习或者使用spring boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
知识共享-Spring注入属性值案例(雷惊风).
NULL 博文链接:https://gary0416.iteye.com/blog/890689
通过java代码模拟spring的依赖注入
spring练习 刚刚学spring,做了个小小小项目,来加深理解。... ·其他依赖注入属性,都使用property 元素确定参数值。 Person.java PersonFactory.java Chinese.java American.java bean.xml SpringTest.java