学习java,如果不会IoC和AOP,会被吐槽是不是一个合格的程序员,但是又有几个人能清晰准确地把它们含义向别人表示清楚。
1、IoC设计思想
IoC—Inversion of Control,即“控制反转”,我一直觉得“反转”叫法别扭,我个人觉得“控制权转移”更好理解点。在Java开发中,如果需要使用其他对象,我们可以在对象内部通过new进行创建引用对象,但是如果这样开发代码,代码的耦合性太高,性能开销也很大,重复代码也会很多。
用图例说明一下,传统程序设计如图,都是主动去创建相关对象然后再组合起来:
当有了IoC/DI的容器后,在客户端类中不再主动去创建这些对象了,如图所示:
在Java开发中,IoC意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。设计的对象控制权由主动控制变成被动的的接受依赖,这就是所谓的“反转”,依赖对象的获取方式被反转了。其实也就是设计的对象控制权从你的对象转到了IoC容器中。IoC容器成了大管家,终于不用自己亲手泡咖啡了,和大管家说一声,大管家咖啡泡好主动端给你。即由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。
IoC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。
2、IoC和DI
IoC和DI什么关系呢?其实它们是同一个概念的不同角度描述,由于控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以2004年大师级人物Martin Fowler又给出了一个新的名字:“依赖注入”,相对IoC 而言,“依赖注入”明确描述了“被注入对象依赖IoC容器配置依赖对象”。
理解DI的关键是:“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么”,那我们来深入分析一下:
●谁依赖于谁:当然是应用程序依赖于IoC容器;
●为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源;
●谁注入谁:很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象;
●注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。
3、spring三种注入方式
1. 接口注入(不推荐)
2. getter,setter方式注入(比较常用)
3. 构造器注入(官方推荐)
其中注解方式的注入Bean,有三种方式:
- 使用字段Field注入(使用注解);
- 使用Setter方法注入(需要加注解@Autowired等,或者自己创建Bean,调用该Setter方法设进去);
- 构造器注入 (需要加注解@Autowired等,或自己创建Bean,放入构造器中创建);
注解注入方式具体用法和比较可以参考:
https://blog.csdn.net/qq_22075041/article/details/72008825
https://www.cnblogs.com/joemsu/p/7688307.html
4、Spring IoC容器
IoC容器功能
- 管理Bean
- 定义Bean
- Bean的加载解析注册
IoC容器的源码实现