5

我有以下代码 -

道.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>

应用程序上下文.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 来完成。我想知道仅使用注释可以做到的最好的事情。

4

4 回答 4

7

不一定是您正在寻找的答案,但我会使用中间超类来做到这一点。

public abstract class AbstractDao extends NamedParameterJdbcDaoSupport {
    @Autowired
    public void setDataSource(DataSource dataSource) {
        super.setDataSource(dataSource);
    }
}

@Component
public class Dao extends AbstractDao {
}
于 2013-05-24T11:43:36.990 回答
1

在使用 Spring 的 Hibernate 支持时,我已经搜索过类似的东西。如果不继承和覆盖所需的方法,就无法在超类中添加(或更改)连线。或者子类化的声明性方法,并通过 XML 为所需属性提供ref值。

任何不那么“丑陋”的东西都可能不那么透明。所以 Zutty 提出的解决方案最适合这里,因为它消除了在每个 Dao 实现中覆盖的需要。

于 2013-05-24T12:21:24.193 回答
0

如果你的类需要它来工作(它可能在 DAO 中),它应该是构造函数参数而不是属性。由于您是自动装配,因此您都不需要。使其在父级中受到保护并自动装配它。您的孩子将会参考它。

于 2013-05-24T21:53:46.327 回答
0

这可以使用 xml 配置透明地完成。如果你想使用注释,像现在这样调用 super 可能是最好的方法。

于 2013-05-24T11:06:22.563 回答