SpringBoot的IOC和AOP
1. IOC
控制反转(IOC)和依赖注入(DI)是同一个概念,目的在于降低系统耦合,将类的实例化工作交给Spring代理,主要用到的设计模式为工厂模式,通过Java反射机制实现类的自动注入。
IoC(Inverse of Control:控制反转)是⼀种设计思想,就是 将原本在程序中⼿动创建对象的控制 权,交由Spring框架来管理。 IoC 在其他语⾔中也有应⽤,并⾮ Spring 特有。 IoC 容器是 Spring ⽤来实现 IoC 的载体, IoC 容器实际上就是个Map(key,value),Map 中存放的是各 种对象。
将对象之间的相互依赖关系交给 IoC 容器来管理,并由 IoC 容器完成对象的注⼊。这样可以很⼤ 程度上简化应⽤的开发,把应⽤从复杂的依赖关系中解放出来。 IoC 容器就像是⼀个⼯⼚⼀ 样,当我们需要创建⼀个对象的时候,只需要配置好配置⽂件/注解即可,完全不⽤考虑对象是如 何被创建出来的。
1.2 方式
- 接口注入
- Construct注入
- Setter注入
1.3 目的
- 降低类之间的耦合
- 倡导面向接口编程、实施依赖倒换原则
- 提高系统可插入、可测试、可修改特性
1.4 具体做法
- 将bean之间的依赖关系尽可能地转换为关联关系
- 将对具体类的关联尽可能地转换为对Java 接口的关联,而不是与具体的服务对象相关联
- bean实例具体关联相关Java 接口的哪个实现类的实例,在配置信息的元数据中描述
- 由IOC组件(或称容器)根据配置信息,实例化具体bean类,将bean之间的依赖关系注入进来
1.5 所属包
org.springframework.beans
及org.springframework.context
包是Spring IoC
容器的基础。
BeanFactory
提供的高级配置机制,使得管理任何性质的对象成为可能。
ApplicationContext
是BeanFactory
的扩展,功能得到了进一步增强,比如更易与Spring AOP
集成、消息资源处理(国际化处理)、事件传递及各种不同应用层的context
实现(如针对web
应用的WebApplicationContext
)。
简而言之,BeanFactory
提供了配制框架及基本功能,而ApplicationContext
则增加了更多支持企业核心内容的功能。ApplicationContext
完全由BeanFactory
扩展而来,因而BeanFactory
所具备的能力和行为也适用于ApplicationContext
。
IoC容器负责容纳bean,并对bean
进行管理。在Spring中,BeanFactory
是IoC容器的核心接口。它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。Spring为我们提供了许多易用的BeanFactory
实现,XmlBeanFactory
就是最常用的一个。该实现将以XML方式描述组成应用的对象以及对象间的依赖关系。XmlBeanFactory
类将持有此XML配置元数据,并用它来构建一个完全可配置的系统或应用。
Resource resource = new FileSystemResource("beans.xml");
BeanFactory factory = new XmlBeanFactory(resource);
... 或...
ClassPathResource resource = new ClassPathResource("beans.xml");
BeanFactory factory = new XmlBeanFactory(resource);
... 或...
ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"applicationContext.xml", "applicationContext-part2.xml"});
// of course, an ApplicationContext is just a BeanFactory
BeanFactory factory = (BeanFactory) context;
将XML配置文件分拆成多个部分是非常有用的。为了加载多个XML文件生成一个ApplicationContext实例,可以将文件路径作为字符串数组传给ApplicationContext
构造器。而bean factory将通过调用bean defintion reader从多个文件中读取bean定义。
通常情况下,Spring团队倾向于上述做法,因为这样各个配置并不会查觉到它们与其他配置文件的组合。另外一种方法是使用一个或多个的 <import/>
元素来从另外一个或多个文件加载bean定义。所有的 <import/>
元素必须放在<bean/>
元素之前以完成bean定义的导入。 让我们看个例子:
<beans><import resource="services.xml"/><import resource="resources/messageSource.xml"/><import resource="/resources/themeSource.xml"/><bean id="bean1" class="..."/><bean id="bean2" class="..."/>
</beans>
在上面的例子中,我们从3个外部文件:services.xml、 messageSource.xml及 themeSource.xml
来加载bean定义。这里采用的都是相对路径,因此,此例中的 services.xml
一定要与导入文件放在同一目录或类路径,而 messageSource.xml
和 themeSource.xml
的文件位置必须放在导入文件所在目录下的 resources
目录中。正如你所看到的那样,开头的斜杠/
实际上可忽略。因此不用斜杠/
可能会更好一点。
1.6 BeanFactory和FactoryBean的区别
BeanFactory是加载的容器,加载一切的Bean,而FactoryBean用于创建代理类。
BeanFactory它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。
FactoryBean(通常情况下,bean无须自己实现工厂模式,Spring容器担任工厂角色;但少数情况下,容器中的bean本身就是工厂,其作用是产生其它bean实例),作用是产生其他bean实例。通常情况下,这种bean没有什么特别的要求,仅需要提供一个工厂方法,该方法用来返回其他bean实例。由工厂bean产生的其他bean实例,不再由Spring容器产生,因此与普通bean的配置不同,不再需要提供class元素。
ProxyFactoryBean
用于创建代理(根据Advisor生成的Bean,也就是TargetBean的代理)
2. AOP
面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
能够将那些与业务⽆关,却为业务模块所共 同调⽤的逻辑或责任(例如事务处理、⽇志管理、权限控制等)封装起来,便于减少系统的重复 代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。
2.1 概念
- 方面(Aspect):一个关注点的模块化,这个关注点实现可能另外横切多个对象。事务管理是J2EE应用中一个很好的横切关注点例子。方面用Spring的Advisor或拦截器实现。将那些影响了 多个类的公共行为封装到一个可重用模块。简单地说,就是将那些与业务无关,却为业务模块所共同调用的 逻辑或责任封装起来,比如日志记录,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。
- 切入点(Pointcut):指定一个通知将被引发的一系列连接点的集合。
- 连接点(Joinpoint):程序执行过程中明确的点,如方法的调用或特定的异常被抛出。
- 通知(Advice):在特定的连接点,AOP框架执行的动作。
- 目标对象(Target Object):包含连接点的对象,也被称作被通知或被代理对象。
- AOP代理(AOP Proxy):AOP框架创建的对象,包含通知。在Spring中,AOP代理可以是JDK动态代理或CGLIB代理。
- 引入(Introduction):添加方法或字段到被通知的类。Spring允许引入新的接口到任何被通知的对象。
- 编织(Weaving):组装方面来创建一个被通知对象。
2.2 使用场景
- 权限检查
- 缓存
- 内容传递
- 错误处理
- 日志记录,跟踪,优化,校准
- 性能优化,效率检查
3. 设计模式
在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入,和AOP,面向切面编程,这两个是Spring的灵魂。
主要用到的设计模式有工厂模式和代理模式。
IOC就是典型的工厂模式,通过sessionfactory去注入实例。
AOP就是典型的代理模式的体现。
4. Spring优点
- 降低了组件之间的耦合性 ,实现了软件各层之间的解耦
- 可以使用容易提供的众多服务,如事务管理,消息服务等
- 容器提供单例模式支持
- 容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能
- 容器提供了众多的辅助类,能加快应用的开发
- spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等
参考文章
- https://blog.csdn.net/MarkSorin/article/details/79640085
- https://blog.csdn.net/baidu_20876831/article/details/78956220
- https://blog.csdn.net/luoshenfu001/article/details/5816408?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-2.control&dist_request_id=&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-2.control
SpringBoot的IOC和AOP相关推荐
- 【SpringBoot】SpingBoot整合AOP
说起spring,我们知道其最核心的两个功能就是AOP(面向切面)和IOC(控制反转),这边文章来总结一下SpringBoot如何整合使用AOP. 一.示例应用场景:对所有的web请求做切面来记录日志 ...
- 【Spring 源码阅读】Spring IoC、AOP 原理小总结
Spring IoC.AOP 原理小总结 前言 版本约定 正文 Spring BeanFactory 容器初始化过程 IoC 的过程 bean 完整的创建流程如下 AOP 的过程 Annotation ...
- 浅谈 Spring IOC和AOP
浅谈 Spring IOC和AOP IOC 控制反转 以前创建对象的主动权和时机是由于自己把握的,现在将这种权利转移到Spring容器中,并且根据配置文件去创建对象管理对象 ioc的注入方式有三种:构 ...
- BeanPostProcessor —— 连接Spring IOC和AOP的桥梁
之前都是从大Boss的视角,来介绍Spring,比如IOC.AOP. 今天换个视角,从一个小喽啰出发,来加深对Spring的理解. 这个小喽啰就是, BeanPostProcessor (下面简称 B ...
- 自己动手实现的 Spring IOC 和 AOP - 下篇
1. 背景 本文承接上文,来继续说说 IOC 和 AOP 的仿写.在上文中,我实现了一个很简单的 IOC 和 AOP 容器.上文实现的 IOC 和 AOP 功能很单一,且 IOC 和 AOP 两个模块 ...
- 自己动手实现的 Spring IOC 和 AOP - 上篇
1. 背景 我在大四实习的时候开始接触 J2EE 方面的开发工作,也是在同时期接触并学习 Spring 框架,到现在也有快有两年的时间了.不过之前没有仿写过 Spring IOC 和 AOP,只是宏观 ...
- Spring 原理初探——IoC、AOP
前言 众所周知, 现在的 Spring 框架已经成为构建企业级 Java 应用事实上的标准了,众多的企业项目都构建在 Spring 项目及其子项目之上,特别是 Java Web 项目. Spring ...
- spring aop 必须的包 及里面用到的东西_Spring 原理初探——IoC、AOP
前言 众所周知, 现在的 Spring 框架已经成为构建企业级 Java 应用事实上的标准了,众多的企业项目都构建在 Spring 项目及其子项目之上,特别是 Java Web 项目. Spring ...
- 我们到底为什么要用 IoC 和 AOP
作为一名 Java 开发,对 Spring 框架是再熟悉不过的了.Spring 支持的控制反转(Inversion of Control,缩写为IoC)和面向切面编程(Aspect-oriented ...
最新文章
- OUR D3.JS 数据可视化专题站(转)
- 开放下载!《iOS开发者必读资讯》
- jsp整合mybatis案例
- 5G三兄弟NB-IoT排老几?NB-IoT介绍
- 俯瞰大雾弥漫下的鄱阳湖二桥
- Java Android 代码片段收集
- bootstrapmodel确认操作框_光伏电站EL检测仪的操作流程
- chengg0769 近期文章列表 垂直搜索相关(2007-07-10)
- 简洁代码实现pdf转word文档
- 广义S变换的地震高分辨率处理中的应用
- 网站交互式公安备案详细流程
- ant design中Button与button点击事件
- vi与vim的区别以及常用命令
- 2022 年云计算发展趋势
- 知识笔记 - sekiro RPC框架的安装与简单使用
- WEB前端项目实战/酒仙网开发-李强强-专题视频课程
- 2023-03-27-安装office365显示Microsoft Office 专业增强版 2016
- 实战-Android 系统读取Uboot环境变量实现
- 比 B 站好用,堪称二次元福音!GitHub 这款「动漫搜番」神器我爱了!
- DNS服务(域名系统、过程、bind、配置文件、查看本设备dns)