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

Java 我可以用@Autowire注释继承的最终属性吗?,java,spring,annotations,ibatis,Java,Spring,Annotations,Ibatis,解决方案:不,我不再扩展原始父级 原件: 有没有办法注释继承的finalsetter方法?我正在扩展一个类,它有一个最终的setter,我想用Spring@Autowire。父类来自库,无法修改 我发现的一个解决方法是编写一个代理方法,但这似乎需要做更多的工作 public abstract class SqlMapClientDaoSupport ... { public final void setSqlMapClient(SqlMapClient smc) { ..

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

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

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

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对象 这延伸了一个共同点。每把刀都需要同样的 属性集,并且每个属性都需要配置为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。

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

我觉得您不应该试图设置最终字段

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

您是否设置了SqlMapClientFactoryBean对象


请参见

否,无法对继承的final方法进行注释


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

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

在超类上注释方法的语法是什么,而无需在子类中重新说明它是吗?是的,我可以在applicationConfig.xml中配置MyClass。之所以希望使用@Autowire,是因为同一个包中的几个类都需要相同的属性集。我已经更新了原始问题,您可以使用“摘要”查看“bean定义。至少这样,您不必在每个bean中声明属性,您所需要做的就是将抽象bean作为父bean引用。使用注释方法的问题是您需要访问源代码。该字段是最终字段,不是为了防止设置它,而是为了防止重写它的行为。正是我的SqlMapClientFactoryBean让Spring使用@Autowired传入。