JdbcDaoSupport和Spring注解的转换 springdaoJdbcDaoSupport
程序员文章站
2022-03-17 16:48:58
...
今天想玩玩spring注解,实在是out了,注解出来这么久都没怎么用过…… 拿了以前写着玩的project出来试试,第一步当然是把dao层从配置式改成注解式,不过一上来简单一改却碰到个小问题。
配置式时的dao是这么写的
继承自JdbcDaoSupport后,在下面的方法里调用当然是this.getJdbcTemplate()先获取JdbcTempate对象,然后可以做各种xxx数据库交互方法。
而配置文件里则是配的dataSource
然后开始转成注解,本以为加个注解,把xml里注释掉就ok了。于是在某一个dao的实现类里加了一行注解@Repository
运行tomcat后它给我报了一个错: 'dataSource' or 'jdbcTemplate' is required。 看来事情没这么简单…… 看样子是xml里的dataSource bean没有通过注解注入我的dao里。莫非要我自己写set,get吗?于是我试着在BaseDaoImpl里加入以下代码
这代码肯定是有问题的啦,我只是尝试着写一下,然后就发现了一个关键的东西,eclipse给我提示说:Cannot override the final method from JdbcDaoSupport。有点惊讶,我得看看JdbcDaoSupport类了,在类里发现了以下代码
setDataSource方法果然是定义成final,不让我重写……再看了一下其他方法,setJdbcTemplate也定义为final。然后就忽然明白些什么了,说实话以前学习的时候这JdbcDaoSupport东西用就用了,也没去管它是什么,为什么需要这个类。就知道getJdbcTemplate()调用后能操作数据库。而JdbcDaoSupport存在的其中一个原因,就是在配置式时兼容dataSource和jdbcTemplate两个bean,无论你xml里配哪个都可以运行。其实jdbcTemplate才是核心,因为dataSource最终还是转化成jdbcTemplate,源码如下
但是当改用注解式就不行了,因为注解式时一般要用@Autowired来设定注入的bean,首先如果还要用Support类,就必须按照注解式将Support类中的dataSource设置为@Autowired,当然做不了,人家是jar包里的(要做也能做,没有必要)。而且子类里还不能重写set方法。忽然发现脑子秀逗了,既然都要重写set,那还用Support类干嘛呢,直接去掉这个extends关系好了。
然后准备在我的BaseDaoImpl里设定一个dataSource,又一想,改都改了,还要dataSource干嘛,直接用JdbcTemplate就行了。然后就改成
绕了一圈,这样注解的问题就解决了,其实还是一很简单的问题,我了个大去上面写了那么多
最后还有一小步,因为之前所有dao的子类里,都是用的getJdbcTemplate()来获取JdbcTemplate对象的,所以再加一个方法咯。
这样就大功告成了,其实最后发现,这样做就相当于自己实现了一个简单的Support类,如果把源码那个类拿出来当做自己的类来用,加上@Autowired应该也可以,没去试了。而且support类里还有一些其他方法,以后去debug下看看作用。
配置式时的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下看看作用。
上一篇: JS导入eclipse卡死的问题
下一篇: JS导入eclipse卡死的问题
推荐阅读
-
品Spring:对@Autowired和@Value注解的处理方法
-
浅谈Spring中@Import注解的作用和使用
-
Spring框架中 @Autowired 和 @Resource 注解的区别
-
@Autowired 和 @Resource注解, 一个接口有多个实现类的时候Spring注入遇到的问题
-
spring和springmvc的注解总结
-
Spring里面的@Controller和@RestController注解的区别
-
spring配置和注解事务同时存在导致的事务嵌套
-
spring配置和注解事务同时存在导致的事务嵌套
-
spring注解中的@Autowired和@Component基本作用
-
Spring中@Autowired和@Qualifier注解的3个知识点小结