spring总结

目录

什么是Spring?

Spring的优缺点?

优点:

缺点:

Spring IOC的理解

Spring AOP的理解

事务的边界为什么放在service层?

Spring Bean的生命周期

什么是单例池?作用是什么?

单例Bean的优势

BeanFactory的作用

BeanDefinition的作用

BeanFactory和ApplicationContext有什么区别?

配置Bean有哪几种方式?

Spring实例化Bean方式的几种方式

什么是Bean的自动装配?

自动装配需要注意

Spring自动装配Bean有哪些方式

通过XML文件

通过注解

Spring如何解决循环依赖问题?

什么是循环依赖

Spring是如何解决循环依赖的

是否只要是构造方法注入的Bean所产生的的循环依赖都是无法解决的?

Spring Bean是不是线程安全的?

如何解决单例bean线程安全问题?

Spring中的事务

事务的四大特征(ACID)

Spring支持的事务管理类型

实现声明式事务的两种方式

Spring事务的传播行为


什么是Spring?

Spring是轻量级的开源的框架,它是一个容器框架,用来封装javaBean对象,并维护对象之间的关系,是一个整合其他框架的框架,可以让我们更加快速,更加简洁的开发。

Spring的核心是IOC(控制反转)和AOP(面向切面)。

IOC是指将对象的创建权交给Spring容器。在Spring之前对象的创建都是需要程序员自己通过new关键字创建的,而使用Spring之后,对象的创建交由Spring创建。对象之间的依赖关系也是交由Spring处理,降低耦合度。

AOP面向切面编程,可以在不修改原有代码的基础上添加非业务功能,将主业务功能与非业务功能分离,可以让编程人员全身心投入到主业务代码中。

Spring的优缺点?

优点:

  1. 通过Spring提供的IOC容器,我们可以将对象之间的依赖关系交由Spring进行控制,降低耦合。

  2. 通过AOP功能,方便进行面向切面编程,在不修改代码的情况下可以对业务代码进行增强,减少代码,提高开发效率维护方便。

  3. 对主流框架提供了很好地支持,例如Mybatis等。

  4. 低入侵式设计。

  5. 提供了事务管理,只需要一个注解@Transaction。

  6. 方便程序的测试,spring实现测试,使我们结合Junit非常方便测试。

缺点:

使用大量的反射机制,占用内存,影响效率。

Spring IOC的理解

三方面:IOC是什么?(容器)、控制反转的理解、依赖注入

IOC容器:实际上就是一个Map,里面存的是各种对象(在xml里配置的bean节点,@Repository、@Service、@Controller、@Component等),在项目启动的时候会读取配置文件里面的bean节点,根据全限定类名使用反射创建对象放到map里面,扫描注解的类还是用反射创建对象并放到map中。

这个时候map里就有各种对象了,接下来我们在代码里需要用到里面的对象时,在通过DI注入(@Autowired、@Resource等注解,xml中bean节点里的ref属性,项目启动的时候会读取xml节点ref属性根据id注入)

控制反转:在没有引入控制反转之前,对象A依赖于对象B,对象A在初始化或者运行到某个点的时候就需要主动的创建对象B或者是使用已经创建的对象B,无论是已经创建的还是主动创建的对象B,控制权都在程序员自己手中(也就是说B对象什么时候创建,都有A对象决定)。

引入IOC之后,A对象和B对象都依赖于IOC容器,而A和B对象之间没有联系,当对象A运行到需要对象B的时候,IOC容器会主动创建(或者对象时单例的话就直接调用)对象B注入到对象A需要的地方。

通过前后的对比,不难看出来:对象A获得依赖对象B的过程,由主动变为了被动行为,控制权颠倒过来了,这就是“控制反转”这个名词的由来。

依赖注入:控制被反转之后,获得依赖对象的过程由自身管理变成了由IOC容器主动注入。依赖注入是实现IOC的方法,就是由IOC容器在运行期间,动态的将某种依赖关系注入到对象之中。

控制反转的作用主要是降低代码之间的耦合度,Spring IOC除了减低代码的耦合度外,还会管理对象的创建和依赖关系的维护。

Spring AOP的理解

AOP,面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。

能够将那些与业务代码无关,却又被业务模块所使用的功能(例如日志管理,事务管理等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的扩展和维护。

SpringAOP是基于动态代理的,如果要代理的对象实现了某个接口,就会使用jdk动态代理去创建代理对象;如果没有实现接口的对象,使用CGLIB动态代理生成一个被代理对象的子类作为代理。

事务的边界为什么放在service层?

事务通常可能会涉及到多张表的操作,也就意味着,在service层涉及到多个dao的操作,假设一个dao调用成功并且已经提交事务了,而另一个dao执行失败了,而我们的事务的边界在service层,在同一个地方里可以进行回滚;但是如果我们把事务放在各个dao层里面的话,第一个成功了,第二个即使失败了也无法控制第一个dao的回滚,所以我们的事务的边界要放在service层。

Spring Bean的生命周期

  1. 解析类得到BeanDefinition

  2. 如果有多个构造方法,则要推断构造方法

  3. 确定好构造方法之后,进行实例化得到对象

  4. 对对象中添加了@Autowired的属性进行属性填充

  5. 回调Aware方法,比如BeanNameAware,BeanFactoryAware

  6. 调用BeanPostProcessor的初始化前的方法

  7. 调用初始化方法

  8. 调用BeanPostProcessor的初始化后的方法,在这里会进行AOP

  9. 如果当前创建的Bean是单例的则会放入到单例池中

  10. 使用Bean

  11. Spring容器关闭时调用DisposableBean中destory()方法

什么是单例池?作用是什么?

如果Bean对象是singleton单例Bean时,在Spring在创建Bean的时候会有将Bean对象存入一个Map集合中,在集合中以Bean的名称为key,在后续程序中有使用到该bean的时候直接从集合中获取,以达到单例bean的效果。

单例Bean的优势

  1. 减少了新生成实例的消耗新生成实例消耗包括两个方面:①Spring通过反射来创建Bean对象;②对象内存分配。

  2. 减少jvm垃圾回收。由于不会每次都重写创建Bean对象,自然就会减少垃圾回收。

  3. 可以快速获取到bean。

BeanFactory的作用

BeanFactory是Spring中非常核心的一个顶层接口;

是Bean的“工厂”、它的主要职责是生产Bean;

它实现了简单工厂的设计模式,通过调用getBean传入标识生产一个Bean;

它有非常多的实现类,每个工厂都有不同的职责功能,最强大的工厂是:DefaultListableBeanFactory ,Spring底层就是用该实现工厂生产Bean的

BeanDefinition的作用

它主要存储Bean的定义信息:决定Bean的生产方式。

<bean class="com.exp.User" id="user" scope="singleton" lazy="false" ></bean>

BeanFactory会根据Bean的这些信息生产Bean:比如实例化,可以通过class进行反射进而得到实例对象;比如lazy ,则不会在IOC加载是创建Bean

BeanFactory和ApplicationContext有什么区别?

BeanFactory和ApplicationContext是Spring的两大核心接口,都可以当做Spring的容器。它们之间的关系,ApplicationContext是BeanFactory的子接口。

二者区别:

作用

BeanFactory接口作用:是Spring里面最底层的接口,包含了各种Bean的定义,读取Bean配置文件,管理BeanDefinition加载,实例化,控制Bean的生命周期,维护Bean之间的依赖关系。BeanFactory简单粗暴,可以理解为就是一个HashMap,Key是BeanName,Value是Bean实例。通常只提供put和get功能,可以称之为“低级容器”。

配置Bean有哪几种方式?

  1. xml:<bean class="com.exp.User" id="user">

  2. 注解@Component等,前提是需要配置扫描包<component-scan>,反射调用构造方法

  3. javaConfig:@Bean 可以自己控制实例化过程

  4. import

Spring实例化Bean方式的几种方式

  1. 构造方法(反射)

  2. 静态工厂方式;factory-method

  3. 实例工厂方式(@Bean);factory-bean+factory-method

  4. FactoryBean方式

什么是Bean的自动装配?

Bean的配置是将Bean组装在一起,前提是需要知道Bean的依赖关系。

在Spring框架中,在配置文件中设定Bean的依赖关系是一个很好地机制,Spring容器能够自动配置相互合作的Bean,这意味着容器不需要手动配置,能通过Bean工厂处理Bean之间的协作。

自动装配需要注意

  • 一定要声明set方法

  • 仍然可以使用<constructor-arg>和<property>配置来定义依赖,这些配置将始终覆盖自动注入

  • 不能自动装配简单数据类型的属性

Spring自动装配Bean有哪些方式

Spring中实现自动装配Bean主要有两种方式:通过xml文件、通过注解。

通过XML文件

xml文件中bean标签有一个指定自动装配类型的属性Autowired,Autowired有4中装配类型。

  • byName,根据名称自动装配。

  • byType,根据类型自动装配。

  • constructor,Spring容器会尝试找到那些类型与构造函数相匹配的Bean。

<bean id="student5" class="com.www.spring.modle.Student" autowire="byName">
        <property name="name" value="张其"/>
        <property name="id" value="7"/>
        <property name="num" value="1007"/>
        <!--在这里可以不用写<property name="admin" ref="admin"/> 因为autowire="byName"就表示通过实体类中set方法的名称在容器中找到相同id值的bean然后赋值-->
    </bean>

通过注解

主要是通过@Autowired等注解完成,前面提到了将类声明为bean的几个注解,通过@Component将类声明为Bean,通过@Value将某个常量值注入到变量中,通过@Autowired将Bean装配到属性中。

Spring如何解决循环依赖问题?

什么是循环依赖

循环依赖的定义其实就是,A依赖与B,B也依赖于A,或者是A自身依赖。

Spring是如何解决循环依赖的

Spring是通过三级缓存来解决循环依赖的。

在DefaultSingletonBeanRegistry类中提供了三个缓存,其实就是三个map集合。

一级缓存singletonObjects,用于保存实例化、注入、初始化完成的Bean对象;

二级缓存earlySingletonObject,用户保存实例化完成的Bean实例,提前暴露对象。

三级缓存singletonFactories,用于保存创建bean的工厂。

spring在创建对象A时先将A对象的工厂对象放入到三级缓存中去,然后实例化A,到属性注入时需要B对象,此时容器中没有B对象,又转而创建B对象,同样将B对象的工厂对象存入三级缓存中,实例化B对象,属性注入时需要A对象,从三级缓存中获取到A对象的工厂对象,对象B属性注入完成之后将其放入到二级缓存中,同时从三级缓存中删除B工厂,接下来初始化B对象,初始化完成后将B对象放入到一级缓存中,并且从二级缓存中删除B,B对象创建结束;返回创建A,完成属性b的注入,后续步骤与B对象属性注入完成后的步骤相同。

创建对象和属性注入时都会执行getBean()方法,来获取对象,在获取对象时最重要的是执行getSingleton方法:

由源码可知,在该方法中,先从一级缓存中获取对象,如果没有就去二级缓存中找,二级没有就去三级中找,三级中如果找到,就将该对象放入到二级缓存中,并且删除三级缓存,如果三级还没有就表明该对象还没有被创建过。

是否只要是构造方法注入的Bean所产生的的循环依赖都是无法解决的?

不是的,两个Bean都是通过构造方法注入的是无法解决的,但是一个是属性注入一个是构造注入时就可能会解决,如果先创建的Bean是构造方法注入,那么开始就无法提供半成品Bean,这时是无法解决的;但是如果先创建的是通过属性注入方式的Bean,那么是可以解决的。

依赖注入方式是否可以解决
两个都是构造方法注入
两个都是属性注入
A中的注入方式是构造方法注入,B中注入方式是属性注入
A中的注入方式是属性注入,B中注入方式是构造方法注入

Spring Bean是不是线程安全的?

这个要看Bean的作用域scope,如果是原型Bean的话,每次多会创建一个新的对象,线程之间不会存在共享,自然不存在线程安全问题;如果是单例Bean,全局只有一个对象,存在资源竞争。

Bean又分为:①有状态Bean(有数据存储功能,包含成员变量),会对这个Bean的成员变量进行写操作,线程不安全;②无状态Bean(不会保存数据,例如controller,service等)线程安全的。

如何解决单例bean线程安全问题?

  1. Bean找那个尽量不定义成员变量

  1. 将Bean定义为多例Bean

Spring中的事务

事务的四大特征(ACID)

  • 原子性:原子性是指事务包含的所有操作要么全部执行,要么全部不执行。

  • 一致性:是指事务必须使得数据库从一个一致性状态转换到另一个一致性状态,也就是说一个事务执行之前和之后都必须处于一致性状态。例如转账:AB两个用户一共有10000元,无论两个人如何转账,始终都是10000元不变

  • 隔离性:是指当多个用户并发访问数据库时,比如操作同一张表,数据库为每个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

  • 持久性:是指事务一旦被提交,数据将永久性保存。

Spring支持的事务管理类型

Spring支持两种事务类型:

编程式事务管理:这意味着将通过编程的方式管理事务,会带来极大的灵活,但是难维护。

声明式事务管理:意味着你可以将业务代码和事务管理分离,只需要通过注解和XML配置来管理事务。

实现声明式事务的两种方式

  1. 基于<tx>和<aop>命名空间的声明式事务管理:其最大特点是与Spring结合紧密,可以充分利用切点表达式的强大支持,使得事务管理更加灵活。

  2. 基于@Transactional的全注解方式:将声明式事务管理简化到了极致。开发人员只需要在配置文件中加入一行启用相关后处理Bean的配置,然后在需要实施事务管理的方法或者类上使用@Transaction指定事务规则可实现事务管理,而且功能也不比其他方式逊色。

Spring事务的传播行为

事务的传播特性指的是当一个事务方法被另一个事务方法调用时,这个方法应该如何进行。

PROPAGATION_REQUIRED:如果当前没有事务

事务传播行为类型外部不存在事务外部存在事务使用方式
REQUIED开启新的事务融合到外部事务中@Transaction(propagation=Propagation.REQUIRED) 适合增删改查
SUPPORTS不开启新的事务融合到外部事务中@Transaction(propagation=Propagation.SUPPORTS) 适合查询
REQUIEDS_NEW开启新的事务不用外部事物,创建新的事务@Transaction(propagation=Propagation.REQUIEDS_NEW) 适合内部事务和外部事务不存在业务关系情况,如日志
NOT_SUPPORTED不开启新的事务不用外部事物@Transaction(propagation=Propagation.NOT_SUPPORTED) 不常用
NEVER不开启新的事务抛异常@Transaction(propagation=Propagation.NEVER) 不常用
MANDATORY抛出异常融合到外部事务中@Transaction(propagation=Propagation.MANDATORY) 不常用
NESTED开启新的事务融合到外部事务中,SavePoint机制,外层印象内层,内层不会影响外层@Transaction(propagation=Propagation.NESTED) 不常用

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Python】Web学习笔记_flask(4)——钩子函数

钩子函数可以用来注册在请求处理的不同阶段执行出 Flask的请求钩子指的是在执行视图函数前后执行的一些函数&#xff0c; 之前是有4种&#xff0c;但是 before_first_request已经被删除了&#xff0c;使用时会报错 before_request&#xff1a;在每次请求前执行&#xff0c;…

⛳ Java多线程 一,线程基础

线程基础 ⛳ Java多线程 一&#xff0c;线程基础&#x1f43e; 一&#xff0c;线程基础&#x1f4ad; 1.1&#xff0c;什么是程序&#xff0c;进程&#xff0c;线程&#x1f3ed; 1.2&#xff0c;什么是并行和并发&#x1f463; 1.3&#xff0c;线程使用的场景&#x1f3a8; 1.…

深度学习之双线性插值

1、单线性插值 单线性插值是一种用于估计两个已知数据点之间未知点的方法。它基于线性关系&#xff0c;通过计算目标位置的值&#xff0c;使用已知点之间的线性函数进行插值。这在图像处理中常用于放缩、旋转等操作&#xff0c;计算简单&#xff0c;产生平滑结果&#xff0c;但…

网络安全(秋招)如何拿到offer?(含面试题)

以下为网络安全各个方向涉及的面试题&#xff0c;星数越多代表问题出现的几率越大&#xff0c;祝各位都能找到满意的工作。 注&#xff1a;本套面试题&#xff0c;已整理成pdf文档&#xff0c;但内容还在持续更新中&#xff0c;因为无论如何都不可能覆盖所有的面试问题&#xf…

TCP三次握手四次挥手

一、TCP三次握手四次挥手 1.三次握手&#xff1a; 第一次握手&#xff1a;客户端发送syn包(seqx)到服务器&#xff0c;并进入SYN_SEND(发送)状态&#xff0c;等待服务器确认&#xff1b; 第二次握手&#xff1a;服务器收到syn包&#xff0c;必须确认客户的SYN&#xff08;ac…

刷题DAY15

第一题 给定一个数组arr 求子数组最大累加和 最暴力的 枚举每一个子数组 出结果 优化解 用一个cur指针保存累加和 每次cur变大 就用它更新max 如果cur累加到0以下 回复成0 假设答案法 假设我们最大的子数组是i 到 j位置上的 那么这个i 到j 之间 必不存在一个k使i...k累加和…

Unity 编辑器选择器工具类Selection 常用函数和用法

Unity 编辑器选择器工具类Selection 常用函数和用法 点击封面跳转下载页面 简介 在Unity中&#xff0c;Selection类是一个非常有用的工具类&#xff0c;它提供了许多函数和属性&#xff0c;用于操作和管理编辑器中的选择对象。本文将介绍Selection类的常用函数和用法&#xff…

基于注解实现接口幂等机制防止数据重复提交

1:什么是接口幂等性? 能解决什么问题? 接口幂等性是指无论调用接口的次数是一次还是多次&#xff0c;对于同一资源的操作都只会产生相同的效果。 比如: 一个订单记账的时候,会同步扣减库存数量,如果记账的按钮被用户多次触发,就会导致一个订单库存却被多次扣减的情况. 如果对…

无涯教程-Perl - References(引用)

Perl引用是一个标量数据类型&#xff0c;该数据类型保存另一个值的位置&#xff0c;该值可以是标量&#xff0c;数组或哈希。 创建引用 变量&#xff0c;子程序或值创建引用很容易&#xff0c;方法是在其前面加上反斜杠&#xff0c;如下所示: $scalarref \$foo; $arrayref …

用html+javascript打造公文一键排版系统11:改进单一附件说明排版

一、用htmljavascript打造公文一键排版系统10中的一个bug 在 用htmljavascript打造公文一键排版系统10&#xff1a;单一附件说明排版 中&#xff0c;我们对附件说明的排版函数是&#xff1a; function setAtttDescFmt(p) {var t p;var a ;if (-1 ! t.indexOf(:))//是半角冒…

CentOS 7虚拟机 虚拟机安装安装增强VBox_GAs_6.1.22失败:modprobe vboxguest failed

我安装的CentOS 在安装增强工具的时候报错: 查阅资料后 &#xff0c;解决方法&#xff1a; 1、更新kernel内核版本&#xff1a; yum update kernel -y //安装kernel-devel和gcc编译工具链yum install -y kernel-devel gcc//更新kernel和kernel-devel到最新版本yum -y upgrade …

express学习笔记7 - docker跟mysql篇

安装Docker和Navicat Docker 进官⽹https://docs.docker.com/get-docker/ 选择机型安装即可。 Navicat&#xff08;也可以在网上找个破解版本&#xff09; 进官⽹https://www.navicat.com/en/products/navicat-premium 安装完之后连接新建⼀个数据库连接 然后再⾥⾯新建⼀个数…

Flowable-网关-排他网关

目录 定义图形标记XML内容示例视频教程 定义 排他网关&#xff0c;也叫异或&#xff08;XOR&#xff09;网关&#xff0c;是 BPMN 中使用的最常见的网关之一&#xff0c;用来在流转中实 现发散分支决策。排他网关需要和条件顺序流搭配使用&#xff0c;当流程执行到排他网关&am…

APP广告流程中三个阶段的监测机制

APP广告流程包括三个阶段&#xff1a;展示广告&#xff0c;点击广告&#xff0c;进入Landing Site&#xff08;通过点击广告跳转到的目标站点&#xff09;。广告监测即对上述三个阶段进行监测。也就是说广告投出去以后&#xff0c;被多少人看到了&#xff0c;或者进一步点开了。…

2.4 网络安全新技术

数据参考&#xff1a;CISP官方 目录 云计算安全大数据安全移动互联网安全物联网安全工业互联网安全 一、云计算安全 1、云计算定义 云计算是指通过网络访问可扩展的、灵活的物理或虚拟共享资源池&#xff0c;并按需自助获取和管理资源的模式。在云计算中&#xff0c;计算资…

ARCGIS地理配准出现的问题

第一种。已有省级行政区矢量数据&#xff0c;在网上随便找一个相同省级行政区图片&#xff0c;利用地理配准工具给图片添加坐标信息。 依次添加省级行政区选择矢量数据、浙江省图片。 此时&#xff0c;图层默认的坐标系与第一个加载进来的省级行政区选择矢量数据的坐标系一致…

【雕爷学编程】MicroPython动手做(28)——物联网之Yeelight

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

命令行快捷键Mac Iterm2

原文:Jump forwards, backwards and delete a word in iTerm2 on Mac OS iTerm2并不允许你使用 ⌥← 或 ⌥→ 来跳过单词。 你也不能使用 ⌥backspace 来删除整个单词。 下面是在Mac OS上如何配置iTerm2以便能做到这一点的方法。 退格键 首先&#xff0c;你需要将你的左侧 ⌥…

Kindling the Darkness: A Practical Low-light Image Enhancer论文阅读笔记

这是ACMMM2019的一篇有监督暗图增强的论文&#xff0c;KinD其网络结构如下图所示&#xff1a; 首先是一个分解网络分解出R和L分量&#xff0c;然后有Restoration-Net和Adjustment-Net分别去对R分量和L分量进一步处理&#xff0c;最终将处理好的R分量和L分量融合回去。这倒是很常…

AI 3D结构光技术加持,小米引领智能门锁新标准

一直以来&#xff0c;小米智能门锁系列产品让更多家庭走进了安全便捷的智能生活&#xff0c;安全至上的设计让很多家庭都轻松告别了随身钥匙。 7月27日&#xff0c;小米正式推出小米智能门锁M20 Pro&#xff0c;再一次引领智能门锁产品的发展潮流。该款门锁采用AI 3D结构光技术…