通过 SpringApplicationContext 从控制器方法获取 Bean 实例时遇到问题。我在控制器方法中需要的是一个填充良好的类 B
实例。类B
的定义如下:
@Component
public class ADep {
}
@Component
public class A {
@Autowired
private ADep aDep;
public void printDep() {
System.out.println("aDep is " + aDep);
}
}
@Component
public class B extends A {
public void printAMethod() {
super.printDep();
}
}
调用以下控制器方法时:
@CrossOrigin
@RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE, path = "/method1")
public MappingJacksonValue method1(HttpServletRequest request, HttpServletResponse response, B b) throws Exception {
b.printAMethod();
return null;
}
我看到以下响应:
aDep is null
如果我从应用程序上下文中获取 bean,则响应会有所不同,而不是在控制器方法中获取 bean:
@Autowired
private ApplicationContext applicationContext;
@CrossOrigin
@RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE, path = "/hardware")
public MappingJacksonValue getHardware(HttpServletRequest request, HttpServletResponse response) throws Exception {
B b = applicationContext.getBean(B.class);
b.printAMethod();
return null;
}
结果:
aDep is ADep@2e468dfa
我需要的是一个 bean 实例,就像后面的情况一样。如何在不使用 SpringApplicationContext 的情况下在控制器方法中获取它?
您正在尝试将 B 类型的 b 对象作为参数传递,因此在这种情况下您必须创建并给出 b 对象并将其传递给方法,我认为您正在给这个参数一个 null 值,但如果需要,您可以使用 @Autowired 而不是应用程序上下文,因为 B 已经是一个组件, 喜欢这个:
@Autowired
private B b;
@CrossOrigin
@RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE, path = "/hardware")
public MappingJacksonValue getHardware(HttpServletRequest request, HttpServletResponse response) throws Exception {
b.printAMethod();
return null;
}
编辑:
要更改 Bean 的作用域,不同的 Bean 用于不同的请求,您可以在 B
类上方添加@Scope(value = WebApplicationContext.SCOPE_REQUEST)
注释
方法中的参数由Spring MVC参数解析器提供。它不会在这里注入豆子。我有点惊讶 b 在这种情况下不为空,也许默认行为是创建此类的新实例,在这种情况下,当然,aDep 是空的。