我有以下代码 -
Dao.java
@Component
public class Dao extends NamedParameterJdbcDaoSupport {
}
dbContext.xml
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${db.driver}" />
<property name="url" value="${db.jdbc.url}" />
<property name="username" value="${db.user}" />
<property name="password" value="${db.password}" />
</bean>
的applicationContext.xml
<context:component-scan base-package="com.kshitiz" />
问题是NamedParameterJdbcDaoSupport
需要数据源才能工作。
既然这是超类的属性而不是我自己的类,我能想到的唯一方法就是 -
@Component
public class Dao extends NamedParameterJdbcDaoSupport {
@Autowired
public void setDataSource(DataSource dataSource) {
super.setDataSource(dataSource);
}
}
这非常难看。我可以指定我想要自动装配我的bean的所有属性吗?像 -
这样的东西@Component(default-autowire="byType")
public class Dao extends NamedParameterJdbcDaoSupport {
}
春天有可能吗?或者注入超类依赖项的最优雅方式是什么?
修改 我已经知道这可以使用我目前正在使用的XML来完成。我想知道仅使用注释可以做到的最好。
答案 0 :(得分:6)
不一定是你要找的答案,但我会用中级超级班来做。
public abstract class AbstractDao extends NamedParameterJdbcDaoSupport {
@Autowired
public void setDataSource(DataSource dataSource) {
super.setDataSource(dataSource);
}
}
@Component
public class Dao extends AbstractDao {
}
答案 1 :(得分:1)
在使用Spring的Hibernate支持时,我搜索了类似的东西。没有子类化并覆盖所需方法,就无法在超类中添加(或更改)布线。或者通过XML子类化并为所需属性提供 ref 值的声明性方法。
任何不那么“丑陋”的东西都可能不太透明。所以Zutty提出的解决方案最适合这里,因为它消除了在每个Dao实现中覆盖的需要。
答案 2 :(得分:0)
这可以使用xml配置透明地完成。如果你想使用注释,那么现在调用super就像是最好的方法。
答案 3 :(得分:0)
如果您的类需要工作(并且它可能在DAO中),它应该是构造函数参数而不是属性。既然你是自动装配,你也不需要。使其在父级中受到保护并自动装配它。你的孩子会参考它。