1.IOC的原型
在我们之前的业务中,用户的需求可能会影响我们原来的代码,我们需要根据用户的需求去修改源代码!如果程序代码量十分大,修改一次成本代价十分昂贵。
public class UserServiceImpl implements UserService { private UserDao userDao; //利用set进行动态实现值的注入! public void setUserDao(UserDao userDao){ this.userDao = userDao; } public void getUser(){ getUser(); } }
当我们使用一个Set接口实现时,就已经发生了革命性的变化
-
之前程序是主动创建对象!控制权在程序员手上
-
使用了set注入后,程序不再具有主动性,而是变成了被动接受的对象
这种思想,从本质上解决了问题,我们程序员不用再去管理对象的创建了。系统的耦合性大大降低。可以专注于业务的实现上。这就是ioc的原型。
2.IOC本质
控制反转(IOC),是一种设计思想,DI(依赖注入)是实现IOC的一种方法
在没有IOC的程序中,我们使用面向对象编程,对象的创建与对象间的依赖关系完全编码在程序中,对象的创建由程序自己控制
控制反转后将对象的创建转移给第三方
个人认为所谓控制反转就是:获得依赖对象的方式反转了
控制反转是一种通过描述(xml或者注解)并通过第三方去生产或获取特定对象的方式,在spring中实现控制反转的是IOC容器,其实现方法是依赖注入
控制:谁来控制独享的创建,传统应用程序是由程序本身控制创建的,使用spring后,对象是由spring创建的
反转:程序本身不创建对象而编程,而变成被动接收对象
依赖注入:就是利用set方法来进行注入
IOC容器:
实现IOC的方式:
1.可以使用xml配置
采用xml配置Bean的时候,Bean的定义信息和现实是分离的,而采用注解的方式可以把二者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。
彻底不用在程序中去改动了,要实现不同的操作,只需要在xml文件中进行(由spring进行创建,对象属性由spring容器设置),所谓的IOC一句话概括就是:对象由spring进行创建,装配,管理
2.可以使用注解
3.新版本的spring可以零配置实现IOC
3.IOC创建对象的方式
1.使用无参构造创建对象(默认实现)
2.使用有参构造创建对象
-
下标赋值
<bean id="user" class="java.spring5.user"> <constructor-arg index="0" value="zhangtaozhenniubi"/> </bean>
-
通过类型创建(不建议使用)
<bean id="user" class="java.spring5.user"> <constructor-arg type="java.long.string" value="zhangtao"/> </bean>
-
直接通过参数名来设置
<bean id="user" class="java.spring5.user"> <constructor-arg name="name" value="zhangtao"/> </bean>
总结:在配置文件加载的时候,容器中管理的对象就已经初始化了