【发布时间】:2011-03-16 02:09:57
【问题描述】:
假设我们有一个简单的@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 的instance,并且我们想通过 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());
【问题讨论】:
-
你不需要
createBar上的@Inject注解。 -
对!以及 Spring 示例中的 @Autowired。我对基于注释的配置相当陌生,我主要是一个顽固的老派 Spring XML 配置专家。 :)
-
为什么需要使用配置类的现有实例而不是新实例?也许还有另一种方法可以实现您的目标...
-
@meriton:简短的回答是因为我试图将一些基于 Guice 的 DI 东西从 Guice 移植到 Spring。一个更长的答案是,这种方法允许对 bean 创建过程进行更多的编程控制。这是一个例子。假设您有一个创建 HTTP 服务器(如 Jetty)的 bean 工厂,您需要做的就是提供一个端口。并且您的应用程序希望在运行时决定此端口。比较“Guice 方式”和“Spring 方式”——Guice 实例级配置似乎更加优雅。
标签: spring dependency-injection annotations guice