一.由来
1.IOC
IOC是Inversion of Control的缩写,多数书籍翻译成“控制反转”。1996年,Michael Mattson在一篇有关探讨面向对象框架的文章,首先提出了IOC 这个概念。IOC理论提出的观点大体是这样的:借助于“第三方”实现具有依赖关系的对象之间的解耦。这个第三方就是"IOC容器"。个人理解:在java中我们一般都是通过new来创建对象。但是有了ioc容器我们就能直接拿对象,因为容器已经按我们的配置(各种注入方式)创建好了对象。我们从"创建"=>"拿",这就是反转。
2.DI
IOC也叫依赖注入(DI)。2004年,Martin Fowler探讨了同一个问题,既然IOC是控制反转,那么到底是“哪些方面的控制被反转了呢?”,经过详细地分析和论证后,他得出了答案:“获得依赖对象的过程被反转了”。控制被反转之后,获得依赖对象的过程由自身管理变为了由IOC容器主动注入。于是,他给“控制反转”取了一个更合适的名字叫做“依赖注入(Dependency Injection)”。他的这个答案,实际上给出了实现IOC的方法:注入。所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。所以,依赖注入(DI)和控制反转(IOC)是从不同的角度的描述的同一件事情,就是指通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦。个人理解:其实就是通过依赖注入实现控制反转。
二.初始化ioc容器的两种方法
1.xml文件配置 (顺带说明bean的初始化时间)
这是普遍使用的初始化方法。通常命名为applicationContext.xml.
新建2个实体类:Student 和Car
package org.test.object;
public class Student {
private int sno;
private String name;
public int getSno() {
return sno;
}
public void setSno(int sno) {
this.sno = sno;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Student(int sno, String name) {
super();
this.sno = sno;
this.name = name;
System.out.println("有参构造");
}
public Student() {
}
package org.test.object;
public class Car {
private String name;
private String company;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
public Car(String name, String company) {
super();
this.name = name;
this.company = company;
}
public Car() {
}
}
在applicationContext.xml文件中配置(set方法注入) 并初始化。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- xml形式产生ioc容器 -->
<!-- setter getter 注入 -->
<bean id="student" class="org.test.object.Student">
<property name="sno" value="117405521"></property>
<property name="name" value="吴迪"></property>
</bean>
<bean id="car" class="org.test.object.Car">
<property name="name" value="奥迪"></property>
<property name="company" value="aaa"></property>
</bean>
</beans>
测试方法:
public static void XML() {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//Student stu = (Student) context.getBean("student");
String[] names = context.getBeanDefinitionNames();
for(String name :names) {
System.out.println(name);
}
System.out.println(111);
}
getBeanDefinitionNames()能拿到容器目前注入的所有bean的名字。
运行测试:
在代码块中我没有getBean(),但是结果显示2个实体类已被初始化。这就说明一旦启动Ioc容器,容器初始化时里面的bean也已经被初始化。
2.@Configuration注解初始化IOC容器
https://blog.csdn.net/zyhlwzy/article/details/88815508。推荐者这篇博客,非常详细。
三.xml配置的几种注入方式
1.set注入
<bean id="student" class="org.test.object.Student">
<property name="sno" value="117405521"></property>
<property name="name" value="吴迪"></property>
</bean>
<bean id="car" class="org.test.object.Car">
<property name="name" value="奥迪"></property>
<property name="company" value="aaa"></property>
</bean>
先写到这,容我措词一会。。