Spring 基础知识

2023-11-01

Spring Framework

Spring框架是一个开放源代码的J2EE应用程序框架,由Rod Johnson发起,是针对bean的生命周期进行管理的轻量级容器(lightweight container)。Spring解决了开发者在J2EE开发中遇到的许多常见的问题,提供了功能强大IOC、AOP及Web MVC等功能。Spring可以单独应用于构筑应用程序,也可以整合众多Web框架使用。

Spring Framework共有12个组件,真正核心组件有3个:SpringCore、Contenxt 和 Bean。它们为Spring打下了基础,支撑了Spring的框架结构。Spring的其他功能特性,如Web、AOP、JDBC等都是基于它而开发的。

Spring是一个基于控制反转和面向切面的容器框架。
Spring框架主要由七部分组成,分别是 Spring Core、Spring AOP、Spring ORM、Spring DAO、Spring Context、Spring Web 和 Spring Web MVC。
Spring框架总体架构图

Spring 的核心?

容器,是Spring框架最核心的部分。容器管理着Spring应用中bean的创建、配置和管理。
https://www.cnblogs.com/walkinhalo/p/9601226.html
https://www.cnblogs.com/vince66/p/9244580.html

IoC 与 DI

IoC 控制反转(Inversion of Control),不是什么技术,是一种设计思想。

DI 依赖注入(Dependency Injection),是组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。

IoC 是将对象的创建的权力及对象的生命周期的管理过程交由Spring框架来处理,从此在开发过程中不在需要关注对象的创建和生命周期的管理,而是在需要的时候由Spring框架提供,这个由Spring框架管理对象创建和生命周期的机制称之为控制反转
而在创建对象的过程中Spring可以依据配置对象的属性进行设置,这个过程称之为依赖注入

Spring的核心是IOC,作用有三:
1.创建对象;
2.管理对象的依赖关系;
3.避免了大量单例模式和工厂模式的泛滥。

容器 Spring Context

容器和应用上下文

容器是Spring框架实现功能的核心,它负责了对象整个的生命周期的管理——创建、装配、销毁。

容器通过DI管理Spring应用的对象。Spring负责应用程序中对象的创建,依赖关系,组装与配置。Spring中的容器有多种,大致可以分为BeanFactory工厂类和ApplicationContext应用上下文两大类。BeanFactory 提供了基本的DI支持,ApplicationContext 基于BeanFactory构建, 提供应用框架级别的服务。

DI只描述对象的创建方式,不负责创建.

Tomcat正是一个运行Servlet的web容器,而Spring要想实现依赖注入功能,就离不开对象生产的容器。关于Spring的这个容器你最常听到就是IOC容器。

实际上,容器里面什么都没有,决定容器里面放什么对象的是我们自己,决定对象之间的依赖关系的,也是我们自己,容器只是给我们提供一个管理对象的空间而已。那么,我们怎么向容器中放入我们需要容器代为管理的对象呢?这就涉及到Spring的应用上下文了。

Bean的生命周期

1.bean实例化
2.bean注入属性
3.调用BeanNameAware.setBeanName()
4.调用BeanFactoryAware.setBeanFactory()方法
5.调用ApplicatioonContextAware.setApplicationContext()方法
6.调用BeanPostProcessor.postProcessBeforeInitializaion()方法
7.调用InitializingBean.afterPropertiesSet()方法,如果使用init-method声明了初始化方法,则也会调用初始化方法
8.调用BeanPostProcessor.postProcessAfterInitialization()方法
9.bean就绪,存在上下文中
10.调用DisposableBean.destroy()方法, 如果destroy-method方法被声明, 也同时调用

ApplicationContextAware接口

一、这个接口有什么用?
当一个类实现了这个接口(ApplicationContextAware)之后,这个类就可以方便获得ApplicationContext中的所有bean。换句话说,就是这个类可以直接获取spring配置文件中,所有有引用到的bean对象。
http://blog.csdn.net/kaiwii/article/details/6872642

ApplicationContext

应用上下文,就是将你需要Spring帮你管理的对象放入容器的一种容器对象,应用上下文即是Spring容器的一种抽象化表述;而我们常见的ApplicationContext本质上说就是一个维护Bean定义以及对象之间协作关系的高级接口。这里,我们必须明确,Spring的核心是容器,而容器并不唯一,框架本身就提供了很多个容器的实现,大概分为两种类型:一种是不常用的BeanFactory,这是最简单的容器,只能提供基本的DI功能;还有一种就是继承了BeanFactory后派生而来的应用上下文,其抽象接口也就是我们经常用的ApplicationContext,它能提供更多企业级的服务,例如解析配置文本信息等等,这也是应用上下文实例对象最常见的应用场景。有了上下文对象,我们就能向容器注册需要Spring管理的对象了。对于上下文抽象接口,Spring也为我们提供了多种类型的容器实现,供我们在不同的应用场景选择——
  ① AnnotationConfigApplicationContext:从一个或多个基于java的配置类中加载上下文定义,适用于java注解的方式;
  ② ClassPathXmlApplicationContext:从类路径下的一个或多个xml配置文件中加载上下文定义,适用于xml配置的方式;
  ③ FileSystemXmlApplicationContext:从文件系统下的一个或多个xml配置文件中加载上下文定义,也就是说系统盘符中加载xml配置文件;
  ④ AnnotationConfigWebApplicationContext:专门为web应用准备的,适用于注解方式;
  ⑤ XmlWebApplicationContext:从web应用下的一个或多个xml配置文件加载上下文定义,适用于xml配置方式。
  有了以上理解,问题就很好办了。你只要将你需要IOC容器替你管理的对象基于xml也罢,java注解也好,总之你要将需要管理的对象(Spring中我们都称之问bean)、bean之间的协作关系配置好,然后利用应用上下文对象加载进我们的Spring容器,容器就能为你的程序提供你想要的对象管理服务了。

ApplicationContext:核心接口定义.继承了环境信息,工厂信息,事件发布,资源加载接口
AbstractApplicationContext:提供ApplicationContext的基本实现,最主要定义了refresh方法,也就是刷新流程定义,让子类重写钩子即可完成拓展,非常的灵活
AbstractRefreshableApplicationContext:提供了refreshBeanFactory()抽象方法的实现,使用DefaultListableBeanFactory为默认的BeanFactory,提供
loadBeanDefinitions抽象方法,让子类专注于通过各种方式加载BeanDefinition
AbstractXmlApplicationContext和ClassPathXmlApplicationContext:loadBeanDefinitions实现从classpath路径下载入xml解析BeanDefinition方式
AnnotationConfigWebApplicationContext:目前使用较多的容器对象,loadBeanDefinitions实现为扫描注解加载BeanDefinition

AOP 使用场景

1. Authentication 权限认证
2. Logging 日志
3. Transaction 事务
4. Lazy Loading 懒加载
5. Context Process 上下文处理
6. Error Handler 错误跟踪
7. Cache 缓存

HandlerInterceptor 实现主题与多语言监听器

Spring AOP实现原理

AOP为Aspect Oriented Programming面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

Spring中的设计模式-适配器模式

Spring中的设计模式-适配器模式
https://blog.csdn.net/adoocoke/article/details/8286902

Spring中也有适配器模式的典型应用。
在Spring的Aop中,使用的Advice(通知)来增强被代理类的功能。Spring实现AOP功能的原理就使用代理模式(1、JDK动态代理。2、CGLib字节码生成技术代理。)对类进行方法级别的切面增强,即生成被代理类的代理类,并在代理类的方法前,设置拦截器,通过执行拦截器重的内容增强了代理方法的功能,实现的面向切面编程。

Advice(通知)的类型有:BeforeAdvice、AfterReturningAdvice、ThreowSadvice的。
在每个类型Advice(通知)都有对应的拦截器,MethodBeforeAdviceInterceptor、AfterReturningAdviceInterceptor、ThrowsAdviceInterceptor。

Spring需要将每个Advice(通知)都封装成对应的拦截器类型,返回给容器,所以需要使用适配器模式对Advice进行转换。

mian Shi Ti

描述一下Bean的生命周期

在这里插入图片描述

Spring 的 AOP 底层代码是如何实现的?
循环引用问题,以及Spring中使用到的设计模式
Spring的事务是如何回滚的?
Spring是如何解决循环依赖的问题的?
Spring IOC的原理以及底层实现?
Bean Factory与FactoryBean 的区别?@Bean这个注解是如何实现Bean的注入的?

BeanFactory 是Spring IoC容器的基本功能规范,是IoC容器所应遵守的最底层和最基本的编程规范。

谈一下Spring 事务传播

.

Spring事务会失效的几种情况

1.Bean没有纳入Spring容器管理;
2.自调用,即调用当前类的方法,比如用this调用当前类的方法;
3.异常没有抛出,被try catch了;
4.抛出的不是RuntimeException 且没有指定rollbackFor=异常类型;
5.事务方法不是public的;
6.事务方法内启动新线程进行异步操作;
7.数据库不支持事务。

理解 Spring ApplicationListener 和 CommandLineRunner

https://blog.csdn.net/qq_38962655/article/details/112985006

Mian Shi Ti 2

1、spring中bean的生命周期
2、spring创建bean的流程
3、什么是spring的循环依赖问题
4、spring循环依赖问题如何解决
5、为什么spring使用三级缓存解决循环依赖问题
6、spring循环依赖源码解析
7、修改spring源码尝试二级缓存是否解决循环依赖问题

Mian Shi Ti 3

为什么要使用Spring,Spring的优缺点有哪些
Spring的IOC容器初始化流程
Spring的IOC容器实现原理,为什么可以通过byName和ByType找到Bean
Spring注解Resource和Autowired区别对比详解
Spring中Qualifier用处,处理注入不准确的问题

过滤器 和 拦截器

http://www.bubuko.com/infodetail-3079641.html

(0)过滤器是J2EE标准,是在请求之前进入容器之后,还未进入Servlet之前进行预处理。而拦截器是被包裹在过滤器之中的。
(1)Filter需要在web.xml中配置,依赖于容器;Interceptor在SpringMVC中配置,依赖于框架;
(2)拦截器(Interceptor)是基于Java的反射机制,而过滤器(Filter)是基于函数回调。
(3)Filter的执行顺序在Interceptor之前。在Action生命周期中,拦截器可以被多次调用;而过滤器只能在容器初始化时执行一次。
(4)过滤器和拦截器的底层都是一样的,就是分了不同的功能实现,一个是拦截所有,一个是拦截具体的url;并且拦截器可以拦截静态资源。
(5)拦截器可以访问Action上下文,值栈里面的对象;过滤器不可以。拦截器可以获取IOC容器的各个bean,过滤器不行。

其他区别:
(1)从灵活性上说拦截器功能更强大些,Filter能做的事情,都能做,而且可以在请求前,请求后执行,比较灵活。
(2)Filter主要是针对URL地址做一个编码的事情、过滤掉没用的参数、安全校验(比如登录不登录之类),太细的话,还是建议用interceptor。不过还是根据不同情况选择合适的。

参考资料

Spring 的 BeanFactory 和 FactoryBean
https://mp.weixin.qq.com/s/pS96RmLll4XeKLyHHbd05Q

spring官方文档的解读
https://blog.csdn.net/li1376417539/article/details/104951358/

Spring-Context
https://www.jianshu.com/p/e1a4d38be670

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

Spring 基础知识 的相关文章

随机推荐

  • WSL 2 installation is incomplete.【BUG解决】【Docker之云原生基石】

    问题描述 本文解决俩个Docker报错 分别是 1 WSL 2 installation is incomplete 2 System InvalidOperationException Failed to set version to d
  • STM32F103驱动DHT11温湿度传感器(STM32MXcube,HAL)

    第一步 配置STM32MXbube S1 配置时钟模式为外部高速晶振 外部低速晶振 可选 S2 配置下载方式为SW ST LINK S3 配置定时器 用于延时us级别函数 S4 配置串口 用于输出数据 S5 配置GPIO S6 配置总线频率
  • python3: error while loading shared libraries: libpython3.7m.so.1.0: cannot open shared object file

    报错详情 python3 error while loading shared libraries libpython3 7m so 1 0 cannot open shared object file No such file or di
  • maven 多模块模板

    1 建立模板项目 settings demo core settings src main java com test core resources test java resources demo db settings src main
  • 前端基础5——UI框架Layui

    文章目录 一 基本使用 二 管理后台布局 2 1 导航栏 2 2 主题颜色 2 3 字体图标 三 栅格系统 四 卡片面板 五 面包屑 六 按钮 七 表单 八 上传文件 九 数据表格 9 1 table模块常用参数 9 2 创建表格 9 3
  • 用pyecharts画一个饼图

    pyecharts是一款Python的图表库 可以用来绘制各种类型的图表 包括饼图 下面是一个简单的例子 展示如何使用pyecharts来画一个饼图 首先 需要安装pyecharts pip install pyecharts i http
  • PAT乙级 1001 害死人不偿命的(3n+1)猜想 (15分)

    PAT乙级 1001 害死人不偿命的 3n 1 猜想 15分 卡拉兹 Callatz 猜想 对任何一个正整数 n 如果它是偶数 那么把它砍掉一半 如果它是奇数 那么把 3n 1 砍掉一半 这样一直反复砍下去 最后一定在某一步得到 n 1 卡
  • 由“智障”到“智能”到未来,从汽车AI语音交互看语言交互技术高山在哪?

    文 胡杨 胡皓 来源 智能相对论 ID aixdlun 今天天气怎么样 今日是晴天 气温17到22度 东北风3到4级 那周五呢 周五距今天还有2天 重复唤醒 答非所问 这不是人工智能 是 人工智障智障 这是大部分智能网联汽车用户对语音交互的
  • Hbase split的三种方式和split的过程

    Hbase split的三种方式和split的过程 在Hbase中split是一个很重要的功能 Hbase是通过把数据分配到一定数量的region来达到负载均衡的 一个table会被分配到一个或多个region中 这些region会被分配到
  • 基于Springboot + Mybatis-plus事务管理

    事务 事务就是为了保证多次数据库操作的原子性 举个简单的例子 买商品第一步要扣钱 第二步要扣库存 如果没有事务 一旦第一步与第二步之间出现了异常 那么钱是扣了 库存却没变 这显然不符合业务场景 要么都成功要嘛都失败 开启事务 在Spring
  • springboot和mybatis的整合—黑马上课学习笔记

    web开发的基础 运用的是BS架构 这种架构是一种浏览器 服务器模式 客户端只需要浏览器 而数据存储和逻辑都在服务端 HTTP协议 是一种超文本传输协议 规定了浏览器和服务器之间的规则 Web服务器 负责解析HTTP协议 解析请求数据 并发
  • python123.io---英文单词个数统计

    英文单词个数统计 类型 Python 函数和代码复用 给出一个字符串 s 内容参见 编程模板 请统计并打印字符串 s 中出现单词的个数 示例1
  • 时序预测

    时序预测 MATLAB实现DBN SVM深度置信网络结合支持向量机时间序列预测 多指标评价 目录 时序预测 MATLAB实现DBN SVM深度置信网络结合支持向量机时间序列预测 多指标评价 效果一览 基本描述 程序设计 参考资料 效果一览
  • 语义分割、实例分割

    在cv领域 会经常见到 语义分割 实例分割 这两个名词 本文就来解释下他们分别是什么意思 又有什么区别 以下的图部分借用自知乎用户william的文章 一文读懂语义分割与实例分割 知乎 目录 语义分割和实例分割 语义分割 实例分割 总结 语
  • 勒索病毒最新变种.halo勒索病毒来袭,如何恢复受感染的数据?

    摘要 halo勒索病毒已成为数字世界中的威胁 通过高级加密技术将文件锁定 并要求支付赎金 本文91数据恢复将深入介绍 halo勒索病毒的工作原理 提供解锁被感染文件的方法 以及探讨如何有效预防这一威胁 如果您正在经历勒索病毒数据恢复的困境
  • android CoordinatorLayout使用

    http blog csdn net xyz lmn article details 48055919 一 CoordinatorLayout有什么作用 CoordinatorLayout作为 super powered FrameLayo
  • vue-quill-editor富文本编辑器的使用(实现图片/文件上传)

    目录 实现效果 编辑器配置 基本配置 实现图片上传 实现文件上传 实现效果 文本编辑的三个功能分别是 添加链接 上传图片 上传文件 编辑器配置 基本配置
  • 关于webview点击输入框无法弹出软键盘问题

    转载请注明出处 http blog csdn net ym4189 article details 78017484 webview加载一个网页版聊天时 由于输入框还要加载表情 没有使用 lt input gt 标签 使用的 lt pre
  • windows中怎么添加定时任务

    linux中有crontab定时任务 很方便 其实windows也有类似的 需求 定时执行python脚本 1 Windows键 R 调出此窗口 输入compmgmt msc 2 转载于 https www cnblogs com gcgc
  • Spring 基础知识

    Spring Framework Spring框架是一个开放源代码的J2EE应用程序框架 由Rod Johnson发起 是针对bean的生命周期进行管理的轻量级容器 lightweight container Spring解决了开发者在J2