IOC概念和原理
IOC,即Inversion of Control,译为“控制反转”,这是一种设计思想。这意味着将设计好的对象交给容器控制, 而不是直接对对象进行操作控制。这意味着不是简单的对bean对象直接进行操作,而是面向接口编程。这样会使程序具有更大的扩展性,降低模块之间的耦合度。主要思想是:**下层交给IOC容器进行管理,上层需要使用时通过IOC容器进行实例化、定位、配置、组装。**刚开始学习面向对象编程时容易发生因为上层依赖下层而修改上层建筑,通过IOC容器的依赖注入后,就可以解决这个问题。
下面是我们老师布置的课后作业,通过IOC容器的简易实现来深化对其的理解:
题:代码中Test.java通过依赖注入的方式调用了火车出行的功能,请该写程序,要求:
a. 编写一个可配置的IOC容器类,该IOC容器类可以根据调用参数,通过读取本地配置文件的信息,
生成所需要的交通工具对象,返回给调用者。
b.在Test.java中,接受键盘输入的交通工具信息,以依赖注入的方式调用IOC容器生成的对象,实现出行功能。
在这里我使用的是IDEA创建的Maven项目。
使用的maven依赖如下 pom.xml
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.3.RELEASE</version>
</dependency>
</dependencies>
交通工具接口类 Vehicle.java
package edu.cn.work.ioc;
public interface Vehicle {
public void journey(String TravelTool);
}
交通工具接口的实现类 VehicleImpl.java
package edu.cn.work.ioc;
/**
* Vehicle接口的实现类
*/
public class VehicleImpl implements Vehicle{
@Override
public void journey(String TravelTool) {
System.out.println("我采用了 "+TravelTool+" 出行");
}
}
配置文件 vehicle.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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- id 表示组件的名字,class表示组件类 -->
<bean id="vehicle" class="edu.cn.work.ioc.VehicleImpl"></bean>
</beans>
测试类 VehicleTest.java
package edu.cn.work.ioc;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.Scanner;
public class VehicleTest {
/**
* 依赖注入
* @param TravelTool
*/
public void journey(String TravelTool){
//读取配置文件实例化一个IOC容器
ApplicationContext context = new ClassPathXmlApplicationContext
("vehicle.xml");
//从IOC容器获取bean,此处为“面向接口编程”
Vehicle vehicleApi=context.getBean("vehicle",Vehicle.class);
//执行业务逻辑
vehicleApi.journey(TravelTool);
}
public static void main(String[] args) {
VehicleTest test=new VehicleTest();
//键盘输入
Scanner scanner=new Scanner(System.in);
System.out.print("请输入你需要的交通工具:");
String travelTool=scanner.next();
test.journey(travelTool);
}
}
运行结果如下:
IOC容器的工作流程(以xml配置为例):
一、准备配置文件
在配置文件中声明bean对象。
二、由IOC容器解析
IOC容器的Bean Reader读取并解析配置文件,根据定义生成BeanDefintion配置元数据对象,IOC容器根据BeanDefinition进行实例化、配置及组装Bean。
三、实例化IOC容器
由客户端实例化容器,获取需要的Bean对象。
本次的学习就到这啦!