【问题标题】:Is it possible to autowire method arguments at runtime in Spring是否可以在 Spring 运行时自动装配方法参数
【发布时间】:2016-03-28 03:42:48
【问题描述】:

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

我几乎读完了 Spring in Action 这本书,并且已经阅读了很多 Spring Reference,但没有找到任何关于这个问题的信息。

【问题讨论】:

  • 你为什么要在那里注入原型?这似乎是一种代码气味。 (如果它真的是合理的,你总是可以注入一个工厂而不是生产的 bean。)

标签: java spring dependency-injection inversion-of-control autowired


【解决方案1】:

您有几个选择。

定义一个原型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 中解析一个实例。您可以根据需要按名称、类型执行此操作。

【讨论】:

  • 我将ObjectFactory@ModelAttribute 结合起来,它的工作原理是例外,谢谢。我还找到了名为Provider 的替代JSR 标准接口。甚至发现了@Lookup,但感觉有点不直观
  • 我对@9​​87654333@进行了进一步的试验,最终在将其声明为component之后设法使其正常工作,因此我可以将其与context绑定,然后手动添加自动装配的实例到WebMvcConfigurerAdapter 中的解析器列表。它是遗留类,还是我为什么不能将它定义为一个 bean 并让 Spring 检测它并将其集成到它的基础架构中,如 ViewResolvers 等?
猜你喜欢
  • 2010-10-13
  • 1970-01-01
  • 2022-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-18
  • 2012-07-15
  • 2019-06-06
相关资源
最近更新 更多