java - 是否可以在 Spring 运行时 Autowiring 方法参数

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

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

我几乎读完了《Spring in Action》这本书,也读了很多《Spring Reference》,但还没有找到关于这个问题的任何信息。

最佳答案

您有几个选择。

定义一个原型(prototype) bean 并将其注入(inject) ObjectFactory

@Autowired
private ObjectFactory<PrototypeBean> factory;

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

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

每次调用 factory.getObject() 时,您都会获得一个新实例。

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

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

关于java - 是否可以在 Spring 运行时 Autowiring 方法参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34406306/

相关文章:

c# - 导航管理器 NullReferenceException

c# - ASP.NET Core 2+ 中的 ILogger 和 DependencyInjection

java - 使用while循环格式化的功率表和逻辑错误

java - 如何从其他类调用变量和方法?

java - JFrame 中的标题居中对齐

java - 使用 spring java 使用带有 xml 响应数组列表的 Rest api

java - spring 将值从属性文件传递到注释

asp.net-mvc - 我的 View 模型应该以我的域实体为洋葱架构的核心吗?

java - 未转义的 java 在正则表达式 matcher.find() 中不匹配

java - Spring data elasticsearch GeoPoint 与 spring mvc