IOC又叫控制反转,DI又叫依赖注入
有时候我们很容易把它们俩弄混淆,IOC是一种编程思想,可以说DI是IOC的实现。
IOC有时候很好理解,有时候又不好理解,我刚开始的时候就有点混淆,拿生活中对象这个实例来说明,方便理解,
生活中我们找对象,是按照自己要求去大街上自己找对象,看到一个心仪的对象,就赶紧着人家要联系方式,是我们自己亲自的主动的找人家,然而生活中有一种叫婚介所或者媒人这种中间介质,我们把我们对另一半的身高,体重,长相等告诉婚介所,他们会根据我们的所要求的标准帮我们去物色,然后介绍给我们,而不用我们自己去大街上自己找,我们只需静待结果即可,省了好多事,
IOC的原理也是这样的,婚介所就相当于IOC容器,IOC容器就相当于第三者把两个对象联系起来,当一个类调用另一个类时,不需要调用方自己创建被调用方的实例,而是将这种创建对象实例的权力交给IOC容器来帮我创建,之前是调用方自己创建被调用的实例,是具有主动权的,如今这种创建被调用方的权力给IOC容器了,那么调用方就是被动了,接受IOC创建的被调用方的实例,
依赖注入:首先我们要搞清楚是谁依赖谁,谁注入谁,注入了什么
还是拿调用方与被调用来说,当然是调用方依赖于被调用方,IOC容器注入调用方,注入了被调用方的实例,然后再通过实例调用方法。
在Spring容器中为一个bean配置依赖注入有三种方式:
· 使用属性的setter方法注入 这是最常用的方式;
· 使用构造器注入;
· 用于注解方;
使用属性的setter方法注入
首先要配置被注入的bean,在该bean对应的类中,应该有要注入的对象属性或者基本数据类型的属性。例如:为UserBiz类注入UserDAO,同时为UserBiz注入基本数据类型String,那么这时,就要为UserDAO对象和String类型设置setter方法.,用于进行依赖注入。
<bean id="userBiz" class="com.text.biz.impl.UserBizImpl">
<property name="userDao">
<ref>userDao</ref>
</property>
</bean>
以上就是一个使用属性的setter方法的方式进行依赖注入。
使用构造器注入
第一,在PersonBiz类中注入PersonDAO和一个String类型的数据;在该类中,不用为PersonDAO属性和String数据类型的属性设置setter方法,但是需要生成该类的构造方法;如下:
public class PersonBizImpl implements PersonBiz {
// 声明"依赖对象"PersonDAO
PersonDAO personDao = null;
// 声明"依赖的基本数据类型"
String str = null;
// 生成无参构造方法
public PersonBizImpl() {
super();
}
// 生成带参构造方法
public PersonBizImpl(PersonDAO personDao, String str) {
super();
this.personDao = personDao;
this.str = str;
}
public void addPerson() {
this.personDao.addPerson();
System.out.println(str);
}
}
第二,在配置文件中配置该类的bean,并配置构造器,在配置构造器中用到了节点,该节点有四个属性:
<!-- 利用构造器配置依赖注入 -->
<bean id="personDao" class="com.aptech.dao.impl.PersonDAOImpl"></bean>
<bean id="personBiz" class="com.aptech.biz.impl.PersonBizImpl">
<constructorarg index="0" type="com.aptech.dao.PersonDAO"ref="personDao"></constructor-arg>
<constructor-arg index="1" value="Spring学习"></constructor-arg>
</bean>
用注解方式
一般来说最常用的注解方式如下:
@Autowired是自动注入,自动从spring的上下文找到合适的bean来注入
@Resource用来指定名称注入
@Component:可以用于注册所有bean
@Repository:主要用于注册dao层的bean
@Controller:主要用于注册控制层的bean
@Service:主要用于注册服务层的bean
那么这就是我对控制反转和DI的理解,如果有什么不妥的地方,还望各位朋友指出