注入依赖(DI):
Setter方法注入:
<!--setter注入-->
<bean id=
"person" class="org.cric.action.Person">
<property name="size"><value>A4</value></property>
</bean>
<setter注入bean>
<bean id=
"person" class="org.cric.action.Person">
<property name="userDao" ref="userDao"></property>
</bean>
注:setter注入bean的时候ref写的是在xml中bean的id
构造器注入:
<!--
构造器实例化实例
,通过类型匹配-->
<bean id=
"axe" class="org.cric.dao.StonAxe"/>
<bean id=
"person" class="org.cric.action.Person">
<constructor-arg type=
"org.cric.dao.Axe" ref="axe"/>
</bean>
注:在bean实例化时,已经完成了依赖关系的注入,通过constructor-arg元素配置,type属性指定类型ref属性指定实例
依赖多个参数时,构造器参数匹配方法:
<!--
构造器实例化实例
,通过参数次序匹配-->
<bean id=
"axe" class="org.cric.dao.StonAxe"/>
<bean id=
"person" class="org.cric.action.Person">
<constructor-arg index=
"0" value="1"/>
<constructor-arg index=
"1" value="wwwww"/>
</bean>
基本类型对象注入,由Spring自动完成转换
<bean id="orderService" class="cn.itcast.service.OrderServiceBean">
<constructor-arg index=“0” type=“java.lang.String” value=“xxx”/>
//
构造器注入
<property name=“name” value=“zhao”/>
//
属性
setter
方法注入
</bean>
- 静态工厂的方法注入
静态工厂顾名思义,就是通过调用静态工厂的方法来获取自己需要的对象,为了让spring管理所有对象,我们不能直接通过"工程类.静态方法()"来获取对象,而是依然通过spring注入的形式获取:
- package com.bless.springdemo.factory;
- import com.bless.springdemo.dao.FactoryDao;
- import com.bless.springdemo.dao.impl.FactoryDaoImpl;
- import com.bless.springdemo.dao.impl.StaticFacotryDaoImpl;
- public class DaoFactory {
- //静态工厂
- public static final FactoryDao getStaticFactoryDaoImpl(){
- return new StaticFacotryDaoImpl();
- }
- }
package com.bless.springdemo.factory;
import com.bless.springdemo.dao.FactoryDao;
import com.bless.springdemo.dao.impl.FactoryDaoImpl;
import com.bless.springdemo.dao.impl.StaticFacotryDaoImpl;
public class DaoFactory {
//静态工厂
public static final FactoryDao getStaticFactoryDaoImpl(){
return new StaticFacotryDaoImpl();
}
}
同样看关键类,这里我需要注入一个FactoryDao对象,这里看起来跟第一种注入一模一样,但是看随后的xml会发现有很大差别:
- public class SpringAction {
- //注入对象
- private FactoryDao staticFactoryDao;
- public void staticFactoryOk(){
- staticFactoryDao.saveFactory();
- }
- //注入对象的set方法
- public void setStaticFactoryDao(FactoryDao staticFactoryDao) {
- this.staticFactoryDao = staticFactoryDao;
- }
- }
public class SpringAction {
//注入对象
private FactoryDao staticFactoryDao;
public void staticFactoryOk(){
staticFactoryDao.saveFactory();
}
//注入对象的set方法
public void setStaticFactoryDao(FactoryDao staticFactoryDao) {
this.staticFactoryDao = staticFactoryDao;
}
}
Spring的IOC配置文件,注意看<bean name="staticFactoryDao">指向的class并不是FactoryDao的实现类,而是指向静态工厂
DaoFactory,并且配置
factory-method="getStaticFactoryDaoImpl"指定调用哪个工厂方法:
- <!--配置bean,配置后该类由spring管理-->
- <bean name="springAction" class="com.bless.springdemo.action.SpringAction" >
- <!--(3)使用静态工厂的方法注入对象,对应下面的配置文件(3)-->
- <property name="staticFactoryDao" ref="staticFactoryDao"></property>
- </property>
- </bean>
- <!--(3)此处获取对象的方式是从工厂类中获取静态方法-->
- <bean name="staticFactoryDao" class="com.bless.springdemo.factory.DaoFactory" factory-method="getStaticFactoryDaoImpl"></bean>
<!--配置bean,配置后该类由spring管理--> <bean name="springAction" class="com.bless.springdemo.action.SpringAction" > <!--(3)使用静态工厂的方法注入对象,对应下面的配置文件(3)--> <property name="staticFactoryDao" ref="staticFactoryDao"></property> </property> </bean> <!--(3)此处获取对象的方式是从工厂类中获取静态方法--> <bean name="staticFactoryDao" class="com.bless.springdemo.factory.DaoFactory" factory-method="getStaticFactoryDaoImpl"></bean>
- 实例工厂的方法注入
实例工厂的意思是获取对象实例的方法不是静态的,所以你需要首先new工厂类,再调用普通的实例方法:
- public class DaoFactory {
- //实例工厂
- public FactoryDao getFactoryDaoImpl(){
- return new FactoryDaoImpl();
- }
- }
public class DaoFactory {
//实例工厂
public FactoryDao getFactoryDaoImpl(){
return new FactoryDaoImpl();
}
}
那么下面这个类没什么说的,跟前面也很相似,但是我们需要通过实例工厂类创建FactoryDao对象:
- public class SpringAction {
- //注入对象
- private FactoryDao factoryDao;
- public void factoryOk(){
- factoryDao.saveFactory();
- }
- public void setFactoryDao(FactoryDao factoryDao) {
- this.factoryDao = factoryDao;
- }
- }
public class SpringAction {
//注入对象
private FactoryDao factoryDao;
public void factoryOk(){
factoryDao.saveFactory();
}
public void setFactoryDao(FactoryDao factoryDao) {
this.factoryDao = factoryDao;
}
}
最后看spring配置文件:
- <!--配置bean,配置后该类由spring管理-->
- <bean name="springAction" class="com.bless.springdemo.action.SpringAction">
- <!--(4)使用实例工厂的方法注入对象,对应下面的配置文件(4)-->
- <property name="factoryDao" ref="factoryDao"></property>
- </bean>
- <!--(4)此处获取对象的方式是从工厂类中获取实例方法-->
- <bean name="daoFactory" class="com.bless.springdemo.factory.DaoFactory"></bean>
- <bean name="factoryDao" factory-bean="daoFactory" factory-method="getFactoryDaoImpl"></bean>
<!--配置bean,配置后该类由spring管理--> <bean name="springAction" class="com.bless.springdemo.action.SpringAction"> <!--(4)使用实例工厂的方法注入对象,对应下面的配置文件(4)--> <property name="factoryDao" ref="factoryDao"></property> </bean> <!--(4)此处获取对象的方式是从工厂类中获取实例方法--> <bean name="daoFactory" class="com.bless.springdemo.factory.DaoFactory"></bean> <bean name="factoryDao" factory-bean="daoFactory" factory-method="getFactoryDaoImpl"></bean>
- 总结
Spring IOC注入方式用得最多的是(1)(2)种,多谢多练就会非常熟练。
另外注意:通过Spring创建的对象默认是单例的,如果需要创建多实例对象可以在<bean>标签后面添加一个属性:
- <bean name="..." class="..." scope="prototype">
bean对象注入:
<bean id="orderDao" class="cn.service.OrederDaoBean"/>
<bean id="orderService" class="cn.service.OrderServiceBean">
<property name="orderDao" ref="orderDao"/>
</bean>
<!--使用内部bean,但该bean不能被其他bean使用-->
<bean id="orderService" class="cn.service.OrderServiceBean">
<property name="orderDao">
<bean class="cn.service.OrderDaoBean"/>
</property>
</bean>
集合类型注入:
List注入:使用list元素。对应的类型为java.util.list
Map注入:使用entry元素,为每个项目制定key和value。对应类型为java.util.Map
Set注入:使用set元素。对应的类型为java.util.Set
Properties注入:使用props及prop元素。对应的类型为java.util.Properties
示例:
java类:
public class OrderServiceBean {
private Set<String> sets = new HashSet<String>();
private List<String> lists = new ArrayList<String>();
private Properties properties = new Properties();
private Map<String, String> maps = new HashMap<String, String>();
....//这里省略属性的getter和setter方法
}
xml:
<bean id="order" class="cn.itcast.service.OrderServiceBean">
<property name="lists">
<list>
<value>lihuoming</value>
</list>
</property>
<property name="sets">
<set>
<value>set</value>
</set>
</property>
<property name="maps">
<map>
<entry key="lihuoming" value="28"/>
</map>
</property>
<property name="properties">
<props>
<prop key="12">sss</prop>
</props>
</property>