Spring常见问题

Spring常见问题

1.什么是Spring,对Spring的理解?

Spring是一个轻量级的,IOC和AOP的一站式框架,为简化企业级开发而生的.

Spring会管理对象,需要使用的时候直接注入即可,还可以对对象的功能进行增强,使得耦合度降低.

2.解释IOC和AOP

IOC (控制反转)将生成对象控制权反转给了Spring框架,主要用来管理对象的生命周期.

Spring bean对象:一般把Spring框架创建的对象称为bean对象.

AOP(面向切面编程) :首先是对面向对象的补充,使用动态代理的方式,为目标类中的方法进行功能上的增强,不需要修改源代码

Spring中使用xml配置和注解方式 实现.

3.Spring的不足

不足之处是诞生SpringBoot之后对比产生的.配置比较麻烦,且大多都是模板化配置,需要大量的jar依赖

SpringBoot对Spring搭建进行简化,并不是代替Spring

4.IOC和DI的区别是什么?

IOC(控制反转)—>强调Spring管理对象

DI(依赖注入)—>在创建对象的同时注入相关联的对象

5.Spring中注入对象的方式

使用xml方式配置

使用注解方式

6.自动注入有哪些注解

方式1:使用spring框架中提供@Autowired 可以添加到要注入的属性上面,或者属性的set方法上,如果直接添加到属性上,set方法可以不需要,默认情况下,要注入的属性对象不能为空(@Autowired=true) 注入时查找bean的方式有两种: 1.通过对象名查找,需要使用@qualifier(value=“admindao”)2.通过属性的类型查找

方式2:使用jdk中提供的注解@Resource 查询bean也是两种方式:1.@Resource 通过类型查询 2.@Resource(name=“admindao”) 通过对象名查询

7.spring中的bean和new的对象区别

Spring创建的对象可以进行相关对象的注入,可以进行功能的增强(事务,统一异常处理,日志)自己new的对象就是普通的一个对象,没有任何增强和注入的功能

8.AOP中的术语有哪些,通知有哪些

连接点 切入点 通知 代理 目标

前置通知 后置通知 返回通知 异常通知 环绕通知(可以事先前置,后置,返回,异常通知功能)

9.spring实现AOP有几种方式?

通过xml配置

动态代理:

jdk代理:通过反射机制实现,目标类必须要实现接口

Cglib代理:Spring中提供的代理实现方式,不要求实现接口

10.谈谈Spring事务管理,实现方式有几种,原理是什么?

事务管理属于数据库功能,spring(java)帮助我们进行事务管理(开启事务,提交事务,回滚事务)

实现方式:1.编程式事务 :通过在代码中使用事务管理对象手动提交,回滚事务

2.声明式事务:使用注解方式实现@Transactional(rollbackFor=Exception.class)

原理: aop–动态代理

11.声明式事务那些场景下会失效

1.@Transactional(rollbackFor=Exception.class)用在了非public方法上

2.异常被catch捕获,认为方法没有出现异常

3.默认出现编译期异常,可以在@Transactional(rollbackFor=Exception.class)设置回滚事务为Exception,即使出现编译期异常也会回滚

4.数据库引擎不支持事务,只有innodb支持

12.SpringWeb(SprngMVC)运行流程

当有请求时,会先访问dispatcherServelet ,拦截器会先检测是否拦截,若不拦截则在适配器中进行封装后进入处理器进行解析地址,作出响应后返回给dispatcherservelet.

13.spring和springboot的关系区别

springboot对spring搭建进行简化,并不是代替spring,为微服务架构做铺垫

14.SpringBean的生命周期

宏观上来讲,springBean的生命周期可以分为5个阶段:

  1. 实例化 Instantiation
  2. 属性赋值 Populate
  3. 初始化 Initialization
  4. 将bean对象放入到容器中,使用
  5. 销毁 Destruction

15.Spring常用注解

声明bean的注解

@RestController、@Service、@Repository都可以称为@Component

@Component:泛指各种组件

@RestController:控制层

@Service:业务层

@Repository:数据访问层

Bean的生命周期属性

@Scope设置类型包括:设置Spring容器如何新建Bean实例

singleton:单例,一个Spring容器中只有一个bean实例,默认模式

protetype:每次调用新建一个bean

request:web项目中,给每个http request新建一个bean

session:web项目中,给每个http session新建一个bean

globalSession:给每一个 global http session新建一个Bean实例

注入bean的注解

@Autowired:由Spring提供

@Qualifier:

当有多个同一类型的Bean时,可以用@Qualifier(“name”)来指定。与@Autowired配合使用.

@Resource:由java提供

切面(AOP)相关注解

Spring支持AspectJ的注解式切面编程

@Aspect:声明一个切面

@After:最终通知

@AfterReturning 后置通知

@Before:在方法执行之前执行

@Around:在方法执行之前与之后执行

@AfterThrowing 异常通知

SpringWEB常用注解

@RestController:该注解为一个组合注解,相当于@Controller和@ResponseBody的组合,注解在类上,意味着,该Controller的所有方法都默认加上了@ResponseBody。

@RequestMapping:用于映射web请求,包括访问路径和参数

@ResponseBody:支持将返回值放到response内,而不是一个页面,通常用户返回json数据

@RequestBody:允许request的参数在request体中,而不是在直接连接的地址后面

其他注解

@JsonFormat

此注解用于属性或者方法上(最好是属性上),可以方便的把Date类型直接转化为我们想要的模式.

@Transactional 注解放在类级别时,表示所有该类的公共方法都配置相同的事务属性信息。

SpringBoot注解

@SpringBootApplication:

包含@Configuration、@EnableAutoConfiguration、@ComponentScan通常用在主类上;

@RestControllerAdvice,@ExceptionHandler用于统一异常处理,捕获指定的异常.

配置类相关注解

@Configuration:声明当前类为配置类

@Bean:注解在方法上,声明当前方法的返回值为一个bean,替代xml中的方式

@ComponentScan:用于对Component类型注解进行扫描

Spring定时器

在启动类上添加 @EnableScheduling

在任务方法上添加 @Scheduled(cron = “*/6 * * * * ?”)

16.Spring 中的bean是线程安全的吗?

Spring容器中的Bean是否线程安全,容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器中的Bean本身不具备线程安全的特性,但是具体还是要结合具体scope的Bean情况。

Spring 的 bean 作用域(scope)类型
 1、singleton:单例,默认作用域。

2、prototype:原型,每次创建一个新对象。

3、request:请求,每次Http请求创建一个新对象,适用于

线程安全这个问题,要从单例Bean与原型Bean分别进行说明。

原型Bean:
对于原型Bean,每次创建一个新对象,也就是线程之间并不存在Bean共享,自然是不会有线程安全的问题。

单例Bean:
对于单例Bean,所有线程都共享一个单例实例Bean,因此是存在资源的竞争。

Bean又分为

有状态就是有数据存储功能(例如包含成员变量)
无状态就是不会保存数据

如果单例Bean,是一个无状态Bean,也就是线程中的操作不会对Bean的成员执行查询以外的操作,那么这个单例Bean是线程安全的。比如Spring mvc 的 Controller、Service、Dao等,这些Bean大多是无状态的,只关注于方法本身。

但是如果Bean是有状态的 那就需要开发人员自己来进行线程安全的保证,最简单的办法就是改变bean的作用域 把 "singleton"改为’‘protopyte’ 这样每次请求Bean就相当于是 new Bean() 这样就可以保证线程的安全了。

17.Bean循环依赖

Spring中相互依赖注入会产生问题

在Spring中,一个对象并不是简单new出来了,而是会经过一系列的Bean的生命周期,就是因为Bean的生命周期所以才会出现循环依赖问题。

在创建A类的bean对象时,需要经历创建对象,初始化,这时就需要给A类中B属性进行注入,但是此时B也需要注入A,这时就会陷入循环依赖问题.

产生循环依赖的问题,主要是:A创建时–>需要B----B去创建—>需要A,从而产生了循环。

在这里插入图片描述

Spring解决循环依赖问题:

过程解析:

1.初始化BeanA,需要注入BeanB,去查找BeanB,没有找到,把BeanA交给一个工厂对象,将BeanA工厂对象存入到三级缓存中.

2.去查找BeanB,BeanB不存在,也将BeanB交给一个工厂对象,将BeanB工厂对象也存入到三级缓存中.

3.由于BeanB需要BeanA,此时可以在第三级缓存中找到BeanA工对象,注入给BeanB,然后将BeanB放入到二级缓存,从三级缓存中删除BeanB工厂对象,注入到BeanB,完成BeanB的初始化,放入到一级缓存.

4.当BeanB完成初始化后,将完整的BeanB注入到BeanA中,完成BeanA的初始化.

spring内部有三级缓存:

在DefaultSingletonBeanRegistry类中定义了3个Map对象充当缓存.

singletonObjects: 一级缓存,用于保存实例化、注入、初始化完成的bean.实例

**earlySingletonObjects:**二级缓存,用于保存实例化完成的bean实例,提前曝露对象.

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

18.SpringBoot自动装配原理

.

spring内部有三级缓存:

在DefaultSingletonBeanRegistry类中定义了3个Map对象充当缓存.

singletonObjects: 一级缓存,用于保存实例化、注入、初始化完成的bean.实例

**earlySingletonObjects:**二级缓存,用于保存实例化完成的bean实例,提前曝露对象.

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

18.SpringBoot自动装配原理

springBoot启动时,首先对application.yml和pom.xml文件进行读取,获取到项目中使用到的第三方组件,然后读取spring.factories中的spring支持的配置类,最后加载项目中所使用到的组件配置类.

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

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

相关文章

JAVA:组合模式(Composite Pattern)的技术指南

1、简述 组合模式(Composite Pattern)是一种结构型设计模式,旨在将对象组合成树形结构以表示“部分-整体”的层次结构。它使客户端对单个对象和组合对象的使用具有一致性。 设计模式样例:https://gitee.com/lhdxhl/design-pattern-example.git 2、什么是组合模式 组合模式…

使用FakeSMTP创建本地SMTP服务器接收邮件具体实现。

以下代码来自Let’s Go further节选。具体说明均为作者本人理解。 编辑邮件模版 主要包含三个template: subject:主题plainBody: 纯文本正文htmlBody:超文本语言正文 {{define "subject"}}Welcome to Greenlight!{{end}} {{def…

基于深度学习多图像融合的屏幕缺陷检测方案

公司项目,已申请专利。 深度学习作为新兴技术在图像领域蓬勃发展,因其自主学习图像数据特征的性能避免了人工设计算法的繁琐,精准的检测性能、高效的检测效率以及对各种不同类型的图像任务都有比较好的泛化性能,使得深度学习技术在…

【数据库】Redis—Java 客户端

一、常见的几种 Java 客户端 Jedis:以 Redis 命令作为方法的名称,便于学习,简单实用,但其实例是线程不安全的,多线程下需要基于连接池来使用。lettce:基于 Netty 实现,支持同步、异步和响应式编…

重拾设计模式--观察者模式

文章目录 观察者模式(Observer Pattern)概述观察者模式UML图作用:实现对象间的解耦支持一对多的依赖关系易于维护和扩展 观察者模式的结构抽象主题(Subject):具体主题(Concrete Subject&#xf…

贪心算法 part01

class Solution { public:int maxSubArray(vector<int>& nums) {int result INT32_MIN;int count 0;for (int i 0; i < nums.size(); i) {count nums[i];if (count > result) { // 取区间累计的最大值&#xff08;相当于不断确定最大子序终止位置&#xff…

Pytorch | 利用NI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击

Pytorch | 利用NI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集NI-FGSM介绍背景算法流程 NI-FGSM代码实现NI-FGSM算法实现攻击效果 代码汇总nifgsm.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器&#xff1a; Pytorch | 从零构建AlexNet对CIFAR10进行…

SAP抓取外部https报错SSL handshake处理方法

一、问题描述 SAP执行报表抓取https第三方数据,数据获取失败。 报错消息: SSL handshake with XXX.COM:449 failed: SSSLERR_SSL_READ (-58)#SAPCRYPTO:SSL_read() failed##SapSSLSessionStartNB()==SSSLERR_SSL_READ# SSL:SSL_read() failed (536875120/0x20001070)# …

AI开发:使用支持向量机(SVM)进行文本情感分析训练 - Python

支持向量机是AI开发中最常见的一种算法。之前我们已经一起初步了解了它的概念和应用&#xff0c;今天我们用它来进行一次文本情感分析训练。 一、概念温习 支持向量机&#xff08;SVM&#xff09;是一种监督学习算法&#xff0c;广泛用于分类和回归问题。 它的核心思想是通过…

信奥赛四种算法描述

#include <iostream> #include <iomanip> using namespace std;// 使用unsigned long long类型来尽量容纳较大的结果&#xff0c;不过实际上这个数值极其巨大&#xff0c;可能最终仍会溢出 // 更好的方式可以考虑使用高精度计算库&#xff08;如GMP等&#xff09;来…

Ajax中的axios

既然提到Ajax&#xff0c;那就先来说一说什么是Ajax吧 关于Ajax Ajax的定义 Asynchronous JavaScript And XML&#xff1a;异步的JavaScript和XML。 反正就是一句话总结&#xff1a; 使用XML HttpRequest 对象与服务器进行通讯。 AJAX 是一种在无需重新加载整个网页的情况下&…

vscode 使用说明

文章目录 1、文档2、技巧显示与搜索宏定义和包含头文件 3、插件4、智能编写5、VSCode 与 C&#xff08;1&#xff09;安装&#xff08;2&#xff09;调试&#xff08;a&#xff09;使用 CMake 进行跨平台编译与调试&#xff08;b&#xff09;launch.json&#xff08;c&#xff…

多功能护照阅读器港澳通行证阅读机RS232串口主动输出协议,支持和单片机/Linux对接使用

此护照阅读器支持护照、电子芯片护照、港澳通行证、台湾通行证&#xff0c;和串口的被动的方式不一样。此护照阅读器通电后&#xff0c;自动读卡&#xff0c;串口输出&#xff0c;软件只需要去串口监听数据即可&#xff0c;例如用串口助手就可以收到读卡信息。 非常适用于单片…

petalinux-adi ---移植adi内核(一)

1. 设备树生成 将 前 面 生 成 的 设 备 树 文 件 ( 笔 者 这 里 生 成 的 设 备 树 文 件 在Petalinux 工 程 的components/plnx_workspace/device-tree/device-tree/ 目 录 下 ) pcw.dtsi 、 pl.dtsi 、system-top.dts 以 及 zynq-7000.dtsi 四 个 文 件 直 接 拷 贝 到 内 …

基于MindSpore NLP的PEFT微调

创建notebook 登录控制台 创建notebook 如果出现提示按如下操作 回到列表页面创建notebook参数如下&#xff1a; 配置mindnlp环境 打开GitHub - mindspore-lab/mindnlp: Easy-to-use and high-performance NLP and LLM framework based on MindSpore, compatible with model…

centos-stream9系统安装docker

如果之前安装过docker需要删除之前的。 sudo dnf -y remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 安装yum-utils工具&#xff1a; dnf -y install yum-utils dnf-plugin…

Redis存在安全漏洞

Redis是美国Redis公司的一套开源的使用ANSI C编写、支持网络、可基于内存亦可持久化的日志型、键值&#xff08;Key-Value&#xff09;存储数据库&#xff0c;并提供多种语言的API。 Redis存在安全漏洞。攻击者利用该漏洞使用特制的Lua脚本触发堆栈缓冲区溢出漏洞&#xff0c;从…

黑马Java面试教程_P8_并发编程

系列博客目录 文章目录 系列博客目录前言1.线程的基础知识1.1 线程和进程的区别&#xff1f;难2频3面试文稿 1.2 并行和并发有什么区别&#xff1f; 难1频1面试文稿 1.3 创建线程的四种方式 难2频4面试文稿 1.4 runnable 和 callable 有什么区别 难2频3面试文稿 1.5 线程的 run…

ubuntu22.04 nginx配置下载目录,亲测成功

安装nginx ubuntu最简单&#xff0c;apt安装即可 apt install nginx 配置文件 文件都在目录下 /etc/nginx/添加内容 修改/ etc/nginx/sites-available/default &#xff0c; 注意这里不是nginx.conf&#xff0c;直接修改nginx.conf不奏效 location /downloads { …

【从零开始入门unity游戏开发之——C#篇21】C#面向对象的封装——`this`扩展方法、运算符重载、内部类、`partial` 定义分部类

文章目录 一、this扩展方法1、扩展方法的基本语法2、使用扩展方法3、扩展方法的注意事项5、扩展方法的限制6、总结 二、运算符重载1、C# 运算符重载2、运算符重载的基本语法3. 示例&#xff1a;重载加法运算符 ()4、使用重载的运算符5、支持重载的运算符6、不能重载的运算符7、…