当前位置: 首页 > news >正文

Spring框架之我见(三)——IOC、AOP

聊完了Spring框架中最重要的两种设计模式,我们来看一下Spring框架的模块和结构图。

Spring框架的结构

下图是Spring官方给出的Spring框架的结构图。

Spring框架

从图中我们可以看到Spring的四大部分:核心容器(container)、AOP模块、Web模块、Data模块。

  • 首先看核心容器,从核心俩字我们可以看出,这是Spring最重要的部分。主要的功能是实现了控制反转(IOC)与依赖注入(DI)、Bean配置、加载以及生命周期的管理。
  • AOP模块:负责Spring的所有AOP(面向切面)的功能。
  • Web模块:扩展了Spring的Web功能。使其符合MVC的设计规范,最重要的是提供了Spring MVC的容器。
  • Data模块:提供了一些数据相关的组件:包括JDBC、orm(对象关系映射)、事务操作、oxm(对象xml映射)、Jms(Java消息服务)。

我们可以看到Spring给我们提供的模块相当的丰富,无论是持久层业务层还是控制层都有所涉及。

  1. Spring几乎包揽除了业务逻辑之外的的所有工作,包括日志管理、事务管理、Bean管理、安全管理等。
  2. Spring致力于全套的Java问题的解决方案,在所有的Java可以涉足的领域,Spring都会提供相应的支持。(即使没有支持,也会让我们去整合)
  3. 与第三方框架的整合。在我的理解中Spring框架就像一个插线板,而第三方框架就相当于插头,可以轻易地与它组合在一起。需要的时候就插上去,不需要的时候就拔掉,相当的方便。

既然Spring如此的方便,那么它又是如何做到的呢?

很简单,通过两点:

  • 控制反转(IOC)
  • 面向切面编程(AOP)

控制反转(IOC)/依赖注入(DI)

既然说到控制反转,那么我们不禁要问什么控制被反转了?
答案是:我们对对象的控制权被反转了。我们将对象的控制交给了Spring的容器

那么问题又来了,什么是Spring的容器?
简单的说,Spring容器就是一个超级大工厂,负责创建、管理所有的Java对象,这些Java对象被称为Bean。Spring容器管理着容器中Bean之间的依赖关系,Spring使用一种被称为“依赖注入”的方式来管理Bean之间的依赖关系。

什么又是依赖注入呢?
依赖注入(DI)就是控制反转的一种实现形式,Spring容器也是通过这种形式管理Bean的。

Spring容器如何做到替你管理这些bean的呢?
工厂模式。

Spring框架费了九牛二虎之力创建一个Spring容器去帮我们管理这些Bean又有什么好处呢?
其实和工厂模式的好处差不多:

  • 解除硬编码耦合,利于项目升级和维护;
  • 简化了对象的管理,使我们更加专注于业务操作;

聊完了控制反转我们再来看看Spring框架的另一项关键技术AOP。

面向切面编程(AOP)

什么是面向切面编程?

面向切面编程:在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。

这句话读完估计跟没读没什么区别,还是没懂。下面我们来看一张图:

spring-aop

从图中我们可以看出:我们每写一个业务功能,都需要判断权限、记录日志、提交事务、这些逻辑是不是都是重复的呀,这相当于什么呢?相当于我们前面说的脏活累活,这都不是我们的重点,我们的重点是业务逻辑,就是说我们需要把整体框架搭好,实际编写的时候只需要将我们的业务代码切入到框架之中,就行了。

原理:代理模式。

为什么需要AOP?
AOP专门用于处理系统中分布于各个模块或者不同方法中的交叉关注点的问题。比如:在程序中,我们常常需要处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等,AOP是一种非常常用的解决方案。

面向切面编程对我们来说有什么好处?

  1. 减少重复;
  2. 专注业务;

注意:面向切面编程只是面向对象编程的一种补充。

讲了这么多我们来对Spring框架做一个总结。

Spring 总结

  1. Bean的统一管理,降低了对象之间的耦合
  2. 对主流的框架提供了很好的集成支持
  3. 提供众多组件,事务管理,JDBC等
  4. 具有高度可开放性,开发者可以自由选择Spring部分或全部
  5. 主要使用工厂模式和代理模式。
  6. 低侵入,代码污染极低。(我们不会因为用了spring而影响我们的正常的业务逻辑)
  7. AOP的很好支持,方便面向切面编程(AspectJ)。

下一节,我们将讨论Spring框架在WEB开发的应用Spring MVC。

相关文章:

  • 敏捷公关
  • js操作时间(持续更新)
  • 好文分享--java企业架构 spring mvc +mybatis + KafKa+Flume+Zookeeper分布式架构
  • MySQL 千万 级数据量根据(索引)优化 查询 速度
  • mariadb主从复制/半同步复制
  • 我的速读理解
  • Tengine 结合 lua 防御 cc ***
  • 常见高危安全漏洞
  • ajax发送post请求
  • 类型信息
  • mysql如何执行关联查询与优化
  • HP C7000刀片服务器实战3:Redhat Linux 6.8操作系统安装
  • webview 设置夜间模式
  • 004 Ubuntu上安装truffle
  • 2.windows下安装git
  • 5、React组件事件详解
  • javascript面向对象之创建对象
  • JS学习笔记——闭包
  • redis学习笔记(三):列表、集合、有序集合
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • vue中实现单选
  • yii2权限控制rbac之rule详细讲解
  • 关于for循环的简单归纳
  • 记录:CentOS7.2配置LNMP环境记录
  • 力扣(LeetCode)22
  • 用Python写一份独特的元宵节祝福
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • 【云吞铺子】性能抖动剖析(二)
  • zabbix3.2监控linux磁盘IO
  • 阿里云重庆大学大数据训练营落地分享
  • 大数据全解:定义、价值及挑战
  • ​如何防止网络攻击?
  • #git 撤消对文件的更改
  • #NOIP 2014# day.2 T2 寻找道路
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • (1)Nginx简介和安装教程
  • (2.2w字)前端单元测试之Jest详解篇
  • (6)STL算法之转换
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (MATLAB)第五章-矩阵运算
  • (备忘)Java Map 遍历
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (五)网络优化与超参数选择--九五小庞
  • (一)Neo4j下载安装以及初次使用
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • ../depcomp: line 571: exec: g++: not found
  • ./configure,make,make install的作用
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .NET多线程执行函数
  • @configuration注解_2w字长文给你讲透了配置类为什么要添加 @Configuration注解
  • @RestController注解的使用
  • [2018][note]用于超快偏振开关和动态光束分裂的all-optical有源THz超表——
  • [2018-01-08] Python强化周的第一天
  • [Android Pro] listView和GridView的item设置的高度和宽度不起作用
  • [android] 请求码和结果码的作用