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.csdn.net/u011068996/article/details/76445379
https://blog.csdn.net/qin_zhimou/article/details/52662123
https://blog.csdn.net/baoendemao/article/details/24634835 *详解spring的四种依赖注入方式