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

4
我们正在使用Struts 2和Spring框架4(https://struts.apache.org/docs/spring-plugin.html)。我对Struts bean创建有一些疑问。
当我们使用带有Spring的Struts时,可以很容易地在Actions、Validators和Interceptors中使用spring注释如@Inject@Value@Resource等,而无需将它们中的任何一个注释为@Component(或@Named)。这似乎表明struts创建的对象是由Spring管理的bean。
但实际上并不是这样,因为当您查看applicationContext.getBeanDefinitionNames()时,找不到任何Action、Validator或Interceptor。
那么,如果Struts创建的对象不是Spring管理的Bean,为什么Spring注释(如@Inject@Value等)也能够正常使用呢?
技术上是否可能在Spring启动后创建新对象,并将其传递给Spring并让Spring设置它?如何操作?

2
当要创建一个对象时,它使用 Struts 配置中的 class 属性对应于 Spring 配置中的 id 属性。如果找不到,则该类将尝试像往常一样被创建,然后由 Spring 进行自动装配。 - Aleksandr M
@AleksandrM 你说的像往常一样是什么意思? - Roman C
像往常一样 -> 以普通或预期的方式。与没有Spring插件相同。 - Aleksandr M
1个回答

4

Struts使用ObjectFactory来构建任何对象,例如actions、interceptors、validators等:

ObjectFactory负责构建核心框架对象。用户可以注册自己的ObjectFactory实现来控制这些对象的实例化。

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

集成了Spring的Struts对象工厂。

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

现在如果你看一下实现,它使用了方法org.springframework.beans.factory.config.AutowireCapableBeanFactory#createBean()

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

这个类的中心方法:创建一个bean实例, 填充bean实例,应用后处理器等。

然后,新创建的实例被传递给org.springframework.beans.factory.config.AutowireCapableBeanFactory#autowireBeanProperties()进行自动装配。

接下来,这个实例被传递给Guice进行注入。

现在它已经完全“烘焙”并准备好返回。


请注意,如果Bean由Spring管理,则使用应用程序上下文中的getBean方法;否则,如果Bean未由Spring管理,则始终由struts-spring插件创建新实例。

AutowireCapableBeanFactory#autowireBeanProperties()是我一直在寻找的方法。因此,即使这些属性不受Spring管理,也可以通过这个工厂进行自动装配。谢谢! - Alireza Fattahi
我认为你的回答中有一个打字错误,应该是“这个实例被传递给Spring进行注入”。 - Grant Lay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接