Spring基础知识总结(纯文字版)

一、Spring IoC

1.1 重要概念

1)控制反转(Inversion of control)

控制反转是一种通过描述(在java中通过xml或者注解)并通过第三方去产生或获取特定对象的方式。

控制反转IoC(Inversion of Control)是说创建对象的控制权进行转移,以前创建对象的主动权和创建时机是由自己把控的,而现在这种权力转移到第三方,比如转移交给了IoC容器,它就是一个专门用来创建对象的工厂,你要什么对象,它就给你什么对象,有了 IoC容器,依赖关系就变了,原先的依赖关系就没了,它们都依赖IoC容器了,通过IoC容器来建立它们之间的关系。

控制反转就是获取依赖对象的方式反转了,正常情况下由应用程序主动创建依赖对象,实现对依赖对象的管理,创建依赖对象的控制权在应用程序手中,应用程序需要什么对象,就主动去创建这个对象,这是正转的情况。实现控制反转之后,由IoC容器实现依赖对象的创建和管理,应用程序需要什么样的对象,IoC容器就根据需求创建这个对象,应用程序只是被动地接收和使用这个对象,依赖对象的创建管理控制权由应用程序转移给了IoC容器,这就实现了控制反转。

2)依赖注入(Dependency Injection)

控制反转的另一种表述方式,即让调用类对某一接口的实现类的依赖关系由第三方(容器或协作类)注入,用以移除调用类对某一接口实现类的依赖。

3)Beanfacory 和ApplicationContext

Spring通过配置文件描述Bean以及Bean之间的依赖关系,利用Java语言的反射功能实例化Bean并建立起Bean之间的依赖关系。Spring的IoC容器在完成这些底层工作的基础上,提供了Bean实例缓存、生命周期管理、Bean实例代理、事件发布、资源装载等服务。

Beanfacory 是Spring框架最核心的接口,提供了高级IoC的配置机制。Beanfacory使管理不同的java对象成为可能,ApplicationContext(应用上下文)建立在Beanfacory基础之上,提供更多面向引用的功能。Beanfacory 即为IoC容器,由于ApplicationContext建立在Beanfacory,我们也称ApplicationContext为IoC容器。

IoC容器主要功能

  • 动态创建、注入依赖对象。

  • 管理对象生命周期。

  • 映射依赖关系。

实现IoC容器的方式

  • 依赖查找。

  • 依赖注入。

依赖注入的三种方式

  • 构造器注入。

  • etter注入。

  • 接口注入。

注入和装配的区别

注入是实例化一个类时对类中各个参数的赋值方式。

装配是定义bean以及bean之间关系。

  • 装配bean概述:

    • 基于xml中配置。

    • 基于注解中配置。

    • 基于java类配置。

    • 基于Groovy DSL配置。

  • Bean作用域:

    • 单例(singleton):它是默认的选项,在整个应用中,Spring只为其生成一个Bean的实例。

    • 原型(prototype):每次注入时,或者通过Spring IoC容器获取Bean时,Spring都会为它创建一个新的实例。

    • 会话(session):在web应用中使用,就是在会话过程中Spring只会创建一个实例。

    • 请求(request):在web应用中使用,就是在一次请求中Spring会创建一个实例,但是不同的请求会创建不同的实例。

1.2 基于xml中配置

1)四种自动装配类型

  • byName:根据名字自行自动匹配。

  • byType:根据类型自行自动匹配。

  • construtor:根据构造函数自行自动匹配。

  • autodetect:根据bean的自省机制选择byType或者construtor。

2)Bean之间的关系

  • 继承;

  • 依赖;

  • 引用。

1.3 基于注解的配置

1)使用注解定义bean

  • @Component:用于对所有的类进行注解。

  • @Repository:用于对Dao实现类进行标注。

  • @Service:用于对Service实现类进行标注。

  • @controller:用于对controller实现类进行标注。

2)自动装配

  • @Autowired:通过@Autowired注解实现Bean的依赖注入。

  • @Autowired的required属性:用来指定是否必须找到匹配的Bean。

  • @Qualifier,指定Bean的名称。

profile:用于切换开发环境。

Spring EL:更为灵活的注入方式,能够在运行时构建复杂表达式,存取对象属性、对象方法调用等。

作用

  • 使用bean id引用bean。

  • 调用指定对象的方法和访问对象的属性。

  • 进行运算。

  • 提供正则表达式进行匹配。

  • 集合配置。

二、面向切面编程(Aspect Oriented Programming)

概述:AOP技术利用"横切"技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。

2.1 AOP相关概念

方面(Aspect):一个关注点的模块化,这个关注点实现可能另外横切多个对象。事务管理是J2EE应用中一个很好的横切关注点例子。方面用Spring的 Advisor或拦截器实现。

连接点(Joinpoint): 程序执行过程中明确的点,如方法的调用或特定的异常被抛出。

通知(Advice): 在特定的连接点,AOP框架执行的动作。各种类型的通知包括“around”、“before”和“throws”通知。通知类型将在下面讨论。许多AOP框架包括Spring都是以拦截器做通知模型,维护一个“围绕”连接点的拦截器链。Spring中定义了四个advice: BeforeAdvice, AfterAdvice, ThrowAdvice和DynamicIntroductionAdvice。

切入点(Pointcut): 指定一个通知将被引发的一系列连接点的集合。AOP框架必须允许开发者指定切入点:例如,使用正则表达式。 Spring定义了Pointcut接口,用来组合MethodMatcher和ClassFilter,可以通过名字很清楚的理解, MethodMatcher是用来检查目标类的方法是否可以被应用此通知,而ClassFilter是用来检查Pointcut是否应该应用到目标类上。

引入(Introduction): 添加方法或字段到被通知的类。 Spring允许引入新的接口到任何被通知的对象。例如,你可以使用一个引入使任何对象实现 IsModified接口,来简化缓存。Spring中要使用Introduction, 可有通过DelegatingIntroductionInterceptor来实现通知,通过DefaultIntroductionAdvisor来配置Advice和代理类要实现的接口。

目标对象(Target Object): 包含连接点的对象。也被称作被通知或被代理对象。POJO。

AOP代理(AOP Proxy): AOP框架创建的对象,包含通知。 在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。

织入(Weaving): 组装方面来创建一个被通知对象。这可以在编译时完成(例如使用AspectJ编译器),也可以在运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。

  • 前置通知(Before advice): 在某连接点(join point)之前执行的通知,但这个通知不能阻止连接点前的执行(除非它抛出一个异常)。

  • 后置通知(After advice): 当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。

  • 环绕通知(Around Advice): 包围一个连接点(join point)的通知,如方法调用。这是最强大的一种通知类型。 环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。

  • 返回后通知(After returning advice): 在某连接点(join point)正常完成后执行的通知,例如,一个方法没有抛出任何异常,正常返回。

  • 抛出异常后通知(After throwing advice): 在方法抛出异常退出时执行的通知。

2.2 Spring AOP实现的四种方式:

  • 使用proxyFactoryBean和对应的接口实现AOP

  • 使用XML配置AOP

  • 使用@AspectJ注解驱动切面

  • 使用AspectJ注入切面

2.3 多切面的情况

  • aspect里面有一个order属性,order属性的数字就是横切关注点的顺序。

  • Spring默认以aspect的定义顺序作为织入顺序。

三、Spring事务管理

3.1 事务管理器

Spring并不直接管理事务,而是提供了多种事务管理器,他们将事务管理的职责委托给Hibernate或者JTA等持久化机制所提供的相关平台框架的事务来实现。Spring事务管理器的接口是org.springframework.transaction.PlatformTransactionManager,通过这个接口,Spring为各个平台如JDBC、Hibernate等都提供了对应的事务管理器。

3.2 事务属性的定义

1)传播行为

Spring定义了七种传播行为,以下为常见类型:

PROPAGATION_REQUIRED:表示当前方法必须运行在事务中。如果当前事务存在,方法将会在该事务中运行。否则,会启动一个新的事务

PROPAGATION_SUPPORTS:表示当前方法不需要事务上下文,但是如果存在当前事务的话,那么该方法会在这个事务中运行

PROPAGATION_MANDATORY:表示该方法必须在事务中运行,如果当前事务不存在,则会抛出一个异常

2)隔离级别

隔离级别定义了一个事务可能受其他并发事务影响的程度。

  • ISOLATION_DEFAULT:使用后端数据库默认的隔离级别

  • ISOLATIONREADUNCOMMITTED:最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读.

  • ISOLATIONREADCOMMITTED:允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生

  • ISOLATIONREPEATABLEREAD:对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生

  • ISOLATION_SERIALIZABLE:最高的隔离级别,完全服从ACID的隔离级别,确保阻止脏读、不可重复读以及幻读,也是最慢的事务隔离级别,因为它通常是通过完全锁定事务相关的数据库表来实现的

3)只读:通过将事务设置为只读,你就可以给数据库一个机会,让它应用它认为合适的优化措施。

4)事务超时:事务超时就是事务的一个定时器,在特定时间内事务如果没有执行完毕,那么就会自动回滚,而不是一直等待其结束。

5)回滚规则:这些规则定义了哪些异常会导致事务回滚而哪些不会。

3.3 编程式和声明式事务的区别

Spring提供了对编程式事务和声明式事务的支持,编程式事务允许用户在代码中精确定义事务的边界,而声明式事务(基于AOP)有助于用户将操作与事务规则进行解耦。

简单地说,编程式事务侵入到了业务代码里面,但是提供了更加详细的事务管理;而声明式事务由于基于AOP,所以既能起到事务管理的作用,又可以不影响业务代码的具体实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/19451.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于 Arm 虚拟硬件的 TinyMaix 超轻量级神经网络推理框架的项目实践

本实验过程中所显示的优惠价格及费用报销等相关信息仅在【Arm AI 开发体验创造营】体验活动过程中有效,逾期无效,请根据实时价格自行购买和体验。同时,感谢本次体验活动 Arm 导师 Liliya 对于本实验手册的共创与指导。 详见活动地址&#xff…

常用torch.nn

目录 一、torch.nn和torch.nn.functional二、nn.Linear三、nn.Embedding四、nn.Identity五、Pytorch非线性激活函数六、nn.Conv2d七、nn.Sequential八、nn.ModuleList九、torch.outer torch.cat 一、torch.nn和torch.nn.functional Pytorch中torch.nn和torch.nn.functional的区…

Vue使用axios实现调用后端接口

准备后端接口 首先,我已经写好一个后端接口用来返回我的用户数据,并用Postman测试成功如下: 以我的接口为例,接口地址为:http://localhost:8080/user/selectAll 返回Json为: {"code": "2…

docker制作高版本jdk17镜像踩坑

1、创建目录并下载jdk上传到服务器中 从jdk官网下载jdk17镜像,提示:下载到本地用xftp上传到服务器(速度会快点) jdk官网:https://www.oracle.com/java/technologies/downloads/#graalvmjava21 创建目录,将…

Ubuntu系统编译内核——deb安装 / install安装

摘要 本文简要记录两种编译内核的方法: 打包成deb模块安装(推荐);直接make install安装; 更推荐使用——打包成deb模块安装,因为可以方便的拷贝下次其他机器使用。 1. 编译环境准备 系统:lin…

强化学习——学习笔记3

一、强化学习都有哪些分类? 1、基于模型与不基于模型 根据是否具有环境模型,强化学习算法分为两种:基于模型与不基于模型 基于模型的强化学习(Model-based RL):可以简单的使用动态规划求解,任务可定义为预测和控制&am…

cesium 实现自定义弹窗并跟随场景移动

cesium 添加点位自定义弹窗跟随场景移动 完整代码演示可直接copy使用 1 效果图&#xff1a; 2 深入理解 就是原始点位的数据 id>property 点位真实渲染到球体上的笛卡尔坐标系 id>_polyline 的路径下 可以通过 3 代码示例 <!DOCTYPE html> <html lang"…

【数据分享】2017-2023年全球范围10米精度土地覆盖数据

土地覆盖数据是我们在各项研究中都非常常用的数据&#xff0c;土地覆盖数据的来源也有很多。之前我们分享过欧空局发布的2020年和2021年的10米分辨率的土地覆盖数据,也分享过我国首套1米分辨率的土地覆盖数据&#xff08;均可查看之前的文章获悉详情&#xff09;&#xff01; …

dwc3 DR_MODE 处理初始化 OTG gadget

dwc3控制器是怎么处理otg-CSDN博客 dwc3_probe static int dwc3_probe(struct platform_device *pdev) {struct device *dev &pdev->dev;struct resource *res, dwc_res;struct dwc3 *dwc;int ret;void __iomem …

管道液位传感器可以检测哪些液体?

管道液位传感器是一种专门用于检测流动性比较好的液体的传感器装置。它采用光学感应原理&#xff0c;不涉及任何机械运动&#xff0c;具有长寿命、安装方便和微功耗的特点。相比传统机械式液位传感器&#xff0c;光电管道传感器有效解决了低精度和卡死失效等问题&#xff0c;同…

Django 解决 CSRF 问题

在 Django 出现 CSRF 问题 要解决这个问题&#xff0c;就得在 html 里这么修改 <!DOCTYPE html> <html><head></head><body><form action"/login/" method"post">{% csrf_token %}</form></body> </…

C++基础知识之类和对象

一、类 类是一种用户自定义的数据类型&#xff0c;用于封装数据和方法。它定义了一组属性&#xff08;数据成员&#xff09;和方法&#xff08;成员函数&#xff09;&#xff0c;并且可以被多个对象共享。在面向对象编程中&#xff0c;类是一种用于创建对象的蓝图或模板。它定义…

短视频脚本创作的五个方法 沈阳短视频剪辑培训

说起脚本&#xff0c;我们大概都听过影视剧脚本、剧本&#xff0c;偶尔可能在某些综艺节目里听过台本。其中剧本是影视剧拍摄的大纲&#xff0c;用来指导影视剧剧情的走向和发展&#xff0c;而台本则是综艺节目流程走向的指导大纲。 那么&#xff0c;短视频脚本是什么&#xf…

探析GPT-4o:技术之巅的跃进

如何评价GPT-4o? 简介&#xff1a;最近&#xff0c;GPT-4o横空出世。对GPT-4o这一人工智能技术进行评价&#xff0c;包括版本间的对比分析、GPT-4o的技术能力以及个人感受等。 随着人工智能领域的不断发展&#xff0c;GPT系列模型一直处于行业的前沿。最近&#xff0c;GPT-4…

前端实习记录——git篇(一些问题与相关命令)

1、版本控制 &#xff08;1&#xff09;版本回滚 git log // 查看版本git reset --mixed HEAD^ // 回滚到修改状态&#xff0c;文件内容没有变化git reset --soft HEAD^ // 回滚暂存区&#xff0c;^的个数代表几个版本git reset --hard HEAD^ // 回滚到修改状态&#xff…

生态农业:引领未来农业新篇章

生态农业&#xff0c;正以其独特的魅力和创新理念&#xff0c;引领着未来农业发展的新篇章。在这个充满变革的时代&#xff0c;我们需要更加关注农业的可持续发展&#xff0c;而生态农业正是实现这一目标的重要途径。 生态农业产业的王总说&#xff1a;生态农业强调生态平衡和可…

python基础-内置函数3-类与对象相关内置函数

文章目录 python基础-内置函数3类与对象getattr()hasattr()setattr()delattr()vars()dir()property()super()classmethod()staticmethod()isinstance()issubclass()callable()object()repr()ascii()id()hash()type() python基础-内置函数3 类与对象 getattr() getattr(objec…

以讲师能力提升,优路教育促学员拓宽职业原野

在建设教育强国的过程中&#xff0c;加强教师队伍建设被视为重要的基础工作。当前&#xff0c;我国正大力推进高素质“双师型”职业教育教师队伍建设&#xff0c;以培养更多既具备理论教学能力&#xff0c;又拥有实践教学经验的教师。在这一背景下&#xff0c;优路教育积极响应…

【文档+源码+调试讲解】古典舞在线交流平台的设计与实现

摘 要 随着互联网技术的发展&#xff0c;各类网站应运而生&#xff0c;网站具有新颖、展现全面的特点。因此&#xff0c;为了满足用户古典舞在线交流的需求&#xff0c;特开发了本古典舞在线交流平台。 本古典舞在线交流平台应用Java技术&#xff0c;MYSQL数据库存储数据&…

构建一个简单的情感分析器:使用Python和spaCy

构建一个简单的情感分析器&#xff1a;使用Python和spaCy 引言 情感分析是自然语言处理&#xff08;NLP&#xff09;中的一项重要技术&#xff0c;它可以帮助企业和研究人员理解公众对特定主题或产品的看法。 在本篇文章中&#xff0c;我们将使用Python编程语言和 spaCy 库来构…