1. IOC: Inversion of Control. 控制反转。
传统的编程方式: 所有的对象和资源都是由开发人员来控制,由你来决定什么时候new一个对象,什么时候申请资源、使用资源、释放资源。
控制:指控制外部资源的获取,控制对象生命周期。
反转: 刚开始流行的是由开发人员操纵一切,现在变了,由Spring框架来控制程序中的外部资源、控制对象的生命周期等。所以取名“反转”,即控制的权利由开发人员转移到了Spring框架。由Spring框架帮我创建我们对象中依赖的对象,我们的对象只能被动的接受。
IOC的好处就是解耦,对象和对象之间的耦合度变低了,便于测试、便于功能复用。
2. DI(Dependency Injection)翻译成中文叫做“依赖注入”,既然对象的整个生命周期都是由Spring框架来维护的,那么我的这个对象中引用了另一个对象,你打算怎么办?Spring框架自然考虑到这一点了。“依赖注入”这两个词语也要拆开来讲:
依赖: 我的A对象中引用了B对象,也就是说A对象依赖B对象。你要通过配置文件告诉Spring你的对象之间的依赖关系。
注入: 你的对象已经交给Spring管理了,你也告诉Spring你的对象之间的依赖关系了,那么在合适的时候,由Spring把你依赖的其他对象(或者资源、常量等)注入给你。
总结就是,把所有的控制权交给Spring,由Spring帮你创建对象、帮你维护对象之间的依赖关系。
3、控制反转和依赖注入之间的关系
控制反转(Inversion Of Control, IOC)是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection, DI), 还有一种叫”依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
4.为什么需要IOC和DI
为什么要有依赖注入(一种设计代码模式)? 因为我们要控制反转(设计代码的思路)。
为什么控制反转?因为我们软件设计需要符合软件设计原则依赖倒置(设计代码原则),单一职责原则。
说通俗点就是咱们要解耦啊。MVP模式就是解耦比较全面的设计模式模型,
5.依赖注入一般有1.构造注入 2.接口注入 3.设值注入。
Spring不使用接口注入(违反Spring声称的非入侵原则(没有它一样活))。使用设值注入。
设值注入是指通过setter方法传入被调用者的实例。这种注入方式简单、直观,因而在Spring的依赖注入里大量使用。
实例:
//这是一个Person的接口
public interface Person {
//一个使用斧头的方法(抽象方法,未实现)
public void UseAxe ();
}
//定义一个Axe的接口
public interface Axe {
//斧头有个砍Chop的方法
public void Chop();
}
//Axe的一个实现类石斧StoneAxe
publice class StoneAxe implements Axe {
//默认构造方法
public StoneAxe(){
}
//实现Axe接口的砍方法
public String Chop () {
return “石斧砍”;
}
}
//Person的实现类中国人Chinese
public class Chinese implements Person {
//面向斧头的接口Axe编程,而不是实现类
private Axe axe;
//默认的构造方法
public Chiniese() {
}
//设值注入所需的setter方法
public void setAxe (Axe axe) {
this.axe = axe;
}
//实现Person接口的使用斧头的方法
publice void UseAxe {
System.out.println(axe.Chop());
}
}
接下来使用spring的配置文件将人Person的实现类Chinese和斧头Axe的实现类StoneAxe联系起来。
<!-- 下面是标准的XML文件头 -->
<?xml version="1.0" encoding="gb2312"?>
<!-- 下面一行定义Spring的XML配置文件的dtd -->
"http://www.springframework.org/dtd/spring-beans.dtd">
<!-- 以上三行对所有的Spring配置文件都是相同的 -->
<!-- Spring配置文件的根元素 -->
<BEANS>
<!—定义第一bean,该bean的id是chinese, class指定该bean实例的实现类 -->
<BEAN class=lee.Chinese id=chinese>
<!-- property元素用来指定需要容器注入的属性,axe属性需要容器注入此处是设值注入,因此Chinese类必须拥有setAxe方法 -->
<property name="axe">
<!-- 此处将另一个bean的引用注入给chinese bean -->
<REF local="”stoneAxe”/">
</property>
</BEAN>
<!-- 定义stoneAxe bean -->
<BEAN class=lee.StoneAxe id=stoneAxe />
</BEANS>
下面是主程序部分:
public class PersonTest{
//主方法,程序的入口
public static void main (String[] args) throw exception {
//因为是独立的应用程序,这里显示的实例化Spring的上下文
ApplicationContext ctx = new FileSystemXmlApplicationContext("bean.xml");
//通过Person的bean的id来获取bean实例,面向接口编程,因此此处强制转换为接口类
Person p = (Person)ctx.getBean("chinese");
//直接执行Person的UseAxe方法
p.UseAxe();
}
}
上面程序执行结果: 石斧砍
*转自: https://www.cnblogs.com/xxzhuang/p/5948902.html
https://blog.youkuaiyun.com/u011068996/article/details/76445379
https://blog.youkuaiyun.com/qin_zhimou/article/details/52662123
https://blog.youkuaiyun.com/baoendemao/article/details/24634835 *详解spring的四种依赖注入方式