2009-06-18 73 views
5

解决方法:不,我不再延长原始父级。我可以使用@Autowire注解继承的最终财产吗?

原创:
有没有一种方法来注释一个继承的final setter方法?我正在扩展一个有final二传手的课程,我想用@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:以上示例修改以反映用例:
用例正在执行DAO对象为iBATIS /弹簧 延伸的共同base class。每个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" /> 

我没有在annotation guide看到一个如何诠释不到哪里声明以外的 属性/成员。我希望这是 但我错过了。

编辑2:我不再延长SqlMapClientDaoSupport类,而不是我的AccountDao是实现什么正在支持类提供什么功能的POJO。这使我可以随意使用@Autowire。

+0

当你尝试时会发生什么? – skaffman 2009-06-18 10:35:22

+0

在没有在子类中重新声明它的情况下,如何在超类上注解方法的语法是? – Chadwick 2009-06-18 20:27:11

回答

0

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

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

2

您是否尝试过使用xml进行配置?因为它是一个看起来不能更改的现有类,所以它是使用xml进行配置的明确候选者。然后,你可以指定它为自动连接”,甚至配置在XML属性。

+0

是的,我可以在applicationConfig.xml中配置MyClass。使用@Autowire的愿望 是因为相同包中的几个类每个 都需要相同的属性集。我更新了原始问题 – Chadwick 2009-06-18 20:28:25

0

这听起来像你对我不应该试图建立一个最终场。

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

你有没有设置一个对象的SqlMapClientFactoryBean?

见​​

0

你可以用params创建一个新的构造函数,用于所有最终的构造函数,然后调用构造函数中的setter。