gpt4 book ai didi

java - spring如何实例化一个@Autowired构造函数而不传递参数

转载 作者:行者123 更新时间:2023-12-02 10:40:24 27 4
gpt4 key购买 nike

假设我有这门课

class Foo implements IFoo { Foo() {} }
class Fooz implements IFoo { Fooz() {}}

class Foobar implement IFoobar {
@Autowired
Foobar (Foo foo) {}
}

class Foobarz implement IFoobar {
@Autowired
Foobarz (Bar bar) {}
}

在一个简单的情况下,我可以解决我的问题:

class Bar {
@Autowired
Bar (IFoo foo) {
this.foo = foo;
}
}

但是,如果我希望能够根据我的配置文件选择 IFoo 和 IFoobar 实例,我需要这样做:

@Configuration
class Configuration {
@Bean
foo () {
return this.isZ() ? new Fooz() : new Foo ();
}
@Bean
foobar () {
return this.isZ() ? new Foobarz(/* ??????? */) : new Foobar (/* ??????? */);
}
}

如您所见,我无法实例化我的 Foobar,因为我需要另一个 bean。我知道有 ApplicationContext.getBean,但我无法确定当调用 foobar() 时它确实会在我的 Configuration 类中初始化。

而且我也不想调用 this.foo() ,因为这会创建该对象的另一个引用,并且我不确定执行和初始化的顺序

最佳答案

在您的情况下,以下应该可以解决问题

@Configuration
class Configuration {
@Bean
IFoo foo() {
return this.isZ() ? new Fooz() : new Foo ();
}
@Bean
IFoobar foobar(IFoo foo) { // IFoo bean declared above will be injected here by Spring
return this.isZ() ? new Foobarz(foo) : new Foobar(foo);
}
}

已更新

但更优雅的方法是将 @Service@Component 注释放在您的类上(@Bean 声明应该是不过从配置中删除了)...

package com.foobarpkg.maybeanotherpkg;

@Service
class Foobar implement IFoobar {
@Autowired
Foobar (IFoo foo) { // not that interface should be used here instead of concrete class (Foo/Fooz)
}
}

...并让 Spring 知道它的包位于

@Configuration
@ComponentScan(basePackages = {"com.foobarpkg"})
class Configuration {
@Bean
IFoo foo() {
return this.isZ() ? new Fooz() : new Foo ();
}
// foobar bean is no longer declared here
}

关于java - spring如何实例化一个@Autowired构造函数而不传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52950872/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com