Spring两大特性:IOC和AOP

2023-11-12

Spring拥有两大特性:IOC(控制反转),AOP(面向切面编程)。
Spring注解
Spring为我们提供了多个方便的注解,例如:
@Controller:标明为控制层组件
@Service:服务层组件
@Repository:DAO层
@Compoent:标明是受Spring本身所管理的一个组件
@Bean:注解的方法会产生一个Bean对象,该对象由Spring管理并放到IoC容器中
@Autowired和@Resource 这两个注解用的比较多,这里就不做阐述了
接下来我们说说控制反转(IOC)
控制反转,简单点说,就是创建对象的控制权,被反转到了Spring框架上。

通常,我们实例化一个对象时,都是使用类的构造方法来new一个对象,这个过程是由我们自己来控制的,而控制反转就把new对象的工交给了Spring容器。
IOC主要依靠依赖注入的方式去实现
组件不做定位查询,只提供标准的Java方法让容器去决定依赖关系。容器全权负责组件的装配,把符合依赖关系的对象通过Java Bean属性或构造方法传递给需要的对象。
IOC容器
IoC容器:具有依赖注入功能的容器,可以创建对象的容器。IoC容器负责实例化、定位、配置应用程序中的对象并建立这些对象之间的依赖。
依赖注入
依赖注入:又叫DI,由IoC容器动态地将某个对象所需要的外部资源(包括对象、资源、常量数据)注入到组件(Controller, Service等)之中。简单点说,就是IoC容器会把当前对象所需要的外部资源动态的注入给我们。
Spring依赖注入的方式主要有四个,基于注解注入方式、set注入方式、构造器注入方式、静态工厂注入方式。我们一般都使用注解注入,配置较少,比较方便。
面向切面编程(AOP)
AOP:AOP是Spring提供的关键特性之一。AOP即面向切面编程,是OOP编程的有效补充。使用AOP技术,可以将一些系统性相关的编程工作,独立提取出来,独立实现,然后通过切面切入进系统。从而避免了在业务逻辑的代码中混入很多的系统相关的逻辑——比如权限管理,事物管理,日志记录等等。这些系统性的编程工作都可以独立编码实现,然后通过AOP技术切入进系统即可。从而达到了 将不同的关注点分离出来的效果。
以下图为例:
在这里插入图片描述
业务ABC现在需要一个相同的操作,传统方法我们可能需要在ABC中都加入相关操作代码,而应用AOP就可以只写一遍代码,ABC共用这段代码。并且,当ABC需要增加新的操作时,可以在不改动原代码的情况下,灵活添加新的业务逻辑实现。
AOP三大关键概念:Pointcut、Advice和Advisor。
Pointcut(切入点)
介绍之前,先得清楚Join Point(连接点)的概念。oin Point指的是程序运行中的某个阶段点,如某个方法调用、异常抛出等。
Pointcut是Join Point的集合,它是程序中需要注入Advice的位置的集合,指明Advice要在什么样的条件下才能被触发。
org.springframework.aop.Pointcut 接口用来指定通知到特定的类和方法。
Pointuct.java源码如下:
public interface Pointcut {

     //用来将切入点限定在给定的目标类中

     ClassFilter getClassFilter();

     //用来判断切入点是否匹配目标类给定的方法

     MethodMatcher getMethodMatcher();

     Pointcut TRUE = TruePointcut.INSTANCE;

}
在接口Pointcut中,主要包含两个接口:ClassFilter和MethodMatcher,有利于代码的重用。
Advice(通知)
Advice是某个连接点所采用的处理逻辑,也就是向连接点注入的代码。前面示例中提取出来输出日志信息的代码就是一个Advice,表示要在Join Point加入这段代码。
Advisor
Advisor是Pointcut和Advice的配置器,它包括Pointcut和Advice,是将Advice注入程序中Pointcut位置的代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring两大特性:IOC和AOP 的相关文章

  • C++11移动语义解析

    当给函数传递对象当做函数参数时 可以使用引用类型来减少拷贝对象的代价 尤其是避免容器的拷贝等 但是当把函数内的局部对象当做返回值时 我们无法返回该局部对象的引用 导致每次返回局部对象都会进行拷贝 因为返回局部对象的引用是无意义的 当函数调用
  • 编译原理实验日志

    编译原理 生成四元式 实验原理 构造SLR 1 分析表 调试过程 实验原理 构造SLR 1 分析表 首先求得follow集 follow E follow T follow F 画出DFA状态转换图 调试过程 没有判断 因为字符串中没有表示
  • dubbo优雅停机

    dubbo优雅停机 Dubbo是通过JDK的ShutdownHook来完成优雅停机的 所以如果用户使用 kill 9 PID 等强制关闭指令 是不会执行优雅停机的 只有通过 kill PID 时 才会执行 原理 服务提供方 停止时 先标记为
  • grafana与prometheus实现监控可视化

    1 Grafana基础知识 Grafana是一个开源的指标监测和可视化工具 官方网站为 Grafana The open observability platform Grafana Labs 常用于展示基础设施的时序数据和应用程序运行分析
  • 大话设计模式9—观察者模式(通知者与观察者)

    大话设计模式9 观察者模式 老板回来 我不知道 1 需求 老板回来 我不知道 2 双向耦合的设计 2 1 前台秘书类 2 2 看股票同事类 2 3main函数及输出 3 解耦修改 3 1 抽象观察者类 3 2 前台秘书类 3 3 main函
  • Java编程中出现乱码的原因

    乱码的原因 理解了编码 我们来看乱码 乱码有两种常见原因 一种比较简单 就是简单的解析错误 另外一种比较复杂 在错误解析的基础上进行了编码转换 我们分别介绍 1 解析错误 看个简单的例子 一个法国人采用Windows 1252编码写了个文件
  • Windows/PC(win + R) 电脑常见操作命令50条

    摘要 win R 1 cmd 打开终端 2 gpedit msc 本地组策略编辑器 3 Nslookup IP地址侦测器 4 explorer 文件资源管理器 5 notepad 系统默认记事本 6 cleanmgr 磁盘清理 7 serv
  • 微信公众号运营错误的四个方式

    1 很多广告宣传 很多的微信公众平台注册便是为了更好地宣传策划商品 在开展內容輸出的情况下 沒有立在客户的视角开展內容輸出 消息推送的內容可能是七拼八凑 与微信公众号的精准定位偏移很远 要想取得成功的运营公众号 最先要做的便是深层次发掘总体
  • vue3 + vite 在线预览docx, pdf, pptx(内外网)并实现移动端适配

    一 内网 1 docx 使用docx preview 安装插件 npm i docx preview S 引入依赖 docx import renderAsync from docx preview let docx import meta
  • GO终端读取

    GO终端读取 Go语言获取标准输入 Go语言 fmt 包下有 fmt Scan fmt Scanf fmt Scanln 三个函数 可以在程序运行过程中获取用户输入 func Scan a interface n int err error
  • Spring核心之一:IOC

    IOC Inversion of Control 其实是一种思想 这种思想并不是Spring独有的 而是在软件开发中 大家提出的一种开发原则 类似面向接口编程原则 开闭原则等 网上有很多类似的文章尝试去通俗易懂地解释IOC思想 这里我根据自
  • BugkuCTF-Crypto题小山丘的秘密

    本题考查希尔密码 解题流程 题目信息 1 根据提示知道是希尔 hill 密码 解密网站 www atoolbox net Tool php Id 914 ac csdn flag txt 里给出A 1 一般的希尔密码是A 0 B 1 C 2
  • Vue.js 学习笔记 第5章 内置指令

    本篇目录 5 1 基本指令 5 2 条件渲染指令 5 3 列表渲染指令 v for 5 4 方法与事件 5 5 实战 利用计算属性 指令等知识开发购物车 回顾一下第2 2节 我们己经介绍过指令 Directive 的概念了 Vue js的指
  • JAVA 【基础】 log4j 输出样式

    先了解一下log4j 的打印参数如下 参数 说明 L 输出代码中的行号 l 输出日志事件的发生位置 包括类目名 发生的线程 以及在代码中的行数 如 Testlog main TestLog java 10 m 输出代码中指定的消息 p 输出
  • 使用vs2013编译qt4库

    一 废话 由于项目需要搭建qt msvc2013的环境 而官方提供的qt4库最高只支持和vs2010关联 如果需要配置qt msvc2010只需要安装官方给的qt4库的安装包 然后下载addin就可以了 本人也是第一次搭建该环境 在网上找了
  • GDB 程序调试常用命令

    调试之前 若要在GDB中调试程序在编译时需要加上调试信息 在GCC中添加的方法 GCC g a c o a exe 或下面提供更符合GDB的调试信息 GCC ggdb a c o a exe 运行流程 命令 作用 start 开始执行程序
  • elasticsearch评分进阶

    elasticsearch 评分进阶 原文引用自 Advanced Scoring in elasticsearch 作者还有一篇Elasticsearch评分的经验说明 建议爬墙参考slideshare上的资源对照查看 如有侵权请联系 s
  • 几张架构图阐述微服务架构治理相关知识点

    微服务架构的技术点 超时时间设置 接口重试机制 流量QPS限流 请求熔断处理 请求降级处理 今天给大家分享一下以上相关的知识点 通过微服务系统之间RPC通信的方式 以架构图的形式给大家展开介绍 1 超时时间设置 应用访问业务系统A 业务系统
  • 程序员都要学学任正非的坚强!这个老头,在逆境中崛起!

    点赞再看 养成习惯 微信搜一搜 findyi 关注这个喜欢写情怀的程序员 回复 1 获得程序员职场晋升PPT一份 2019年的最后一天 罗胖在跨年演讲中引用了何帆老师的一句话 用一个人的长期主义 对冲世界的不确定性 那时候 谁也无法想到 世
  • 【STM32】为什么STM32的Flash地址要设置到0x08000000

    参考 不是问题的问题 为什么STM32的Flash地址要设置到0x08000000 这边涉及到分散加载文件 启动文件等等 先挖坑 搞定IAP升级以后再填 为什么STM32的Flash地址要设置到0x08000000 主flash启动时 是从

随机推荐

  • tomcat多系统部署方案

    多系统部署到一个 Tomcat 中 如果某一个系统崩溃可能会同时使其他系统不能正常工作 因为它们运行在同一个 JVM 上 就需要在同一个服务器中安装多个 Tomcat 来运行不同的 WEB 系统 一 Tomcat 版本选择 安装 JDK 版
  • 事件循环(Event Loop)

    目录 一 浏览器的进程模型 1 1 进程 1 2 线程 1 3 浏览器的进程和线程 二 渲染主线程 2 1 渲染主线程中为什么使用异步 2 2 js的异步 2 3 队列的优先级 添加任务到微队列的主要 式主要是使 Promise NextT
  • 板材眼镜大小调整方法

    http v youku com v show id XNTY0NjUwOTU2 html
  • ROS 2正式版来了,到底有哪些新变化?

    锋影 email 174176320 qq com 如果你认为本系列文章对你有所帮助 请大家有钱的捧个钱场 点击此处赞助 赞助额0 1元起步 多少随意 2017 12 09 机器人开源操作系统软件ROS 2终于推出首个正式版 新版本命名为
  • openGL之API学习(一零三)glGetActiveUniform

    获取活跃一致变量的信息 变量可以在程序执行期间被访问 则该变量被认为是活动的 void glGetActiveUniform GLuint program GLuint index GLsizei bufSize GLsizei lengt
  • 微信小程序唤起键盘页面溢出的解决方案

    文章目录 背景 解决方案 效果 背景 微信小程序的 input 组件 如果使用自带的adjust position会引起除了 input 元素的其他元素一并上移 解决方案 首先获取到屏幕的高度screenHeight 确定好每个元素所占的大
  • 静态代码分析工具清单:开源篇(多语言)

    http hao jobbole com static code analysis tool list opensource utm source hao jobbole com utm medium relatedResources 静态
  • 百度地图入门

    百度地图官网百度api 进入官网选择javascript API 里面有详细的教程 跟着教程先登录注册一个个人开发账号 并创建一个应用获取ak 创建时js需要填白名单 如果是在本地运行填写localhost就好了 当你在控制台看到这个界面是
  • eclipse双击变量高亮显示开关

    eclipse双击变量高亮显示开关 在eclipse myeclipse中如果不小心把变量的高亮显示弄丢了 可真是件愁人的事 不过看到这你就不用愁了 windows gt preferences gt java gt Editor gt M
  • Springboot读取jar下的文件(在springboot打包成jar后)

    关于取web jar中的配置数据 以及存储下载的数据临时目录 按如下方法处理 均已测试验证过 1 更新了文件路径问题 所有的初始化数据Jason直接从reasource目录的mockdata里读 2 所有下载的数据 放到web jar同一级
  • C语言学习———函数

    目录 编辑 1 函数的概念 2 函数的分类 3 库函数是什么 3 1库函数的查找学习方法 3 2库函数的分类 4 自定义函数 4 1形参与实参 4 2传值与传址调用 4 3总结一句 5 函数的嵌套定义与链式访问 5 1嵌套定义 5 2链式访
  • 什么是智能合约? 智能合约到底做什么的?

    Solidity Solidity是一种用于编写智能合约的高级语言 语法类似于JavaScript 在以太坊平台上 Solidity编写的智能合约可以被编译成字节码在以太坊虚拟机上运行 使用Solidity语言编写智能合约避免了直接编写底层
  • thinkphp5学习路程 二 URL访问路径

    URL访问路径 localhost studytp1 public index php 模块 控制器 操作名 参数名 参数值 默认情况下URL是不区分大小写的 自动转换成小写 如果要区分 就要打开配置文件中的 关闭URL中控制器和操作名的自
  • 计算机网络一到六章知识点

    一 概述 1 1互联网的基本特性 连通性 互联网上用户不管距离多远 都能通信 就像这些用户终端都彼此连通 共享性 所谓共享就是指资源共享 资源共享 包含信息 软件 硬件等共享 就像资源在用户身边 1 2 因特网 互联网 概述 1 网络的网络
  • 在小程序开发中使用 npm

    微信小程序在 2 2 1 版本后增加了对 npm 包加载的支持 使得小程序支持使用 npm 安装第三方包 1 在小程序中加载 npm 包 npm install miniprogram datepicker production node
  • 数组查找操作:寻找第二大

    一 找出数组中第二大的数字 public class Main public static void main String args int max 0 int smax 0 int arr 1 2 3 4 6 8 7 if arr 0
  • 解决bash: mysql: command not found 的方法【linux mysql命令 】

    linux下 在mysql正常运行的情况下 输入mysql提示 mysql command not found 遇上 bash mysql command not found的情况别着急 这个是因为 usr local bin目录下缺失my
  • C#使用欧姆龙PLC的Fins协议读写PLC地址(基本封装)

    FINS通讯概述 FINS factory interface network service 通信协议是欧姆龙公司开发的用于工业自动化控制网络的指令 响应系统 运用 FINS指令可实现各种网络间的无缝通信 通过编程发送FINS指令 上位机
  • Unity中用到的数学知识 整理 (为自己)

    缓动数学知识 转自 http easings net en CSS CSS properties transition and animation allow you to pick the easing function Unfortun
  • Spring两大特性:IOC和AOP

    Spring拥有两大特性 IOC 控制反转 AOP 面向切面编程 Spring注解 Spring为我们提供了多个方便的注解 例如 Controller 标明为控制层组件 Service 服务层组件 Repository DAO层 Compo