gpt4 book ai didi

spring - 如何使用@Configuration的现有实例创建注释配置的Bean?

转载 作者:行者123 更新时间:2023-12-01 01:33:42 25 4
gpt4 key购买 nike

假设我们有一个简单的@Configuration:

@Configuration
public class FooBarConfiguration {

@Bean
public Foo createFoo() {
return new FooImpl();
}

@Bean
@Autowired
public Bar createBar(Foo foo) {
return new BarImpl(foo);
}
}

此类可与 AnnotationConfigApplicationContext一起使用以生成 FooBar实例:
final ApplicationContext applicationContext =
new AnnotationConfigApplicationContext(FooBarConfiguration.class);

final Foo foo = applicationContext.getBean(Foo.class);
final Bar bar = applicationContext.getBean(Bar.class);
assertSame(foo, bar.getFoo());

在上面的示例中,Spring将创建一个新的 FooBarConfiguration实例,并使用它来生成Foos和Bars。

现在假设我们已经有一个 FooBarConfiguration实例,并且我们想通过Spring使用这个实例创建Foos和Bars。有没有办法做到这一点?

如何使用现有配置对象实例创建注释配置的Bean?

ps。使用Google Guice,该解决方案很简单:
public class FooBarConfiguration implements Module {

@Provides
@Singleton
public Foo createFoo() {
return new FooImpl();
}

@Override
public void configure(Binder binder) {
}

@Provides
@Inject
@Singleton
public Bar createBar(Foo foo) {
return new BarImpl(foo);
}
}

final FooBarConfiguration fooBarConfiguration = ...; // Our instance

final Injector injector = Guice.createInjector(fooBarConfiguration);
final Foo foo = injector.getInstance(Foo.class);
final Bar bar = injector.getInstance(Bar.class);
assertSame(foo, bar.getFoo());

最佳答案

这是不可能的,因为Spring的@Configuration的某些功能需要类增强,而这不能在现有实例上完成。

例如,您可以按以下方式重写您的配置:

@Configuration 
public class FooBarConfiguration {

@Bean
public Foo createFoo() {
return new FooImpl();
}

@Bean
public Bar createBar() {
return new BarImpl(createFoo());
}
}

并且您仍然会获得一个完全初始化的 Foo实例,因为对 createFoo()的调用将被拦截。

关于spring - 如何使用@Configuration的现有实例创建注释配置的Bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3250390/

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