最佳答案
使用 Spring 的 Java Config,我需要获取/实例化一个原型范围的 bean,其构造函数参数只能在运行时获得。考虑下面的代码示例(为了简洁而简化) :
@Autowired
private ApplicationContext appCtx;
public void onRequest(Request request) {
//request is already validated
String name = request.getParameter("name");
Thing thing = appCtx.getBean(Thing.class, name);
//System.out.println(thing.getName()); //prints name
}
Thing 类的定义如下:
public class Thing {
private final String name;
@Autowired
private SomeComponent someComponent;
@Autowired
private AnotherComponent anotherComponent;
public Thing(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
注意,name
是 final
: 它只能通过构造函数提供,并保证不变性。其他依赖项是 Thing
类的特定于实现的依赖项,不应该知道它们与请求处理程序实现(紧密耦合)。
这段代码与 Spring XML 配置工作得非常好,例如:
<bean id="thing", class="com.whatever.Thing" scope="prototype">
<!-- other post-instantiation properties omitted -->
</bean>
如何使用 Java 配置来实现同样的功能呢? 以下内容不适用于 Spring3.x:
@Bean
@Scope("prototype")
public Thing thing(String name) {
return new Thing(name);
}
现在,我创建一个 Factory,例如:
public interface ThingFactory {
public Thing createThing(String name);
}
但是那个 打破了使用 Spring 替换 ServiceLocator 和 Factory 设计模式的整个要点,对于这个用例来说是理想的。
如果 Spring Java Config 可以做到这一点,我就可以避免:
对于 Spring 已经通过 XML 配置支持的琐碎事情来说,这是一项繁重的工作(相对而言)。