Struts 2 和 Spring 如何处理 struts 创建的对象

Struts 2 and Spring how struts-created objects handled

我们正在使用 Struts 2 和 spring 框架工作 4 (https://struts.apache.org/docs/spring-plugin.html)。我有一些关于 Struts bean 创建的问题。

当我们将Struts与Spring一起使用时,我们可以轻松地在[=16=中使用spring@Inject@Value@Resource ], ValidatorsInterceptors, 没有 将它们中的任何一个注释为 @Component (或 @Named).这个 似乎 struts 创建的对象是 spring 托管 bean。

这不是真的,因为当您查看 applicationContext.getBeanDefinitionNames() 时,您找不到任何操作、验证器或拦截器。

因此,如果 Struts 创建的对象不是 spring 管理 beans,为什么 spring 注释(@Inject@Value、...)工作得很好吗?

技术上是否可以创建一个新对象(在 spring 启动后)并将其传递给 Spring 并让 Spring 设置它?怎么办?!

Struts 使用 ObjectFactory 构建任何对象,如动作、拦截器、验证器等:

ObjectFactory is responsible for building the core framework objects. Users may register their own implementation of the ObjectFactory to control instantiation of these Objects.

Struts-Spring plugin注册自己的对象工厂StrutsSpringObjectFactory:

Struts object factory that integrates with Spring.

在那里,它覆盖了构建对象的方法,例如buildBean()

现在,如果您查看实现,它正在使用方法 org.springframework.beans.factory.config.AutowireCapableBeanFactory#createBean()

这通常会创建 clazz 参数的新实例。

Central method of this class: creates a bean instance, populates the bean instance, applies post-processors, etc.

然后,新创建的实例通过 org.springframework.beans.factory.config.AutowireCapableBeanFactory#autowireBeanProperties()

自动装配

之后,这个实例被传递给Guice进行注入。

现在已经完全 烘烤 并准备好 return。


注意,如果 bean 由 Spring 管理,它使用应用程序上下文中的 getBean 方法,否则新实例总是由 struts-[=47= 创建] 插件,如果 bean 不是由 Spring.

管理的