【发布时间】:2020-03-18 19:28:56
【问题描述】:
如果我尝试注入具有 Web 感知范围(即会话范围、请求范围)的 bean,则注入器会忽略该 bean。不调用 bean 方法和对象构造函数。这只发生在我声明的类中,因为我可以为标准库类型(例如 List 或 Map)注入会话范围的 bean。此外,如果我使用单例或原型作用域,注入也能正常工作。
有人可以解释这种奇怪的行为吗?我创建了一个准系统示例来演示该问题。 (我也尝试过搜索,但找不到遇到此问题的人。)
我想注入的类
public class CustomObj{
public String field;
public CustomObj(){
System.out.println("CustomObj constructor called");
}
}
配置文件
@Configuration
public class Config {
@Bean
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public List<String> userValues() {
List<String> list = new ArrayList<String>();
list.add("This gets initialized");
return list;
}
@Bean
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public CustomObj customObj() {
CustomObj obj = new CustomObj();
obj.field = "This doesn't";
return obj;
}
}
控制器注入对象
@RestController
@RequestMapping("/test")
public class TestController{
@Autowired
List<String> userValues;
@Autowired
CustomObj customObj;
@RequestMapping("/pleasework")
public String please(){
return "List values: "+Arrays.toString(this.userValues.toArray())
+ " Obj value: "+this.customObj.field;
}
}
主要
@SpringBootApplication
public class SessionbeansApplication {
public static void main(String[] args) {
SpringApplication.run(SessionbeansApplication.class, args);
}
}
访问 /test/pleasework 会得到输出 List values: [This gets initialized] Obj value: null,表明 List 已正确注入,但 CustomObj 未正确注入。
【问题讨论】:
标签: java spring spring-boot configuration