心得经验总结:控制反转(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》)。

相关文章
|
前端开发
前端引入字体文件
文章介绍了如何在前端项目中引入字体文件,并展示了具体的HTML和CSS代码示例,包括如何使用`@font-face`规则来定义字体和在页面中应用自定义字体。
426 1
前端引入字体文件
|
消息中间件 存储 网络协议
RabbitMQ的使用
这篇文章详细介绍了RabbitMQ的消息中间件概念、核心组件、通过Docker的安装方法和基本使用步骤,并展示了如何在Spring Boot中整合RabbitMQ,包括依赖配置、消息的发送和接收示例。
RabbitMQ的使用
|
10月前
|
缓存 安全 算法
Java 多线程 面试题
Java 多线程 相关基础面试题
174 2
|
存储 Java C++
Synchronized底层原理
Synchronized底层原理
225 2
|
设计模式 存储 算法
设计模式——责任链
OA系统的采购审批项目、职责链模式基本介绍、职责链模式解决 OA 系统采购审批项目
设计模式——责任链
|
机器学习/深度学习 人工智能 算法
人工智能浪潮下的编程新范式
【9月更文挑战第27天】在AI技术飞速发展的今天,编程领域也迎来了新的变革。本文将深入探讨AI如何改变编程范式,以及这种变革对程序员和整个软件开发行业的影响。通过分析AI技术的特点和优势,我们将揭示它如何为编程带来更高效、智能的解决方案,并展望这一趋势对未来软件开发的深远影响。
268 2
|
消息中间件 前端开发 Java
面试官:说说Spring中IoC实现原理?
IoC(控制反转)是种编程思想,旨在降低代码耦合,提高重用性、可测试性和灵活性。Spring通过工厂模式和反射实现IoC,其中依赖注入(DI)是常见实现方式。初始化IoC容器,读取配置文件创建Bean并利用反射加载对象。课后思考涉及工厂模式在Spring源码中的体现及反射核心实现。更多内容见[www.javacn.site](https://www.javacn.site)。
219 1
|
机器学习/深度学习 人工智能 搜索推荐
人工智能:重塑未来,驱动效率革命
人工智能(AI)是模拟人类智能的技术,让计算机执行需智能才能完成的任务,如理解语言、学习和推理。通过复杂算法,AI能分析大量数据并作出决策。例如,使用`scikit-learn`库训练分类器识别鸢尾花种类。AI未来发展将涉及技术创新如深度与强化学习、应用拓展至医疗健康、智能制造等领域、以及社会影响如就业结构变化和教育变革。AI的优势包括自动化流程、高效数据分析、智能决策、个性化服务及跨领域融合,这些均显著提升了工作效率和社会发展。
|
存储 安全 搜索推荐
想要解析邮件?IMAP协议轻松助你,不再烦恼!
电子邮件仍是关键的通讯工具,利用编程语言自动化处理能显著提高效率。本文介绍使用Go语言从IMAP服务器读取、解析邮件及处理相关信息。首先概述POP3/IMAP/SMTP协议的作用,强调IMAP协议的优势及其在邮件客户端与服务器间双向同步的特点。接着,指导如何获取授权码以连接第三方服务。通过实战演示,展示使用`go-imap`库连接服务器、读取邮件详情(如主题、收件人等)、标记邮件为已读的过程。最后,对比`Store`与`UidStore`方法的区别,指出使用`UidStore`更安全可靠。本文提供了一段详细的Go语言示例代码,帮助读者快速上手。
363 4