使用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配置实现同一目的?以下内容在Spring 3.x中不起作用:
@Bean
@Scope("prototype")
public Thing thing(String name) {
return new Thing(name);
}
现在,我可以创建一个工厂,例如:
public interface ThingFactory {
public Thing createThing(String name);
}
但这打败了使用Spring替换ServiceLocator和Factory设计模式的整个观点,这对于该用例而言是理想的选择。
如果Spring Java Config可以做到这一点,我将能够避免:
相对于琐碎的事情,Spring已经通过XML配置支持了很多工作(相对而言)。
在@Configuration
课堂上,@Bean
像这样的方法
@Bean
@Scope("prototype")
public Thing thing(String name) {
return new Thing(name);
}
用于注册bean定义并提供创建bean的工厂。它定义的bean仅在请求时使用直接或通过扫描确定的参数实例化ApplicationContext
。
对于prototypebean
,每次都会创建一个新对象,因此@Bean也会执行相应的方法。
你可以ApplicationContext
通过的BeanFactory#getBean(String name, Object... args)
方法检索Bean
,该方法指出
允许指定显式构造函数自变量/工厂方法自变量,覆盖Bean定义中指定的默认自变量(如果有)。
参数:
如果使用静态工厂方法的显式参数创建原型,则使用args参数。在任何其他情况下,使用非null参数值都是无效的。
换句话说,对于此prototype
作用域的bean,你将提供将要使用的参数,而不是在bean类的构造函数中,而是在@Bean
方法调用中。
对于Spring 4+版本至少是这样。
使用spring的Java配置,我需要获取/实例化一个具有构造函数参数的原型范围的bean,这些参数只能在运行时获得。请考虑以下代码示例(为简洁起见进行了简化): 其中Thing类定义如下: 注意是:它只能通过构造函数提供,并保证不变性。其他依赖项是类的特定于实现的依赖项,不应该知道(紧密耦合到)请求处理程序实现。 这段代码与spring XML配置非常适用,例如: 如何使用Java配置实现相同的
output.java
我是Spring框架的新手,找不到实现以下内容的方法: 我正在使用一个类,它的属性都是私有的,没有设置器(使用该类对象的预期方式是用构造函数设置一次属性)-我将它称为首选项。我还有几个类,每个类都有相同的首选项实例作为属性。首选项旨在包含某些属性,其中一些只能在运行时解析(例如由用户提供)。
问题内容: 我有一个表,其中的行带有范围的开始和结束编号,例如 等等.. 我想创建一个临时表(或表变量/ cte等),其中每个数字都有一行,并且它们之间的范围也包括在内-即给出上述示例,我希望看到一个具有以下行的表: 谁能指出我朝着实现这一目标的快捷方式的方向?我考虑过以某种方式使用数字表,但是我正在查看的表具有> 200m行,而我没有那么大的数字表! 任何帮助深表感谢。提前致谢。 问题答案:
我正在使用grpc protobuf消息定义,并在Go中实现它们。 我的最终目标是让我的rpc在用户上检索一些json并返回带有可选嵌套消息的Message,用于解组json的子集。 使用此rpc: 假设如下: 我想返回一个消息,该消息仅包含“foo”、“bar”或两者,作为基于grpc请求的传入运行时参数的嵌套消息(目前,将是包含用于将json子设置为相应消息的消息名称的字符串列表,例如)。 给