【问题标题】:Inject spring dependency in abstract super class在抽象超类中注入spring依赖
【发布时间】:2011-05-13 10:40:42
【问题描述】:

我需要使用 Spring 框架在抽象超类中注入依赖项。

class A extends AbstractClassB{ 
    private Xdao daox ;
    ...
    public setXdao() { ... }
}

class AbstractClassB{
    ..
    private yDao  daoy;
    public seyYdao() { ... }
}

每次实例化抽象类 B 时,我都需要传递超类依赖项(在我的项目中可以以 100 种方式对其进行子类化)

application.xml 中的条目(spring 上下文文件)

<bean id="aClass" class="com.mypro.A" 
    <property name="daox" ref="SomeXDaoClassRef" /> 
    <property name="daoy" ref="SomeYDaoClassRef"/>
</bean>

如何在 application.xml 中创建超类 AbstractClassB 的 bean 引用,以便在所有子类 bean 创建中使用它?

【问题讨论】:

    标签: spring dependency-injection


    【解决方案1】:

    您可以创建一个抽象 bean 定义,然后“子类型化”该定义,例如

    <bean id="b" abstract="true" class="com.mypro.AbstractClassB">
        <property name="daox" ref="SomeXDaoClassRef" /> 
    </bean>
    
    <bean id="a" parent="b" class="com.mypro.A">
        <property name="daoy" ref="SomeYDaoClassRef" /> 
    </bean>
    

    严格来说,b 的定义甚至不需要你指定类,你可以省略:

    <bean id="b" abstract="true">
        <property name="daox" ref="SomeXDaoClassRef" /> 
    </bean>
    
    <bean id="a" parent="b" class="com.mypro.A">
        <property name="daoy" ref="SomeYDaoClassRef" /> 
    </bean>
    

    但是,为了清楚起见并让您的工具有更好的机会帮助您解决问题,通常最好将其保留。

    Section 3.7 of the Spring Manual 讨论 bean 定义继承。

    【讨论】:

    • 如果我的父类不是抽象类而是具体类,那么忽略父类中的 abstract=true 并在子类中仅声明父类仍然有效吗?
    【解决方案2】:

    您可以使用 Spring 的 abstract 标志来告诉 Spring 一个类是抽象的。然后所有具体的实现都可以简单地将这个 bean 标记为它们的 parent bean。

    <bean id="abstractClassB" class="AbstractClassB" abstract="true">
      <property name="yDao" ref="yDao" />
    </bean>
    
    <bean id="classA" class="A" parent="abstractClassB">
      <property name="xDao" ref="xDao" />
    </bean>
    

    【讨论】:

    • 你的意思是parent而不是extends
    【解决方案3】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-01
      • 2018-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-10
      • 1970-01-01
      相关资源
      最近更新 更多