我们正在使用Struts 2和spring frame work 4(https://struts.apache.org/docs/spring-plugin.html)。我对Struts bean的创建有一些疑问。
当我们使用Struts with Spring时,我们可以轻松地在@Inject
,@Value
和@Resource
中使用spring Actions
,Validators
,Interceptors
, 没有 将其中的任何一个注释为@Component
(或@Named
)。这个 似乎是 ,struts创建的对象是Spring托管bean。
事实并非如此,因为当你查看applicationContext.getBeanDefinitionNames()
时,你找不到任何动作,验证器或拦截器。
因此,如果Struts创建的对象不是spring manage beans,为什么spring注释(@Inject
,@Value
,...)运行得很好?
技术上我们是否有可能创建一个新对象(在Spring启动后)并将其传递给Spring并让Spring设置它?怎么样?!
答案 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插件创建。