通过控制器方法和应用程序上下文获取 Bean 之间的区别



通过 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 是空的。

相关内容

  • 没有找到相关文章

最新更新