`
white_crucifix
  • 浏览: 95648 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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下看看作用。
分享到:
评论

相关推荐

    _Spring_使用 JdbcTemplate和JdbcDaoSupport.rar

    Spring_使用 JdbcTemplate和JdbcDaoSuppor所需架包

    spring的JdbcDaoSupport的一些用法示例

    NULL 博文链接:https://fsh430623.iteye.com/blog/940988

    尚硅谷佟刚Spring4代码及PPT.rar

    FactoryBean 配置 Bean、通过注解配置 Bean、泛型依赖注入、AOP 基础、前置通知、后置通知、返回通知、异常通知、环绕通知、切面的优先级、切点表达式、使用 XML 文件的方式配置 AOP、使用 JdbcTemplate 和 ...

    Spring3.0MVC注解+SringJdbcDaoSupport案例

    Spring3.0MVC注解+SringJdbcDaoSupport案例,前端包括批量伤处,SpringAop声明式事务控制的配置等信息

    JdbcDaoSupport类的使用

    String框架中的JdbcDaoSupport类的使用

    Spring 代理 Aop 实现原理讲解.docx

     IoC原理分析  基于XML的IoC实现 ... Spring AOP基于XML和注解的实现  Spring应用之Spring JDBC实现  Spring应用之JdbcDaoSupport  Spring应用之事务支持  Spring与Mybatis整合

    08课 Spring5讲义(2018.8.5).docx

    spring 知识点,非常重要, IoC原理分析 ... Spring AOP基于XML和注解的实现  Spring应用之Spring JDBC实现  Spring应用之JdbcDaoSupport  Spring应用之事务支持  Spring与Mybatis整合

    spring.doc

    Spring容器IOC和di的整个启动过程: 38 3.8 spring中的继承 38 拓展spring为类中的属性赋值: 40 小结: 47 面向接口编程: 47 4 面向切面编程 52 4.1 代理模式 52 代理模式拓展: 52 4.1.1 JDK动态代理 58 JDK动态...

    Spring JdbcDaoSupport 批量插入数据

    NULL 博文链接:https://huibin.iteye.com/blog/618316

    Spring持久化模板总结

    总结对比了Spring对JDBCTemplate和SpringTemplate的整合使用方法,尤其JdbcDaoSupport和HibernateDaoSupport的使用方法

    Spring MVC+SimpleJdbcDaoSupport增删改查小例子

    NULL 博文链接:https://qindongliang.iteye.com/blog/1998799

    Spring 入门到实战

    在Spring中配置Bean、自动装配、Bean之间的关系(依赖、继承)、Bean的作用域、使用外部属性文件、SpEL、管理Bean的生命周期、通过工厂方法配置Bean、通过注解配置Bean、注解方式AOP基础、前置通知、后置通知、返回...

    HibernateDaoSupport与JdbcDaoSupport

    HibernateDaoSupport与JdbcDaoSupport总结

    SPRING API 2.0.CHM

    JdbcDaoSupport JdbcOperations JdbcTemplate JdbcTransactionObjectSupport JdbcUpdateAffectedIncorrectNumberOfRowsException JdbcUtils JdkDynamicAopProxy JdkRegexpMethodPointcut JdkVersion ...

    Java Web程序设计教程

    14.2spring和hibernate的整合 279 14.2.1spring对hibernate的支持 279 14.2.2管理sessionfactory 279 14.2.3hibernate的dao实现 281 14.2.4使用hibernatetemplate 281 14.2.5管理hibernate事务 282 14.3项目...

    Javashop开发规范V2.2

    在实合格bean和数据库对照过程中,数据库机制需要识别主键,所以需要我们在主键的对应属性的Geter方法中加上@PrimaryKeyFiled注解,如: private Integer brand_id @PrimaryKeyField public Integer getBrand_id() ...

Global site tag (gtag.js) - Google Analytics