Предположим, у нас есть простое @Configuration
:
@Configuration
public class FooBarConfiguration {
@Bean
public Foo createFoo() {
return new FooImpl();
}
@Bean
@Autowired
public Bar createBar(Foo foo) {
return new BarImpl(foo);
}
}
Этот класс может использоваться с AnnotationConfigApplicationContext
для создания Foo
и Bar
экземпляров:
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
, и мы хотим создать Foos и Bars через Spring с этим самым экземпляром . Есть ли способ сделать это?
Как создать настроенные аннотации bean-компонентов с существующим экземпляром объекта конфигурации?
пс. С 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());