DI(Dependency Injection):依赖注入
在运行期间,由外部容器动态地将依赖对象注入到组件中;
Ioc(Inversion of control):控制反转
应用本身不负责依赖对象的创建及维护,依赖对象的创建和维护是由外部容器负责的。这样控制权就由应用本身转移到了外部容器,控制权的转移就是所谓的反转。例如:
最开始的代码:
public class GoodService{
public void save(){
//主动获取
GoodDAO goodDAO = new GoodDAO();
goodDAO.save();
}}
主动获取的方式,控制权在GoodService类中。硬编码方式。
NOW:
public class GoodService{
private GoodDAO goodDAO;
//set/get方法省略
public void save(){
goodDAO.save();
}}
GoodService获得一个GoodDAO编程被动接受。
从主动获取变成被动接受,控制权是不是变化了?IOC
Ioc控制反转,获得GoodDAO对象(依赖对象)的方式变成外部注入。
使用Spring框架实现Ioc/DI
1、导入Spring框架;
2、在配置文件中创建实例
<bean class="com.no1.dao.GoodsDAO" id="GoodsDAO"/>
class:表示类名。
id/name:实例名称
3、获得Spring配置的实例1 applicationContext类。
newFileSystemXMLApplicationContext("src/applicationContext.xml");
2 getBean(“配置文件的id/name”)
4、实现依赖注入
<bean class="com.no1.biz.GoodsBIZ" name="GoodsBIZ">
<property name="goodsDAO"ref="GoodsDAO"/>
</bean>三种实例化对象的方式
1、构造方法
<bean class="com.no1.dao.GoodsDAO" id="GoodsDAO"/>
2、工厂类的静态方法public class StaticFactory{
public static GoodDAO create(){
return new GoodDAO();
}}
<bean id="GoodDAO " class="com.no1.factory.StaticFactory" factory-method="create"/>
3、工厂类的实例方法public class MethodFactory{
public GoodDAO create(){
return new GoodDAO();
}}
<bean id="methodFactory" class="com.no1.factory.MethodFactory"/>
<bean id="GoodsDAO" factory-bean="methodFactory" factory-method="create"/>
二种依赖注入的方式
1、属性注入:调用set方法
public class GoodService{
private GoodDAO goodDAO;
//set/get方法省略
public void save(){
goodDAO.save();
}}
<bean class="com.no1.biz.GoodService" name="GoodService">
<property name="goodDAO"ref="GoodDAO "/>
</bean>
2、构造注入:通过构造方法的方式
<bean class="com.no1.biz.GoodsBIZ" name="GoodsBIZ">
<constructor-arg index="0"ref="GoodsDAO"/>
</bean>
index="0"表示构造方法的第一个参数
<constructor-arg name="参数名称"