IOC与AOP属于Spring的核心内容,如果想把握好Spring你必定须要对IOC有足够的理解 @mikechen

IOC的定义

IOC是Inversion of Control的缩写,少数书籍翻译成“管制反转”。

IOC不是一种技术,只是一种思维,一个重要的面向对象编程的法令,它能领导咱们如何设计出松耦合、更低劣的程序。

传统应用程序都是由咱们在类外部被动创立依赖对象,从而导致类与类之间高耦合,难于测试,有了IoC容器后,把创立和查找依赖对象的控制权交给了容器,如下图所示:\

上图引入了IOC容器,使得A、B、C、D这4个对象没有了耦合关系,齿轮之间的传动全副依附“第三方”了,全副对象的控制权全副上缴给“第三方”IOC容器。

所以,IOC借助于“第三方”实现具备依赖关系的对象之间的解耦,使程序更低劣。

\

IOC与DI的关系

其实IOC包含依赖查找(DL)和依赖注入(DI),只不过DL因为有侵入性 (它须要用户本人去是应用 API 进行查找资源和组装对象),曾经被摈弃。

所以当初提到IOC,更多的想到的就是依赖注入(DI)了,如图所示:\

DI的全称是Dependency Injection,中文称之为依赖注入,它与管制反转(IOC)的含意雷同,只不过这两个称说是从两个角度形容的同一个概念。

当某个Java对象(调用者)须要调用另一个Java对象(被调用者,即被依赖对象)时,在传统模式下,调用者通常会采纳“new 被调用者”的代码形式来创建对象,如图所示:\
\
这种形式会导致调用者与被调用者之间的耦合性减少,不利于前期我的项目的降级和保护。

在应用Spring框架之后,对象的实例不再由调用者来创立,而是由Spring容器来创立,Spring容器会负责控制程序之间的关系,而不是由调用者的程序代码间接管制。

这样,控制权由利用代码转到了Spring容器,控制权产生了反转,这就是Spring的管制反转IOC。

从Spring容器的角度来看,Spring容器负责将被依赖对象赋值给调用者的成员变量,这相当于为调用者注入了它依赖的实例,这就是Spring的依赖注入,如图所示:

\

依赖注入形式

Spring的依赖注入,咱们个别应用@Autowired注解来实现,对于依赖注入个别有三种形式:

属性注入、结构器注入、setter办法注入:

1.属性注入

属性注入是大家最为常见也是应用最多的一种注入形式了,代码如下:

@Servicepublic class UserServiceImpl implements UserService {    @Autowired    private UserMapper userMapper;    //...}

\

2.Set注入

set 办法注入太过于臃肿,实际上很少应用:

@Servicepublic class UserServiceImpl implements UserService {    private UserMapper userMapper;    @Autowired    public void setUserMapper(UserMapper userMapper) {        this.userMapper = userMapper;    }}

\

3.结构器注入

结构器注入是官网举荐的形式,如下:

@Servicepublic class UserServiceImpl implements UserService {    private final UserMapper userMapper;        @Autowired    public UserServiceImpl(UserMapper userMapper) {        this.userMapper = userMapper;    }}

\

IOC的优缺点

IOC的长处

实现组件之间的解耦,进步程序的灵活性和可维护性。

IOC的毛病

应用IOC框架产品可能给咱们的开发过程带来很大的益处,然而也要充分认识引入IOC框架的毛病,做到成竹在胸。

  1. 生成一个对象的步骤变简单了(其实上操作上还是挺简略的),对于不习惯这种形式的人,会感觉有些顺当和不直观。
  2. 对象 生成因为是应用反射编程,在效率上有些损耗,但绝对于IoC进步的维护性和灵活性来说,这点损耗是微不足道的,除非某对象的生成对效率要求特地高。

\

IOC的实现原理

IOC容器其实就是一个大工厂,它用来治理咱们所有的对象以及依赖关系。

  • 原理就是通过 Java 的反射技术来实现的,通过反射咱们能够获取类的所有信息(成员变量、类名等等等);
  • 再通过配置文件(xml)或者注解来形容类与类之间的关系。

这样咱们就能够通过这些配置信息和反射技术来构建出对应的对象和依赖关系了,如下图所示:

IOC容器和对象的创立过程如下:

1.先创立BeanFactory容器

2.加载配置文件,封装成BeanDefinition

3.调用执行BeanFactoryPostprocessor

  • 筹备工作;
  • 筹备BeanPostProcessor;
  • 筹备监听器、事件、播送器;

4.实例化

5.初始化

6.获取到残缺对象。

以上\

作者简介

陈睿|mikechen,10年+大厂架构教训,《BAT架构技术500期》系列文章作者,专一于互联网架构技术。

浏览mikechen的互联网架构更多技术文章合集

Java并发|JVM|MySQL|Spring|Redis|分布式|高并发

关注「mikechen 的互联网架构」公众号,回复 【架构】 支付《Java进阶架构思维导图&Java进阶架构文章合集》\

\

\