使用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
}
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
注意事项name是final:它只能通过构造函数来提供,并保证不变性.其他依赖项是Thing类的特定于实现的依赖项,并且不应该知道(紧密耦合到)请求处理程序实现.
此代码与Spring XML配置完美配合,例如:
<bean id="thing", class="com.whatever.Thing" scope="prototype">
<!-- other post-instantiation properties omitted --> …Run Code Online (Sandbox Code Playgroud) 我使用Spring的@Component注释来配置Spring 3.0应用程序中的许多bean.我想知道是否可以懒惰地构建一些这些豆 - 尤其是prototype豆类?
我确实使用 Spring 和 Lombok。
如果没有原型 bean,我们必须传递目标类需要的依赖项。
我们如何将 bean 标记为原型并正确处理依赖 bean 和构造函数参数?
选项 1 - 没有原型 bean
@Component @RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class Consumer {
private final SomeDependency iDontNeed; // Consumer class doesn't need
private final SomeDependency2 iDontNeed2;
public void method() {
new Processor("some random per request data", iDontNeed, iDontNeed2);
}
....
@Value @RequiredArgsConstructor
public class Processor {
private final String perRequestInputData;
private final SomeDependency iReallyNeed;
private final SomeDependency2 iReallyNeed2;
}
Run Code Online (Sandbox Code Playgroud)
选项 2 - 原型 bean
@Component @RequiredArgsConstructor(onConstructor = @__(@Autowired))
public …Run Code Online (Sandbox Code Playgroud)