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

时间:2016-09-26 15:04:01

标签: java spring dependency-injection struts2 integration

我们正在使用Struts 2和spring frame work 4(https://struts.apache.org/docs/spring-plugin.html)。我对Struts bean的创建有一些疑问。

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

事实并非如此,因为当你查看applicationContext.getBeanDefinitionNames()时,你找不到任何动作,验证器或拦截器。

因此,如果Struts创建的对象不是spring manage beans,为什么spring注释(@Inject@Value,...)运行得很好?

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

1 个答案:

答案 0 :(得分:4)

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

  

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

Struts-Spring插件注册自己的对象工厂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插件创建。