转自:http://blessht.iteye.com/blog/1162131
平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中。依赖注入的另一种说法是“控制反转”,通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员,而控制反转是指new实例工作不由我们程序员来做而是交给spring容器来做。
spring有多种依赖注入的形式,下面仅介绍spring通过xml进行IOC配置的方式:
-
Set注入
-
package com.bless.springdemo.action;
-
publicclass SpringAction {
-
//注入对象springDao
-
private SpringDao springDao;
-
//一定要写被注入对象的set方法
-
publicvoid setSpringDao(SpringDao springDao) {
-
this.springDao = springDao;
-
}
-
}
-
<!--配置bean,配置后该类由spring管理-->
-
<bean name="springAction"class="com.bless.springdemo.action.SpringAction">
-
<!--(1)依赖注入,配置当前类中相应的属性-->
-
<property name="springDao" ref="springDao"></property>
-
</bean>
-
<bean name="springDao"class="com.bless.springdemo.dao.impl.SpringDaoImpl"></bean>
-
构造器注入
-
publicclass SpringAction {
-
//注入对象springDao
-
private SpringDao springDao;
-
private User user;
-
-
public SpringAction(SpringDao springDao,User user){
-
this.springDao = springDao;
-
this.user = user;
-
System.out.println("构造方法调用springDao和user");
-
}
-
}
-
<!--配置bean,配置后该类由spring管理-->
-
<beanname="springAction"class="com.bless.springdemo.action.SpringAction">
-
<!--(2)创建构造器注入,如果主类有带参的构造方法则需添加此配置-->
-
<constructor-arg ref="springDao"></constructor-arg>
-
<constructor-arg ref="user"></constructor-arg>
-
</bean>
-
<beanname="springDao"class="com.bless.springdemo.dao.impl.SpringDaoImpl"></bean>
-
<beanname="user"class="com.bless.springdemo.vo.User"></bean>
-
<beanname="springAction"class="com.bless.springdemo.action.SpringAction">
-
<constructor-arg index="0" ref="springDao"></constructor-arg>
-
<constructor-arg index="1" ref="user"></constructor-arg>
-
</bean>
-
<constructor-argtype="java.lang.String"ref=""/>
-
静态工厂的方法注入
-
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;
-
publicclass DaoFactory {
-
//静态工厂
-
publicstaticfinal FactoryDao getStaticFactoryDaoImpl(){
-
return new StaticFacotryDaoImpl();
-
}
-
}
-
publicclass SpringAction {
-
//注入对象
-
private FactoryDao staticFactoryDao;
-
publicvoid staticFactoryOk(){
-
staticFactoryDao.saveFactory();
-
}
-
//注入对象的set方法
-
publicvoid setStaticFactoryDao(FactoryDao staticFactoryDao) {
-
this.staticFactoryDao = staticFactoryDao;
-
}
-
}
-
<!--配置bean,配置后该类由spring管理-->
-
<bean name="springAction" class="com.bless.springdemo.action.SpringAction">
-
<!--(3)使用静态工厂的方法注入对象,对应下面的配置文件(3)-->
-
<property name="staticFactoryDao" ref="staticFactoryDao"></property>
-
</bean>
-
<!--(3)此处获取对象的方式是从工厂类中获取静态方法-->
-
<bean name="staticFactoryDao" class="com.bless.springdemo.factory.DaoFactory" factory-method="getStaticFactoryDaoImpl"></bean>
-
实例工厂的方法注入
-
publicclass DaoFactory {
-
//实例工厂
-
public FactoryDao getFactoryDaoImpl(){
-
returnnew FactoryDaoImpl();
-
}
-
}
-
publicclass SpringAction {
-
//注入对象
-
private FactoryDao factoryDao;
-
publicvoid factoryOk(){
-
factoryDao.saveFactory();
-
}
-
publicvoid setFactoryDao(FactoryDao factoryDao) {
-
this.factoryDao = factoryDao;
-
}
-
}
-
<!--配置bean,配置后该类由spring管理-->
-
<beanname="springAction"class="com.bless.springdemo.action.SpringAction">
-
<!--(4)使用实例工厂的方法注入对象,对应下面的配置文件(4)-->
-
<propertyname="factoryDao"ref="factoryDao"></property>
-
</bean>
-
<!--(4)此处获取对象的方式是从工厂类中获取实例方法-->
-
<beanname="daoFactory"class="com.bless.springdemo.factory.DaoFactory"></bean>
-
<beanname="factoryDao"factory-bean="daoFactory"factory-method="getFactoryDaoImpl"></bean>
-
总结
-
<bean name="..."class="..." scope="prototype">