IOC :Inversion of Control 控制反转
DI : dependency Injection 依赖注入
咋一听,控制反转、依赖注入,似乎很高大上的名字,概念比较抽象,但其实慢慢分析,转换成自己的话也不难理解:
IOC的理解:
在原始社会的时候,我们需要自己生火、自己挖井。这个时候主动权在自己手里。随着时代的发展我们现在有燃气公司和水利公司。我们现在想喝水直接扭水龙头水就流出来了,但是水这个来源的控制权交给自来水公司了,这个过程称之为控制反转
对于Spring来说,以前自己创建的对象UserService service = new UserServiceImpl(),
service.xxx()
而现在,对象的创建交给Spring工厂,用的时候去工厂中获取,
ClassPathXmlApplicationContext ac = new …;
从之前自己创建对象,到现在交给Spring工厂创建对象,包括给属性赋值也交给Spring工厂来完成,这个由我们自己完成一些事情转移到Spring框架完成这些事情的过程,Spring称之为控制反转(IOC)
DI (依赖注入):
如果我们站在spring工厂的角度,工厂创建需要的对象,并且还可以给程序员中的类的属性赋值,对象由工厂创建,最终由程序员使用,这就是spring的依赖注入
IOC和DI实际上是等同的概念,如果要进行区分的话,IOC和DI可以理解为同一个东西的不同角度看法,IOC
站在程序员的角度,以前创建对象是我们自己new出来的,现在让容器自己创建,控制权交给了容器,对于
我们来说控制权反转了。
DI是站在容器的角度,从Spring角度来看,用到的所有的对象都是自己创建的,并且对象在创建的时候需要
依赖的参数也是容器注入的,而这种维持对象之间依赖关系的方式就是依赖注入。
所以IOC和DI实际上都是指容器负责创建对象和维护对象之间依赖关系的这种行为。
说到这里,再来分析一下Spring创建对象的三种方式:
1,通过构造方法创建,采用默认的构造函数,
也就是通过xml+bean标签,bean标签要写class的类的全限定名,其原理是通过java类的反射机制创建对象。
index : 参数的索引,从0 开始
name: 参数名
type:类型(区分开关键字和封装类int 和Integer)
<bean id="peo" class="com.macw.pojo.People"> <!-- ref 引用另一个bean value 基本数据类型或String 等--> <constructor-arg index="0" name="id" type="int" value="123"></constructor-arg> <constructor-arg index="1" name="name" type="java.lang.String" value="张三"></constructor-arg> </bean>
在早期Spring1.0版本,还没有注解的时候,Spring能够帮我们创建对象和管理对象,
但是没有注解每创建一个对象就要配置一个xml,其实还没有我们直接new一个对象来得快呢,
但是为什么spring框架仍然有他的极大优势呢,因为他最重要的一个特性是能够帮我们管理对象,
自己new对象在类中多处调用会造成程序模块之间耦合性太强,不利于维护更新。而spring帮我们管理对象通过依赖注入声明的是管理对象的关系。
2、通过实例工厂创建对象
也就是 工厂设计模式:帮助创建类对象,一个工厂可以生产多个对象
// 工厂,创建对象 public class StudentFactory { // 实例方法创建对象 public Student getInstance() { return new User(001,"学生工厂:调用实例方法"); } // 静态方法创建对象 public static Student getStaticInstance() { return new Student(002," 学生工厂:调用静态方法"); } } 配置文件: <!-- # 3.1 工厂类,实例方法 --> <!-- 先创建工厂 --> <bean id="factory" class="com.macw.StudentFactory"></bean> <!-- 在创建student对象,用factory方的实例方法 --> <bean id="student2" factory-bean="factory" factory-method="getInstance"></bean>
其中: factory-bean=”factory”指定工厂。factory-method=”getInstance”指定工厂的哪个方法。
3.静态工厂创建对象,不需要创建工厂,快速创建对象
实现步骤:编写一个静态工厂(在方法上添加static)
public class StudentFactory{ public static Student newInstance(){ return new Student(001,"studentTest"); } } 在applicationContext.xml中 <bean id = "student2" class = "com.macw.pojo.StudentFactory" factory-method = "newInstance"></bean>
在spring2.0之后采用注解的形式开发,减少了大量 的xml配置文件,开发的形式变为xml+bean配置数据源,大量使用第三方框架,通过组件注解配置自己的类。
spring3.0之后采用配置类+bean注解来创建对象,目的想取代xml配置文件,也就是springboot自动装配的底层原理