我可以用@Autowire注释一个继承的最终属性吗?

时间:2009-06-18 10:27:28

标签: java spring annotations ibatis

决议:不,我不再延长原来的父母。

原件:
有没有办法注释继承的final setter方法?我正在扩展一个具有final setter的类,我希望@Autowire使用Spring。父类来自库,无法修改。

我找到的解决方法是编写一个代理方法,但这似乎比必要的工作更多。

public abstract class SqlMapClientDaoSupport ... {
    public final void setSqlMapClient(SqlMapClient smc) {
        ...
    }
}

@Component
public class AccountDao extends SqlMapClientDaoSupport {
    // all this just to annotate an existing method?
    @Autowire
    public final void setSqlMapClientWorkaround(SqlMapClient smc) {
        super.setSqlMapClient(smc);
    }
}

编辑1: 以上示例已修改以反映用例:
用例是为Ibatis / Spring实现DAO对象 它扩展了一个共同的base class。每个DAO都需要相同的 属性集,每个都需要配置为bean。我现在 通过在applicationContext.xml中单独配置每个来完成此操作。

<bean id="accountDAO" 
  class="com.example.proj.dao.h2.AccountDAOImpl"
  p:sqlMapClient-ref="sqlMapClient" />
<bean id="companyDAO" 
  class="com.example.proj.dao.h2.CompanyDAOImpl"
  p:sqlMapClient-ref="sqlMapClient" />
<!-- etc... -->

我更愿意使用组件扫描来发现和自动装配DAO 对象自动,我无法复制/粘贴botch。

<context:component-scan base-package="com.example.proj.dao.h2" />

我没有在annotation guide中看到如何注释a 财产/会员以外的地方。我希望是的 我失踪的东西。

编辑2: 我不再扩展SqlMapClientDaoSupport类,而是我的AccountDao是一个POJO,它实现了Support类提供的少量功能。这允许我随意使用@Autowire。

4 个答案:

答案 0 :(得分:2)

您是否尝试过使用xml进行配置?因为它是一个看起来你无法改变的现有类,所以它是用xml配置它的明确候选者。然后你可以将它指定为autowire“,甚至可以在xml中配置属性。

答案 1 :(得分:0)

听起来我不应该试图设置最终的领域。

通常有一个很好的理由为什么字段是最终的。

您是否设置了SqlMapClientFactoryBean对象?

请参阅here for help

答案 2 :(得分:0)

不,没有办法注释继承的最终方法。

我没有扩展支持类(SqlMapClientDaoSupport),而是在我的项目中重新实现它(它的行为很小)根据需要注释方法,并且我的DAO扩展了该支持类。

答案 3 :(得分:0)

你可以为所有最终的setter和@Autowired构造函数创建一个带有params的新构造函数,然后在构造函数中调用setter。