Java 不可变的spring请求作用域bean
我希望能够使用构造函数参数实例化一个请求范围的bean,该bean也是不可变的。 类似于以下内容(当然不起作用):Java 不可变的spring请求作用域bean,java,spring,scope,request,Java,Spring,Scope,Request,我希望能够使用构造函数参数实例化一个请求范围的bean,该bean也是不可变的。 类似于以下内容(当然不起作用): RequestContextFactory.java package org.springframework.samples.mvc.requestscope; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuratio
RequestContextFactory.java
package org.springframework.samples.mvc.requestscope;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.annotation.RequestScope;
@Configuration
public class RequestContextFactory {
@Bean
@RequestScope
public RequestContext getRequestContext(TestBean bean) {
return new RequestContext(bean);
}
}
package org.springframework.samples.mvc.requestscope;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class MyController {
@Autowired
RequestContextFactory requestContextFactory;
@RequestMapping("/my")
public @ResponseBody String simple(TestBean bean) {
RequestContext requestContext = requestContextFactory.getRequestContext(bean);
return "Hello world!";
}
}
MyController.java
package org.springframework.samples.mvc.requestscope;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.annotation.RequestScope;
@Configuration
public class RequestContextFactory {
@Bean
@RequestScope
public RequestContext getRequestContext(TestBean bean) {
return new RequestContext(bean);
}
}
package org.springframework.samples.mvc.requestscope;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class MyController {
@Autowired
RequestContextFactory requestContextFactory;
@RequestMapping("/my")
public @ResponseBody String simple(TestBean bean) {
RequestContext requestContext = requestContextFactory.getRequestContext(bean);
return "Hello world!";
}
}
Spring抱怨它不能自动连接一个TestBean
bean来创建RequestContext
。
如何实现请求范围bean的不变性,该bean只需要控制器中已知的构造函数参数
我希望能够将RequestContext注入到其他bean中(请求范围或其他范围)。这是反模式吗?控制器下所有调用层次结构的签名中是否应该有类似于RequestContext
(或具有请求生命周期的任何其他对象)的内容
注:
我认为这是一种解决方案,例如使用带有默认构造函数的
RequestContext
和只能调用一次(将抛出第二次)的init(…)
方法。我不喜欢它。你想达到什么目的?为什么需要操作请求范围的bean?对我来说,听起来更像是一种拦截器/侦听器。看看.web.context.request.RequestContextListener
。答案似乎很明显-不要在TestBean
类中使用setter方法。反斜杠:我正在尝试创建一个不可变的RequestContext,它需要输入(对于exmaple)请求参数,这些参数只有在controller方法中才知道。普罗霍罗夫:请详细说明,也许在回答中。。。谢尔盖·普罗科维耶夫:这与TestBean无关,我希望RequestContext是不可变的