今天想玩玩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和JdbcDaoSuppor所需架包
NULL 博文链接:https://fsh430623.iteye.com/blog/940988
FactoryBean 配置 Bean、通过注解配置 Bean、泛型依赖注入、AOP 基础、前置通知、后置通知、返回通知、异常通知、环绕通知、切面的优先级、切点表达式、使用 XML 文件的方式配置 AOP、使用 JdbcTemplate 和 ...
Spring3.0MVC注解+SringJdbcDaoSupport案例,前端包括批量伤处,SpringAop声明式事务控制的配置等信息
String框架中的JdbcDaoSupport类的使用
IoC原理分析 基于XML的IoC实现 ... Spring AOP基于XML和注解的实现 Spring应用之Spring JDBC实现 Spring应用之JdbcDaoSupport Spring应用之事务支持 Spring与Mybatis整合
spring 知识点,非常重要, IoC原理分析 ... Spring AOP基于XML和注解的实现 Spring应用之Spring JDBC实现 Spring应用之JdbcDaoSupport Spring应用之事务支持 Spring与Mybatis整合
Spring容器IOC和di的整个启动过程: 38 3.8 spring中的继承 38 拓展spring为类中的属性赋值: 40 小结: 47 面向接口编程: 47 4 面向切面编程 52 4.1 代理模式 52 代理模式拓展: 52 4.1.1 JDK动态代理 58 JDK动态...
NULL 博文链接:https://huibin.iteye.com/blog/618316
总结对比了Spring对JDBCTemplate和SpringTemplate的整合使用方法,尤其JdbcDaoSupport和HibernateDaoSupport的使用方法
NULL 博文链接:https://qindongliang.iteye.com/blog/1998799
在Spring中配置Bean、自动装配、Bean之间的关系(依赖、继承)、Bean的作用域、使用外部属性文件、SpEL、管理Bean的生命周期、通过工厂方法配置Bean、通过注解配置Bean、注解方式AOP基础、前置通知、后置通知、返回...
HibernateDaoSupport与JdbcDaoSupport总结
JdbcDaoSupport JdbcOperations JdbcTemplate JdbcTransactionObjectSupport JdbcUpdateAffectedIncorrectNumberOfRowsException JdbcUtils JdkDynamicAopProxy JdkRegexpMethodPointcut JdkVersion ...
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项目...
在实合格bean和数据库对照过程中,数据库机制需要识别主键,所以需要我们在主键的对应属性的Geter方法中加上@PrimaryKeyFiled注解,如: private Integer brand_id @PrimaryKeyField public Integer getBrand_id() ...