心得经验总结:控制反转(IoC)

简介: 心得经验总结:控制反转(IoC)

控制反转(Inversion of Control)缩写:IoC是面向对象编程中框架级别里的一个重要的概念,

可以说Spring框架的核心就是基于IoC原理的。

这个概念到底是什么呢?

这么讲吧,一个系统的运作肯定不是简单的几个类就可以实现的,它往往需要多个类的合作来实现业务逻辑

。这就使得每个对象都需要与其合作的对象具有相互的关系(依赖关系)。在早前编程中所需要的依赖对象

是通过自身去创建得到的,而现在是通过一个容器来统一管理这些依赖关系。在这整个过程中,对象获得其他对象引用的方式其实就是IoC。

IoC的本质是什么?

控制权的转移。IoC原理是基于面向对象中的设计原则的The Hollywood Principle:Don't call us,we'll call you(别找我,我会来找你的)。

可以这样讲,所有组件的初始化和调用都是由容器负责。在传统实现中类之间的关系是由类自己控制的(需要使用其他类时就自己创建),

但是在IoC中,组件处在容器中,由容器统一管理和调度。这就是"控制反转"的概念所在:控制权由应用代码转移到了容器中,即控制权的转移。

那如何实现IoC这种思想的呢?

实现IoC思想的方式主要有两种:依赖注入和依赖查找。

下面就以依赖注入为例讲解一下:

1 1.先定义一个部门接口:

2

3 public interface IDepartService {

4 //通过员工编号获得部门名字

5 public String getDepartNameByUser(int userId);

6 }

7

8 2.实现该接口:

9 public class DepartServiceImpl implements IDepartService {

10

11 @Override

12 public String getDepartNameByUser(int userId) {

13 if(userId==1){

14 return "IT部门";

15 }

16 return "";

17 }

18 }

19 3.定义一个用户类,该类中要维持部门对象的引用:

20

21 public class UserServiceImpl {

22 private IDepartService departService;

23

24 public void printInfo(int userId){

25 System.out.print(getUserName(userId));

26 System.out.println(departService.getDepartNameByUser(userId));

27 }

28

29 public String getUserName(int userId){

30 if(userId==1){

31 return "张三 ";

32 }

33 return "";

34 }

35 }

在用户类中,我们没有看到关于创建DepartService对象的语句。这里面我们没有采用常见的set注入或者构造方法注入,

而是采用反射的方法直接注入并执行的,要实现这个效果的话,我们需要定义一个容器,来管理他们的关系。

4.定义容器,我们在容器中先获取配置文件:

public class Container {

......

private void loadConfig() {

// TODO Auto-generated method stub

InputStream is = Container.class.getResourceAsStream("/ioc.properties");

properties = new Properties();

try {

properties.load(is);

} catch (Exception e) {

// TODO: handle exception

}

}

public Object get(String name) {

String className = (String) properties.get(name);

return Class.forName(className).newInstance();

......

}//代码效果参考:http://www.ezhiqi.com/bx/art_183.html

public void inject(Object obj) {

Field【】 fields = obj.getClass().getDeclaredFields();

......

for (Field field : fields) {

field.setAccessible(true);

field.set(obj, get(field.getName()));

}

......

}

}

在上述中,首先获取配置文件中已配置好的依赖关系,然后采用反射技术根据依赖关系进行创建相应的对象

5.其中ioc.properties的内容为:

departService=com.service.impl.DepartServiceImpl

6.查看入口方法:

public static void main(String【】 args) {

UserServiceImpl user=new UserServiceImpl();

Container container=new Container();

container.inject(user);

user.printInfo(1);

}

7.查看结果:

总结:可以说IoC这个思想是一个很伟大的思想,现在很多大神甚至将它归为GoF中(因为IoC出现的比较晚,错过了GoF“四人组”的《Design Patterns: Elements of Reusable Object-Oriented Software》)。

相关文章
|
6月前
|
XML Java 数据格式
从六个方面读懂IoC(控制反转)和DI(依赖注入)
在一开始学习 Spring 的时候,我们就接触 IoC 了,作为 Spring 第一个最核心的概念,我们在解读它源码之前一定需要对其有深入的认识,对于初学Spring的人来说,总觉得IOC是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及谈谈我对Spring IOC的理解。
206 2
|
XML Java 数据格式
03Spring - 控制反转IOC入门案例
03Spring - 控制反转IOC入门案例
46 0
|
6月前
|
XML Java 数据格式
深入理解 Spring IoC 和 DI:掌握控制反转和依赖注入的精髓
在本文中,我们将介绍 IoC(控制反转)和 DI(依赖注入)的概念,以及如何在 Spring 框架中实现它们。
388 0
|
6月前
|
XML Java 程序员
Spring特性之二——IOC控制反转
Spring特性之二——IOC控制反转
57 4
|
6月前
|
Java Spring 容器
Spring框架之IOC实践
Spring框架之IOC实践
42 0
|
Java 容器 Spring
[javaweb]——spring框架之控制反转(IOC)与依赖注入(DI)
[javaweb]——spring框架之控制反转(IOC)与依赖注入(DI)
|
XML 开发框架 Java
Spring框架IoC控制反转
Spring是与2003年兴起的一个轻量级的Java开发框架,它是为了解决企业应用开发的复杂性而创建的。Spring的核心是控制反转(IOC)和面向切面编程(AOP)。Spring是可以在Java SE/EE中使用的轻量级开源框架。 Spring的主要作用就是为代码"解耦",降低代码间的耦合度。就是让对象和对象(模板和模板)之间关系不是使用代码关联,而是通过配置来说明。即在Spring中说明对象(模块)的关系。 Spring根据代码的功能特点,使用IOC降低业务对象之间耦合度。IOC使得主业务在相互调用过程中,不用再自己维护关系了,即不用再自己创建要使用的对象了,而是由Spring容器统一
81 2
|
XML 设计模式 Java
【面试必问】Spring核心之控制反转(IOC)
Spring Bean是Spring框架中的一个核心概念,它是一个由Spring容器管理的对象。在Spring中,Bean是指任何一个由Spring容器所管理的对象,可以是Java类的实例、数据源、事务管理器等等
126 1
【面试必问】Spring核心之控制反转(IOC)
|
运维 Java vr&ar
控制反转|学习笔记
快速学习控制反转
控制反转|学习笔记
|
XML Java 程序员
Spring的艺术(二):控制反转(IOC)和依赖注入(DI)的完美实现
IOC叫做控制反转,从本质上讲,IOC就是把原本由程序员创建的对象的这个动作交给Spring去实现,程序员无需再去管理对象的创建,这种方式可以大大减少系统的偶尔性。 没有IOC之前,对象的创建和对象间的依赖关系都完全编码在程序中,使用IOC之后,对象的创建由程序自己控制,使得程序解耦合。 IOC并不是一种技术,他是一种思想,即控制权反转的思想,DI(依赖注入)则是Spring实现IOC的方法。 Spring容器在初始化时根据配置文件或元数据创建和组织对象存入容器中,需要使用时再从IOC容器中获取。