Spring 是否可以在运行时自动装配方法参数

Is it possible to autowire method arguments at runtime in Spring

是否可以使用 Spring 中的注解在运行时将原型作用域 bean 的新实例注入控制器的方法参数?因此,无论何时调用该方法,Spring 都会注入限定 bean 作为其参数,就像它注入 @ModelAttribute 一样。据我所知,@Autowired 字段仅在创建上下文时注入一次。从上下文的工厂方法获取 bean 不是一个选项,因为这会将框架暴露给它的组件,从而违反好莱坞原则。

我几乎读完了 Spring 的 Action book 并且已经阅读了很多 Spring 参考资料,但是还没有找到关于这个问题的任何信息。

你有几个选择。

定义一个原型 bean 并将其包装在 ObjectFactory

@Autowired
private ObjectFactory<PrototypeBean> factory;

然后您可以在您的处理程序方法中检索它。例如

@RequestMapping("/path")
public String handlerMethod() {
    PrototypeBean instance = factory.getObject();
    instance.someMethod();
    return "view";
}

每次你调用factory.getObject(),你都会得到一个新的实例。

至于直接执行此操作,不,Spring MVC 没有在调用处理程序方法时注入 bean 的内置功能,使用 @Autowired 或其他方式。

但是,HandlerMethodArgumentResolver API 允许您为您想要的任何类型的参数定义一个实现。您可以定义一个新注释并使用它来注释适当的处理程序方法参数。该实现将查找注释并从注入的 ApplicationContext 中解析一个实例。您可以根据需要按名称、按类型执行此操作。