1.让spring提供一个对struts2的ObjectFactory的扩展
需要添加struts2-spring-plugin-2.xxx.jar。在applicationContext.xml中添加
<bean id="userService" class="xxxxx" />
<bean id="springManageLogin" class="action类" scope="prototype">//告诉spring来管理action类的创建
<property name+"userService" ref="userService"/>//注入userService
</bean>
默认情况下,spring Bean以单例形式创建,就是只创建一遍,下一次就直接拿以前创建好的对象。因为Struts2每一次请求都带有相关的数据,所以不适合单例,用scope=“prototype”来让spring每一次请求都创建一个实例。
每一次请求springManageLogin,spring都会创建一个action实例,但是怎么让每一次创建action实例都由spring创造呢。只要在创建action实例的地方引用springManageLogin就行了。
<action name="" method="" action="springManageLogin">//这样spring就会创建实例,不然就是struts2的objectFactory对象创建的。
<result></result>
</action>
如果只是想注入依赖最好不要使用这种方法。如果想要使用spring的其他功能,例如面向方面的特性就可以使用这种方式。
<constant name="struts.objectFactory" value="spring" />//在struts.xml中加入这句,就是改变struts的objectFactory,默认spring
2.使用自动连线将依赖注入
2.1使用name自动连线
spring自动连线的方式默认为name。就是匹配被管理的spring Bean的ID和潜在的目标对象的公开的设置方法的名字工作的。每一个Struts2创建的对象都是潜在的目标对象。
<bean id="userService" class=""/>//applicationContext.xml中只要配置需要注入的对象就行了,不用管理action实例
spring 没有创建action实例,但是后再struts2创建完action实例后检查对象,自动连线spring Bean。自动连线时对象中要有注入对象的公开方法。
private UserService userService;//对象中要有这个公开方法才能自动连线。
public void serUserService(UserService userService){//设置方法的命名约定要与id匹配
this.userService=userService;
}
2.2通过type,constructor,auto自动连线
<constant name="struts.objectFactory.spring.autoWire" value="type"/>//在struts.xml中加入这句可以改变自动连线方式,默认name
type:spring匹配它知道的对象类型和struts2对象设置方法类型,他比较的是设置方法内部参数类型是不是和spring Bean类型匹配,它是按照接口统计的。spring Bean配置的class是接口实现类,自动连线时就为接口的类型去匹配。
constructor:对象要有一个构造方法,构造方法把依赖对象作为参数。跟type类型一样,匹配到多个Bean,会报异常。
auto:先按照constuctor方式,再按照type方式。