1

在我的基于弹簧的项目中,我有一个带有类的核心模块('core')

@Component
public class Superclass {
    // stuff
}

在整个代码中按类型注入其中的实例,如下所示:

public class AService {

    @Autowired
    private Superclass superclass;

    // service stuff
}

我还有两个依赖于核心模块的模块,其中一个(我们称之为'module1')扩展了超类

@component
public class Subclass extends Superclass {
    // overridden stuff
}

另一个模块('module2')按原样使用超类

现在我希望当我编译并运行“child1”时,在任何需要超类实例的地方都使用子类的实例。所以我写了一个配置类:

@Configuration
public class Module2Configuration {

    @Bean
    public Superclass superclass(){
        return new Subclass();
    }
}

当我运行它时,我看到超类子类 实例化了,这绝对不是我想要的。如何在“module1”中指定 Spring 应该实例化的类型?

4

3 回答 3

3

您可以使用 @Qualifier("some name") 注释。有关于此的更多信息:http: //blogs.sourceallies.com/2011/08/spring-injection-with-resource-and-autowired/

于 2013-06-05T11:21:10.730 回答
1

Spring 急切地实例化单例 bean,如文档中所述:

默认情况下,作为初始化过程的一部分,ApplicationContext 实现会急切地创建和配置所有单例 bean。

这可以解释为什么两者都@Components被创建。

要指定作为依赖项提供的实现,您可能需要检查能够在不同实现之间进行选择的限定符。结合延迟加载,这应该可以解决问题。

根据您的个人喜好,您还可以使用委托而不是使用分离接口的继承:

public interface MyService {
    public String foobar(int baz);
}

public static class CommonBehavior {
    // whatever is used by Superclass and Subclass
}

@Component @Lazy
public class FormerSuperClass implements MyService {
   private final CommonBehavior ...;
   ...
}

@Component @Lazy
public class FormerSubClass implements MyService {
   private final CommonBehavior ...;
   ...
}

祝你好运!

于 2013-06-05T11:33:44.707 回答
1

有两种方法:使用@Qualifier("SubclassName") 或将您的子类标记为@Component 并在@Autowired 时声明子类

在你的情况下:

  1. 使用 @Qualifier("SubclassName")

    @Component
    public class Superclass {
        // stuff
    }
    
    @component
    public class Subclass extends Superclass {
        // overridden stuff
    }
    
    public class AService {
    
        @Autowired
        @Qualifier("Subclass")
        private Superclass superclass;
    
        // service stuff
    }
    

2.将你的子类标记为@Component,并在@Autowired时声明子类

    public class Superclass {
        // stuff
    }

    @component
    public class Subclass extends Superclass {
        // overridden stuff
    }

    public class AService {

        @Autowired
        private Subclass subclass;

        // service stuff
    }
于 2017-03-15T23:37:20.520 回答