在正式学习ioc之前,我们先讲一个故事。
有一天,早上起来后的小白同学感觉头晕晕的好似发烧了,于是他来到药店准备找医生开点药吃吃,可当他到药店后,却发现医生都不见了。无奈之下小白同学只好自己去药房的找点药吃,可是小白只是一个苦逼的程序猿,哪里知道自己该吃什么药呢,于是他拿起手机一顿搜索,这时他看到了一篇推文:《震惊!x某误食x药导致x痿》,他开始害怕了,不敢自己胡乱拿药。他的头更痛了,他多想有个医生出来告诉他该吃什么药呀!
故事到这里结束了,现在我们用编程的思路描述一下这个故事
小白想治好头疼:需求
药店里的各种药品:对象
未曾出现的医生:管理药品(对象)的人:IOC容器
当然,这里的各种药品彼此之前存在着某种联系和依赖(药不能乱吃哦~)
我们想要实现的效果是:当一个需求产生后,我们可以不再关注对象与对象之间的依赖和联系,反转让IOC容器把我们需要的对象生成出来
对象不依赖于其它对象,不依赖于其它对象,这就达到了松耦合。
高耦合:
解耦:
控制:我们不在自己new出对象,而是将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制 反转:由容器来帮忙创建及注入依赖对象,由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转,依赖对象的获取被反转了。 IOC思想总结:使用对象时,由主动new产生对象转换为“外部”提供对象,此过程中对象的创建权由程序内部转换到“外部”,这就是控制反转 Spring提供了这么个容器,称为IOC容器,用来充当IOC思想里的“外部”。IOC容器负责对象的创建、初始化等工作,被管理的对象统称为Bean
二、DI(依赖注入)
我认为,IOC和DI本质上是同一种东西,DI只是实现IOC思想的方式
在IOC容器中为Bean与Bean之间建立起依赖关系的整个过程,就是DI(依赖注入)现在我们来实现一个DI的案例
在pom.xml导入spring依赖
DAO:org.springframework spring-webmvc5.3.9
public class BookDaoImpl implements BookDao { @Override public void save() { System.out.println("人家是Dao啦~~~~~~~~~"); } }SERVICE:
public class BookServiceImpl implements BookService { private BookDao bookDao = new BookDaoImpl(); @Override public void save() { System.out.println("人家是Service啦~~~~~~~~~"); bookDao.save(); } }测试类:
public class testDemo { @Test public void test(){ BookService bookService = new BookServiceImpl(); bookService.save(); } }测试结果: 现在我们改用DI注入完成该操作
创建applicationContext.xml
修改Service
这里的setBookDao方法是由IOC容器自动调用的
修改测试类
public class testDemo { @Test public void test(){ //1,获取IOC容器 ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); //2,从容器中得到Bean //传入容器里的ID值,返回的是Objece属性我们转换一下 BookService bookService = (BookService) ctx.getBean("bookService"); //3,调用方法 bookService.save(); } }
查看结果