IOC和AOP属于Spring的核心内容。想要精通Spring,就必须对IOC有很好的理解@mikechenIOC的定义IOC是InversionofControl的缩写,大部分书籍都翻译成“控制反转”。IOC不是一种技术,而是一种思想,一种重要的面向对象编程规则,它可以指导我们如何设计出松散耦合的更好的程序。传统应用中,我们主动在类内部创建依赖对象,导致类间耦合度高,测试难度大。有了IoC容器,就把创建和查找依赖对象的控制权交给了容器,如下图所示:\上图介绍了IOC容器,使得A、B、C、D这四个对象没有耦合关系,齿轮之间的传动全部依赖于“第三方”,所有对象的控制权都交给了“第三方”IOC容器。所以,IOC通过“第三方”来实现对象之间有依赖关系的解耦,让程序变得更好。\IOC和DI的关系IOC其实包括依赖查找(DL)和依赖注入(DI),但是DL因为它的侵入性(需要用户使用API??来查找资源和组装对象)而被抛弃了。所以现在一提到IOC,更多的想到的是DependencyInjection(DI),如图:控制(国际奥委会),但这两个标题从两个角度描述了同一个概念。当一个Java对象(调用者)需要调用另一个Java对象(被调用者,即依赖对象)时,在传统模式下,调用者通常使用“newcallee”代码方式创建对象。如图:\\这种方式会增加调用者和被调用者之间的耦合度,不利于后期项目的升级和维护。使用Spring框架后,对象的实例不再由调用者创建,而是由Spring容器创建。Spring容器将负责控制程序之间的关系,而不是直接由调用者的程序代码控制。这样,控制权就从应用程序代码转移到了Spring容器中,控制权反转了。这就是Spring的控制反转IOC。从Spring容器的角度来看,Spring容器负责将依赖对象赋值给调用者的成员变量,相当于为调用者注入了自己所依赖的实例。这就是Spring的依赖注入,如图:\DependencyInjectionmethodSpring的依赖注入,我们一般使用@Autowired注解来完成,关于依赖注入一般有三种方式:属性注入、构造函数注入、setter方法注入:1.属性注入属性注入是最常见也是使用最多的一种,注入方式有两种,代码如下:@ServicepublicclassUserServiceImplimplementsUserService{@AutowiredprivateUserMapperuserMapper;//...}\2.Set注入set方法注入过于臃肿,实际很少用到:@ServicepublicclassUserServiceImplimplementsUserService{privateUserMapperuserMapper;@AutowiredpublicvoidsetUserMapper(UserMapperuserMapper){this.userMapper=userMapper;}}\3。构造函数注入构造函数注入是官方推荐的方式,如下:@ServicepublicclassUserServiceImplimplementsUserService{alprivatefinUserMapperuserMapper;@AutowiredpublicUserServiceImpl(UserMapperuserMapper){this.userMapper=userMapper;}}\IOC的优缺点IOC的优缺点实现了组件之间的解耦,提高了程序的灵活性和可维护性。IOC的缺点使用IOC框架产品可以给我们的开发过程带来很大的好处,但是我们也必须充分了解引入IOC框架的缺点并做到心中有数。生成对象的步骤变复杂了(其实操作很简单),对于不习惯这种方法的人来说,会觉得有点别扭和不直观。因为对象的生成使用了反射式编程,所以在效率上会有一些损失,但是相对于IoC提升的维护性和灵活性来说,这个损失是微不足道的,除非一个对象的生成对效率要求特别高。\IOC的实现原理IOC容器其实就是一个大工厂,用来管理我们所有的对象和依赖。原理是通过Java的反射技术实现的。通过反射,我们可以获得类的所有信息(成员变量、类名等);然后通过配置文件(xml)或者注解来描述类之间的关系。这样,我们就可以利用这些配置信息和反射技术来构建相应的对象和依赖,如下图所示:IOC容器和对象的创建过程如下:1.首先创建BeanFactory容器2.加载配置文件,封装到BeanDefinition3中。调用执行BeanFactoryPostprocessor准备工作;准备BeanPostProcessor;准备听众、活动和广播员;4.实例化5.初始化6.获取完整的对象。以上\作者简介陈锐|mikechen,10年+大厂架构经验,《BAT架构技术500期》系列文章作者,专注于互联网架构技术。阅读更多mikechen的互联网架构Java并发|JVM|MySQL|Spring|Redis|分布式|高并发技术文章关注“mikechen的互联网架构”公众号,回复【架构】领取《Java进阶架构思维导图&Java进阶架构文章合集》\\\
