Spring—IoC 和 DI、AOP 知识内容理解
spring简介
spring 的主要作用就是为代码“解耦”,降低代码间的耦合度。
Spring 根据代码的功能特点,将降低耦合度的方式分为了两类:IoC
与 AOP
。IoC
使得主业务在相互调用过程中,不用再自己维护关系了,即不用再自己创建要使用的对象了。而是由 Spring 容器统一管理,自动“注入”。而 AOP 使得系统级服务得到了最大复用,且不用再由程序员手工将系统级服务“混杂”到主业务逻辑中了,而是由 Spring 容器统一完成“织入”。
轻量级的 Java 开发框架,解决企业应用开发的复杂性而创建的。Spring 的核心是控制反转(IoC)和面向切面编程(AOP)。简单来说,Spring 是一个分层的 Java SE/EE full-stack(一站式)轻量级开源框架。
Spring 体系结构
Spring 由 20 多个模块组成,它们可以分为数据访问/集成(Data Access/Integration)、Web、面向切面编程(AOP, Aspects)、应用服务器设备管理(Instrumentation)、消息发送(Messaging)、核心容器(Core Container)和测试(Test)。
Spring的特点介绍
非侵入式
Spring 框架的 API 不会在业务逻辑上出现,即业务逻辑是 POJO。由于业务逻辑中没有 Spring 的 API,所以业务逻辑可以从 Spring 框架快速的移植到其他框架, 即与环境无关
容器
可以管理对象的生命周期、对象与对象之间的依赖关系。可以通过配置文件或注解,来定义对象,以及设置与其他对象的依赖关系。
IoC
控制反转(Inversion of Control),即创建被调用者的实例不是由调用者完成,而是由 Spring 容器完成,并注入调用者。
当应用了 IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。即,不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。
理解
将传统代码直接操控的对象调用权交给容器,通过容器来实现对象的装配和管理。控制反转就是对对象控制权的转移,从程序代码本身反转到了外部容器。
从字面分析:
- 谁控制谁:Spring容器控制了对象
- 控制了什么:控制外部资源的获取
- 是什么是反转:有反转就有正转(自己在对象中主动控制去直接获取依赖对象),那么反转就是
容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象
图解:
- 容器主动创建用户类
- 判断用户类是否有依赖对象需要注入
- 如果存在用户信息类需要注入,首先创建用户信息类,然后将其注入用户类中
- 容器管理这些对象的生命周期
- 客户端直接从容器中获取用户类
实现方式有两种:依赖注入和依赖查找。
依赖注入:
Dependency Injection,DI,代码不做定位查询,由容器自行完成。依赖注入 DI 是指程序运行过程中,若需要调用另一个对象协助时,无须在代码中创建被调用者, 而是依赖于外部容器,由外部容器创建后传递给程序。
依赖注入是目前最优秀的解耦方式。依赖注入让 Spring 的 Bean 之间以配置文件的方式或注解组织在一起,而不是以硬编码的方式耦合在一起的。
字面理解
- 谁依赖谁: 应用程序依赖于容器
- 依赖的原因:容器向程序提供对象所需要的外部资源
- 谁注入谁:容器注入应用程序所需要的对象
- 注入了什么:注入应用程序所需要的外部资源
“依赖注入”明确描述了“被注入对象依赖Io容器配置依赖对象”。
AOP
面向切面编程(AOP,Aspect Orient Programming),是一种编程思想,是面向对象编程 OOP 的补充。通过分离应用的业务逻辑与系统级服务(例如日志和事务管理)进行开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责其它的系统级关注点,例如日志或事务支持。
应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责其它的系统级关注点,例如日志或事务支持。
我们可以把日志、安全、事务管理等服务理解成一个“切面”,那么以前这些服务一直是直接写在业务逻辑的代码当中的,这有两点不好:首先业务逻辑不纯净;其次这些服务被很多业务逻辑反复使用,完全可以剥离出来做到复用。可以把这些服务剥离出来形成一个“切面”,以期复用,然后将“切面”动态的“织入”到业务逻辑中