繁体   English   中英

使用Spring注释注入父类依赖项的正确方法

[英]Proper way to inject parent class dependencies with Spring annotations

我有以下代码 -

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来完成。 我想知道仅使用注释可以做到的最好。

不一定是你要找的答案,但我会用中级超级班做这个。

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

@Component
public class Dao extends AbstractDao {
}

在使用Spring的Hibernate支持时,我搜索了类似的东西。 没有子类化并覆盖所需方法,就无法在超类中添加(或更改)布线。 value for the desired properties via XML. 或者通过XML子类化并为所需属性提供值的声明性方法。

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

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

如果您的类需要工作(并且它可能在DAO中),那么它应该是构造函数参数而不是属性。 既然你是自动装配,你也不需要。 使其在父级中受到保护并自动装配它。 你的孩子会参考它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM