Spring Boot 2.x在这里。我目前在@Configuration
类中定义了一堆bean,如下所示:
@Configuration
public class SomeConfig {
@Bean
public Fizz fizz() { ... }
@Bean
public Buzz buzz() { ... }
}
通常,Spring将启动此类并在启动时实例化那些bean。但是,就我而言,我希望Spring在启动时跳过加载此类(并实例化bean),而是以编程方式/按需执行,如下所示:
public void processRequest(SomeRequest request) {
Fizz fizz = SpringAdhocLoader.load(SomeConfig.class, Fizz.class);
Buzz buzz = SpringAdhocLoader.load(SomeConfig.class, Buzz.class);
// use these two beans in this method somehow
}
我有一个非常具体的原因需要执行,这超出了此问题的范围。因此,我非常希望回答“是的,您可以做到的,这就是方法...”或“没有,Spring不能做到的,这就是原因...”,而不是回答/评论问我为什么我要做。相信我,我需要!
最终,我正在寻找一种方法来告诉Spring不要实例化我的
SomeConfig
类中的所有bean,直到我的代码的另一部分明确要创建它们为止。这可能吗?如果可以,怎么办?更新资料
如果
Fizz
看起来像这样:@Component
public class Foobar {
...
}
public class Fizz {
@Autowired
private Foobar foobar;
...
}
即使
@Lazy
上的SomeConfig
注释自动实例化/注入了Fizz
依赖关系,在@Component
上的注释是否仍会保留? 最佳答案
根据您的确切要求,有多种方法可以实现此目的:
如果每个人都应使用同一对象实例,请使用@Lazy
,自动调用销毁回调,并在首次请求Bean时创建对象。
使用寿命较短的@Scope
,例如“ session”或“ request”,如果该范围内的每个人都应使用相同的对象实例,则将自动调用销毁回调,并在首次请求该对象时创建该对象。
如果每个人都应该获得一个新的对象实例,请使用@Scope("prototype")
,并且您愿意手动调用任何销毁回调。
在所有情况下,注入“裸” bean将请求创建该bean。您可以通过注入Provider
来避免这种情况:
class Foo {
@Inject Bar bar; // requests the creation of bar
}
class Foo {
@Inject Provider<Bar> barProvider; // does not cause the creation of bar
void something() {
Bar bar = barProvider.get(); // requests the creation of bar
}
}