5

解决方案:不,我不再扩展原始父级。

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

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

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 对象,这些对象扩展了一个公共基类。每个 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 对象,我无法复制/粘贴这些对象。

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

我在注释指南中看不到如何注释除声明位置之外的属性/成员。我希望这是我所缺少的。

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

4

4 回答 4

2

你试过用xml配置它吗?因为它是一个看起来无法更改的现有类,所以它是使用 xml 配置它的明确候选者。然后可以将其指定为“自动装配”,甚至可以在 xml 中配置属性。

于 2009-06-18T10:44:32.037 回答
0

在我看来,您不应该尝试设置最终字段。

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

您是否设置了 SqlMapClientFactoryBean 对象?

这里寻求帮助

于 2009-06-22T11:28:01.410 回答
0

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

SqlMapClientDaoSupport我没有扩展支持类(

于 2009-09-15T04:07:56.850 回答
0

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

于 2010-02-11T23:28:11.393 回答