JdbcDaoSupport配合@Repository无法注入DataSource
来源:互联网 发布:打谱软件overture教程 编辑:程序博客网 时间:2024/05/29 18:51
JdbcDaoSupport
和@Repository
配合使用的时候,会出现DataSource
无法注入的问题,Google+查看源码,发现JdbcDaoSupport
的设计可能有点问题,或者说不适合配合注解使用。
通常来说,我们首先会有配置DataSource
的xml,这是必不可少的。
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder><bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"> <property name="driverClassName" value="${jdbc.driverClassName}"></propert> <property name="url" value="${jdbc.url}"></property> <property name="username" value="${jdbc.username}"></property> <property name="password" value="${jdbc.password}"></property></bean>
然后我们会有一个Dao接口,定义了数据库访问层(DAL)的操作:
import java.util.List;public interface StudentDao { List<Student> findAllStudents();}
最后该我们创建DaoImpl了,创建DaoImpl概括可以分为两种方式:
1. xml配置方式。
xml首先配置一个JdbcTemplate bean
,再配置一个StudentDaoImpl bean
,并将JdbcTemplate bean
通过xml配置的方式注入到StudentDaoImpl bean
里。
2. 注解方式。
通过@Repository
注解的方式配置StudentDaoImpl bean
。
我个人不太喜欢xml配置的方式,因为bean较多的话会把xml搞的很冗长,看起来头疼。所有一般我都是采用注解的方式来注入bean,这样xml会比较简洁,只需要配一下扫描路径即可。
这里就说一下在使用@Repository
配合JdbcDaoSupport
会出现的问题(xml配置方式不会出现)。
我们看下JdbcDaoSupport
部分源码:
public abstract class JdbcDaoSupport extends DaoSupport { private JdbcTemplate jdbcTemplate; /** * Set the JDBC DataSource to be used by this DAO. */ public final void setDataSource(DataSource dataSource) { if (this.jdbcTemplate == null || dataSource != this.jdbcTemplate.getDataSource()) { this.jdbcTemplate = createJdbcTemplate(dataSource); initTemplateConfig(); } } ...
实质上JdbcDaoSupport
只是一个帮助类,就是帮助我们注入DataSource
的,我们完全可以自己在DaoImpl实现类中自己加上一个DataSource
或者JdbcTemplate
的变量,然后@Autowired
或@Inject
进来,而不用继承JdbcDaoSupport
类.
这里值得注意一点是setDataSource
这个方法是final
的,在子类中无法重写,这样就导致
注解方式无法注入(@Inject
或@Autowired
)DataSource
,如:
@Repositorypublic class JdbcStudentDao extends JdbcDaoSupport implements StudentDao { //Error, cannot override the final method from JdbcDaoSupport @Autowired public void setDataSource(DataSource dataSource){ this.setDataSource(dataSource); } @Override public List<Student> findAllStudents() { List<Student> students = getJdbcTemplate().query("select * from student", new RowMapper<Student>() { @Override public Student mapRow(ResultSet rs, int rowNum) throws SQLException { long id = rs.getLong("id"); String name = rs.getString("name"); String address = rs.getString("address"); int age = rs.getInt("age"); long phone = rs.getLong("phone"); Student student = new Student(); student.setAddress(address); student.setAge(age); student.setId(id); student.setName(name); student.setPhone(phone); student.setTeacherId(rs.getLong("teacherId")); return student; } }); return students; }}
所以,JdbcDaoSupport
配合注解使用就会出现无法注入的问题。已经有人向Spring提了issue要求去掉final
修饰符,但是给到的回复是won’t fix
。==!。
网上有人提供了解决方案,To quickly fix it, uses @PostConstruct to inject the dataSource like this :
@Repositorypublic class UserDetailsDaoImpl extends JdbcDaoSupport implements UserDetailsDao { @Autowired private DataSource dataSource; @PostConstruct private void initialize() { setDataSource(dataSource); } ...}
如果这样去注入DataSource
的话,JdbcDaoSupport
存在的意义又是什么呢?还不如直接在DaoImpl里注入JdbcTemplate
bean来的直接。
参考资料:
- Spring JdbcDaoSupport源码
- How to autowire DataSource in JdbcDaoSupport
- JdbcDaoSupport配合@Repository无法注入DataSource
- Spring中JdbcDaoSupport的DataSource注入问题
- 关于DAO实现类继承JdbcDaoSupport类后,使用注解无法注入DataSource的问题
- 解决Spring框架的Dao层改用@Repository注解,无法使用JdbcDaoSupport的问题
- Spring JdbcDaoSupport的注入问题JdbcTemple
- spring datasource 注入
- Spring之DataSource注入 .
- 注释方式注入datasource
- Spring入门11 - DataSource注入
- jdbc dao 注入 dataSource 失败
- spring的datasource的注入
- Spring-data-mongodb中@Document的重要性(解决Mongodb与redis共存时无法注入Repository)
- 通过 XML 实现 DataSource(数据源)注入
- AWVS10_Acunetix_Web_Vulnerability_Scanner教程-扫描配合sql进行注入
- Spring+JdbcDaoSupport
- JdbcDaoSupport应用
- JdbcDaoSupport应用
- JdbcDaoSupport应用
- C语言关键字const用法
- bash:command not found解决方法
- JAVA中去掉空格
- 高性能WEB服务器——之Jetty (N)I/O组件
- JAVA List 迭代遍历案例
- JdbcDaoSupport配合@Repository无法注入DataSource
- LaTeX中文支持(Debian/Ubuntu,pdfLaTeX)
- [RK3288][Android6.0] 调试笔记 --- Activity多次调用finish()引起的Warning
- gulp为项目文件添加版本号
- LibUsbDotNet的简单理解:Read Write(Poll)
- 适配器模式
- ES6解构赋值详解
- hadoop之zookeeper
- MTK-JTAG接口