JdbcDaoSupport和Spring注解的转换

今天想玩玩spring注解,实在是out了,注解出来这么久都没怎么用过……  拿了以前写着玩的project出来试试,第一步当然是把dao层从配置式改成注解式,不过一上来简单一改却碰到个小问题。

配置式时的dao是这么写的
public class BaseDaoImpl<T> extends JdbcDaoSupport

继承自JdbcDaoSupport后,在下面的方法里调用当然是this.getJdbcTemplate()先获取JdbcTempate对象,然后可以做各种xxx数据库交互方法。

而配置文件里则是配的dataSource
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
...
...
</bean>
<bean id="personDao" class="com.xxx.dao.impl.PersonDaoImpl">
	<property name="dataSource" ref="dataSource" />
</bean>


然后开始转成注解,本以为加个注解,把xml里注释掉就ok了。于是在某一个dao的实现类里加了一行注解@Repository
@Repository(value="personDao")
public class PersonDaoImpl extends BaseDaoImpl<Person> implements PersonDao

运行tomcat后它给我报了一个错: 'dataSource' or 'jdbcTemplate' is required。  看来事情没这么简单…… 看样子是xml里的dataSource bean没有通过注解注入我的dao里。莫非要我自己写set,get吗?于是我试着在BaseDaoImpl里加入以下代码
public class BaseDaoImpl<T> extends JdbcDaoSupport{
public void setDataSource(DataSource datasource){
	super.setDataSource(dataSource);
}
.
.
}

这代码肯定是有问题的啦,我只是尝试着写一下,然后就发现了一个关键的东西,eclipse给我提示说:Cannot override the final method from JdbcDaoSupport。有点惊讶,我得看看JdbcDaoSupport类了,在类里发现了以下代码
public final void setDataSource(DataSource dataSource) {
	if (this.jdbcTemplate == null || dataSource != this.jdbcTemplate.getDataSource()) {
		this.jdbcTemplate = createJdbcTemplate(dataSource);
		initTemplateConfig();
	}
}

setDataSource方法果然是定义成final,不让我重写……再看了一下其他方法,setJdbcTemplate也定义为final。然后就忽然明白些什么了,说实话以前学习的时候这JdbcDaoSupport东西用就用了,也没去管它是什么,为什么需要这个类。就知道getJdbcTemplate()调用后能操作数据库。而JdbcDaoSupport存在的其中一个原因,就是在配置式时兼容dataSource和jdbcTemplate两个bean,无论你xml里配哪个都可以运行。其实jdbcTemplate才是核心,因为dataSource最终还是转化成jdbcTemplate,源码如下
protected JdbcTemplate createJdbcTemplate(DataSource dataSource) {
	return new JdbcTemplate(dataSource);
}

但是当改用注解式就不行了,因为注解式时一般要用@Autowired来设定注入的bean,首先如果还要用Support类,就必须按照注解式将Support类中的dataSource设置为@Autowired,当然做不了,人家是jar包里的(要做也能做,没有必要)。而且子类里还不能重写set方法。忽然发现脑子秀逗了,既然都要重写set,那还用Support类干嘛呢,直接去掉这个extends关系好了。
然后准备在我的BaseDaoImpl里设定一个dataSource,又一想,改都改了,还要dataSource干嘛,直接用JdbcTemplate就行了。然后就改成
public class BaseDaoImpl<T>{
	@Autowired
	private JdbcTemplate jdbcTemplate;


绕了一圈,这样注解的问题就解决了,其实还是一很简单的问题,我了个大去上面写了那么多
最后还有一小步,因为之前所有dao的子类里,都是用的getJdbcTemplate()来获取JdbcTemplate对象的,所以再加一个方法咯。
public class BaseDaoImpl<T>{
	@Autowired
	private JdbcTemplate jdbcTemplate;
	
	public JdbcTemplate getJdbcTemplate() {
		return this.jdbcTemplate;
	}


这样就大功告成了,其实最后发现,这样做就相当于自己实现了一个简单的Support类,如果把源码那个类拿出来当做自己的类来用,加上@Autowired应该也可以,没去试了。而且support类里还有一些其他方法,以后去debug下看看作用。

猜你喜欢

转载自white-crucifix.iteye.com/blog/1771850
今日推荐