Предположим, мы имеем простой @Configuration
:Как создать настроенные аннотации компоненты с существующим экземпляром @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
и используйте его для производства фолов и баров.
Теперь предположим, что мы уже имеем экземпляр из FooBarConfiguration
, и мы хотим создать FOOS и бары через Spring с это очень экземпляра. Есть ли способ сделать это?
Как создать компоненты, сконфигурированные с аннотациями, с существующим экземпляром объекта конфигурации?
пс. С помощью 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());
Вам не нужна аннотация '@ Inject' на' createBar'. – whiskeysierra
Правильно! Также как пример @Autowired in Spring. Я довольно новичок в конфигурации на основе аннотаций, я в основном хардкор oldschool Spring XML config guy. :) – lexicore
Зачем вам нужно использовать существующий экземпляр класса конфигурации, а не новый?Возможно, есть еще один способ достичь вашей цели ... – meriton