一、IOC思想(控制反转)
在正式学习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依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.9</version>
</dependency>
DAO:
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
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id = "fromBookDao" class="com.brrbaii.dao.daoImpl.BookDaoImpl" />
<bean id = "bookService" class="com.brrbaii.service.serviceImpl.BookServiceImpl" >
<!--
name:具体要配置的一个属性
ref:参照哪一个Bean
这里表示的是:我们要配置bookService里创建的bookDao对象,
而这个对象来自于Bean里的fromBookDao
-->
<property name="bookDao" ref="fromBookDao">
</property>
</bean>
</beans>
修改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();
}
}
查看结果