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

第三节:如何理解Spring的两个特性IOC和AOP(自学Spring boot 3.x第一天)

大家好,我是网创有方,接下来教大家如何理解Spring的两个特性IOC和AOP。本节有点难,大家多理解。

IOC(控制反转) 定义与核心思想:

IOC,全称Inversion of Control,即控制反转。

其核心思想在于,资源的使用不由使用资源的各方管理,而是交给一个不直接使用资源的第三方进行管理。这样的好处是资源是集中管理的,可配置、易维护,同时也降低了双方的依赖度,实现了低耦合。

实现与优势: 在传统的编程方式中,如果一个类A需要使用类B,那么A会自己去创建B的实例。这会导致类A与类B之间的高耦合,维护成本较高。而在使用Spring的IOC容器后,类A不再直接创建类B的实例,而是由Spring容器来创建并管理这些实例。类A只需要从容器中获取类B的实例即可,从而降低了类A与类B之间的耦合度。 Spring容器通过配置文件或注解等方式来定义和管理Bean(即对象实例),使得对象的创建、配置和销毁等操作都交由Spring容器来管理。这样做的好处是代码更加清晰、易于维护,同时也提高了系统的可扩展性和可测试性。

AOP(面向切面编程) 定义与核心思想:

AOP,全称Aspect-Oriented Programming,即面向切面编程。它是一种编程范式,允许程序员将横切关注点(cross-cutting concerns)从他们所影响的业务逻辑中分离出来。这些横切关注点通常包括日志记录、事务管理、安全性等。通过AOP,我们可以将这些横切关注点封装成一个个切面(Aspect),然后在适当的时候将它们织入到业务逻辑中。

实现与优势: AOP的实现通常依赖于动态代理技术(如JDK动态代理或CGLIB)。在Spring中,当一个方法被调用时,Spring会检查该方法是否需要进行AOP处理(即是否匹配某个切面的切入点)。如果需要处理,则Spring会创建一个代理对象来拦截该方法的调用,并在方法调用前后执行切面的通知(Advice)。 AOP的优势在于它可以减少代码的冗余和复杂性。通过将横切关注点封装成切面,我们可以避免在多个业务逻辑中重复编写相同的代码(如日志记录、事务管理等)。同时,AOP也使得这些横切关注点更加易于管理和维护。 总结 IOC和AOP是Spring框架的两个核心特性。它们分别解决了对象之间的依赖关系管理和横切关注点的分离问题。通过使用IOC和AOP,我们可以降低代码的耦合度、提高代码的可维护性和可扩展性、减少代码的冗余和复杂性。

好了,上面是不是看着很难理解,接下来我简单归纳下。

第一:一个类被称作一个bean,传统方式创建一个类对象都是通过new对象实现,有了IOC这玩意之后,直接通过工厂factory创建好类了,统一管理。简单来说,就是你不要再通过new啊这种方式创建对象了,销毁创建都不用你来管,你直接丢给我工厂,我来帮管。

第二:AOP就是创建切入点,然后拦截,拦截处实现自己的逻辑。打个比方,早上上班本来坐公交,路上遇到了道路施工,然后改成骑自行车,就这个道理。

如果对Spring的源码感兴趣的可以去看看。

下面附上书中的BeanFactory获取bean的代码,下面代码非常简单。用的泛型,看不懂的自己回去补java基础。

package org.springframework.beans.factory;import org.springframework.beans.BeansException;
import org.springframework.core.ResolvableType;
import org.springframework.lang.Nullable;public interface BeanFactory {String FACTORY_BEAN_PREFIX = "&";Object getBean(String name) throws BeansException;
//获取bean的几种方法<T> T getBean(String name, Class<T> requiredType) throws BeansException;Object getBean(String name, Object... args) throws BeansException;<T> T getBean(Class<T> requiredType) throws BeansException;<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
//获取BeanProvider的几种方法<T> ObjectProvider<T> getBeanProvider(Class<T> requiredType);<T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType);boolean containsBean(String name);
//是否单例模式boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
//是否原型模式boolean isPrototype(String name) throws NoSuchBeanDefinitionException;boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;@NullableClass<?> getType(String name) throws NoSuchBeanDefinitionException;@NullableClass<?> getType(String name, boolean allowFactoryBeanInit) throws NoSuchBeanDefinitionException;String[] getAliases(String name);
}

参考:杨开振老师的《深入浅出Spring boot 3.x》

相关文章:

  • 嵌入式学习(Day 51:ARM指令/汇编与c语言函数相互调用)
  • 红酒SPA:享受放松与奢华的很好结合
  • (四)opengl函数加载和错误处理
  • 【RNN练习】LSTM-火灾温度预测
  • 【软考论文】论基于架构的软件设计方法及应用(ABSD)
  • 【C++】数组、字符串
  • .NET编程C#线程之旅:十种开启线程的方式以及各自使用场景和优缺点
  • 【ajax实战08】分页功能
  • Lua博客网站支持搜索、评论、登录注册
  • postman
  • linux 下neo4j的安装
  • 重榜:鸿蒙 Charles 抓包设置
  • 安卓实现微信聊天气泡
  • springboot集成gzip和zip数据压缩传输-满足2k数据自动压缩(适用大数据信息传输)
  • c++将一个复杂的结构体_保存成二进制文件并读取
  • [case10]使用RSQL实现端到端的动态查询
  • 【comparator, comparable】小总结
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • 0x05 Python数据分析,Anaconda八斩刀
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • Consul Config 使用Git做版本控制的实现
  • IndexedDB
  • React-flux杂记
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • Vue.js 移动端适配之 vw 解决方案
  • Webpack 4x 之路 ( 四 )
  • 番外篇1:在Windows环境下安装JDK
  • 分享几个不错的工具
  • 那些被忽略的 JavaScript 数组方法细节
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 智能网联汽车信息安全
  • ​ArcGIS Pro 如何批量删除字段
  • # Panda3d 碰撞检测系统介绍
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • (1)Android开发优化---------UI优化
  • (1)SpringCloud 整合Python
  • (12)Hive调优——count distinct去重优化
  • (9)目标检测_SSD的原理
  • (Oracle)SQL优化基础(三):看懂执行计划顺序
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (超详细)语音信号处理之特征提取
  • (二)PySpark3:SparkSQL编程
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (附源码)计算机毕业设计ssm电影分享网站
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (顺序)容器的好伴侣 --- 容器适配器
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • ... 是什么 ?... 有什么用处?
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET Core使用NPOI导出复杂,美观的Excel详解