Spring相关面试题(四)

49 JavaConfig方式如何启用AOP?如何强制使用cglib?

在JavaConfig类,加上@EnableAspectJAutoProxy

如果要强制使用CGLIB动态代理 ,加上(proxyTargetClass = true)

加上(exposeProxy = true) 就是将对象暴露到线程池中。

50 介绍AOP在Spring中的实现方式。
  1. 接口实现

  2. XML配置

  3. 注解实现

51 AOP什么情况下会失效,怎么解决?

内部调用不会触发AOP

  1. 方法是private也会失效。

  2. 目标类没有配置Bean,没有交给Spring去管理。

  3. 切点表达式没有配置正确。

解决方法

在方法里面拿到动态代理对象,再去调用目标方法。

  1. 可以注入一个类,IOC会帮你注入增强的代理对象,通过这个对象进行对应的方法的调用,就不会有这些问题。

    1. 注意这里的接收对象,要使用接口来接收,因为这里要注入的代理对象,前面说过SpringAOP中,如果实现了接口,默认是使用JDK的动态代理,而JDK实现动态代理的一个很关键的步骤就是:让这个代理类实现目标类所实现的接口。

  2. 或者在@EnableAspectJAutoProxy(exposeProxy = true) ,在线程中暴露对象。

52 Spring的AOP是在哪里创建的动态代理?
  1. 在Bean初始化后,通过Bean的后置处理器进行动态代理。

  2. 如果在属性注入的时候,有循环依赖注入的情况,也会使用Bean的后置处理器为Bean生成代理对象。

53 Spring的AOP的完整实现流程

当@EnableAspectJAutoProxy 会通过@lmport注册一个BeanPostProcessor处理AOP.

  1. 解析切面:在Bean创建之前的第一个Bean后置处理器会去解析切面(解析切面中通知、切点,一个通知就会解析成一个advisor(通知、切点)

  2. 创建动态代理 正常的Bean初始化后调用BeanPostProcessor拿到之前缓存的advisor,再通过advisor中oointcut 判断当前Bean是否被切点表达式匹配,如果匹配,就会为Bean创建动态代理(创建方式1.jdk动态代理2.cglib)。

  3. 调用:拿到动态代理对象, 调用方法 就会判断当前方法是否增强的方法, 就会通过调用链的方式依次去执行通知.

54 事务的四大特性
  1. A:原子性

    1. 一个事务要么成功,要么失败。

  2. C:一致性

    1. 从一个状态转换成另一个状态,数据保持一致。

  3. I:隔离性

    1. 多用户并发操作一张表的时候,数据库为每一个用户开启事务,事务之间都是隔离的,不干扰。

  4. D:持久性

    1. 事务一旦提交了,对数据库的改变是永久的。

55 Spring支持的事务管理类型,spring事务实现方式有哪些?
  1. 编程式事务:

    1. 比如JDBC中,使用对应的方法开启一个事务,进行提交、回滚等操作。

  2. 声明式事务:

    1. @Transactional注解

56 Spring的事务传播行为
@Transactional
public void function1(){function2(); 
}
@Transactional
public void function2(){//TODO:业务代码  
}

都是针对function2来说的

57 Spring的隔离级别

并发下产生的问题:

  1. 脏读

    事务2修改了a的值,但是没有提交事务;这是事务1读到了事务2修改的值,且事务2又回滚了,产生了数据不一致问题,导致了脏读。

    @Transactional(isolation = Isolation.READ_COMMITED) //设置成读已提交。

  2. 不可重复读

    一个事务中,多次读取的内容不同:比如事务1在事务2操作的时候读取a,由于设置成读已提交,这是事务2没有提交,所以读到的值是事务2没操作之前a的值,但是事务2提交后,事务1再次进行读取,两次读的值不同。

    @Transactional(isolation = Isolation.REPEATABLE_READ) //设置成可重复读。

    解决方案就是加了行锁,在事务1操作的时候,不允许别的事务进行操作。

  3. 幻读

    如果事务1在事务2操作的期间使用统计类的函数,如:sum() ,average()等方法,事务2进行的是insert,就会导致事务1两次结果不同,因为可重复读是加的行锁,解决这个问题需要加表锁。

    @Transactional(isolation = Isolation.SERIALIZABLE) //设置成最高级别:表锁。

58 Spring事务实现原理

开启事务注解:@EnableTrasactionalManagement

原理:

  1. 解析切面 ——> bean的创建第一个后置处理器就行解析。advisor(ponitcut[通过@Transactional解析的切点],advise[这个advice是通过@EnableTrasactionalManagement注册了一个配置类,该配置类就配置了advisor])

  2. 创建动态代理 ——> bean初始化后,调用Bean的后置处理器,调用后置方法进行动态代理(规则就是原来的内容)。

  3. 调用

    增强的代码,会把autoCommit设置成false,然后执行方法中的sql语句。

59 Spring事务传播的原理

主要是在调用这块:

包括两个方面:

  • 融入:当传播行为是融入外部事务,则拿到ThreadLocal的Connection,共享一个数据库连接共同提交、回滚。

  • 创建新的事物:当传播行为是创新事务,会将嵌套新事务存入ThreadLocal、再将外部事务暂存起来;当嵌套事务提交、回滚后,会将暂存的事务信息恢复到ThreadLocal中。

比如两个事务:一个外部,一个内嵌在外部方法中。

  1. 外部:创建一个Connection放到ThreadLocal中,并且修改autoCommit为false,返回事务状态信息(TransactionInfo.newTransaction())

  2. 外部,执行对应的内嵌方法,

  3. 内嵌:判断ThreadLocal中是不是已经有了Connection,这时显然是有的,下一步继续判断事务传播行为:

    1. 融入:

      不会创建新的connection,返回事务状态信息:TransactionInfo.newTransaction = false

    2. 创建:

      把外层的事务相关的事务信息(Connection、隔离级别、是否只读...暂存,同时把外层事务的ThreadLocal存储到事务信息都置空)创建一个Connection,放到ThreadLocal中,发回事务状态信息

      (TransactionInfo.newTransaction = true ,TransactionInfo也包含暂存的事务信息);判断newTransaction是不是true,就提交事务,判断是否暂存事务,把暂存的事务信息回归。

  4. 外部:

    1. 判断外部 Transaction.newTransaction = true 提交事务。(有异常就回滚)

60 Spring多线程事务,能否保持一致性

比如:

public viod test(){int result = testDao.getCount();new Thread(()->{//进行数据库的操作}).start();
}

1.Spring的事务信息是存在ThreadLǎcal中的Connection,所以一个线程永远只能有一个事务

2.所以Spring 的事务是无法实现事务一致性的

3.可以通过编程式事务,或者通过分布式事务的思路:二阶段提交方式

61 Spring事务失效的原因

Spring是基于AOP来的。

  1. 方法是private

  2. 目标类没有交给spring IOC管理

  3. 自己捕获了异常,没有把异常抛出。

  4. 使用cglib动态代理,但是@Transactional声明在接口上面。

内部调用不会触发。

内部方法没有走的代理,比如:

public void way1(){this.way2();
}
​
@Trasactional(propagation = Propagation.REQUIRES_NEW)
public void way2(){}

这时,可以在重新注入自己一遍。

62 Spring事件监听的核心机制

原理

观察者模式

Spring事件监听有三个部分组成

  • 事件:负责对应相应监听器事件源发生事件是特定的事件监听器被触发的原因。

  • 监听器:对应于观察者模式中的观察者。监听器监听特定的事件,并在内部定义了事件发生后的逻辑响应。

  • 事件发布器:对应于观察者模式中的被观察者/主题, 负责通知观察者 对外提供发布事件和增删事件监听器的接口,维护事件和事件监听器之间的映射关系,并在事件发生时负责通知相关监听器。

支持异步

异步发布事件的核心机制:

多线程。

63 Spring如如何整合Mybatis,管理Mapper接口的呢?

实现:基于JDK的动态代理。

  1. Spring会排除接口,无法注册到IOC容器中

  2. MyBatis 实现了BeanDefinitionRegistryPostProcessor 可以动态注册BeanDefinition

  3. 需要自定义扫描器(继承Spring内部扫描器ClassPathBeanDefinitionScanner)重写排除接口的方法(isCandidateComponent5.但是接口虽然注册成了BeanDefinition但是无法实例化Bean 因为接口无法实例化

  4. 需要将BeanDefinition的BeanClass 替换成JDK动态代理的实例(偷天换日)

  5. Mybatis 通过FactoryBean的工厂方法设计模式可以自由控制Bean的实例化过程,可以在getObject方法中创建JDK动态代理

64 解决SpringMVC中修正POST 和 GET 方法乱码问题
  1. web.xml中配置一个CharacterEncodingFilter过滤器,设置成utf-8。

    <filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.characterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param>
    ​<filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
    </filter>
  2. 修改Tomcat配置文件的编码。

  3. 对参数进行重新编码。

65 SpringMVC的控制器是不是单例模式,如果是,有什么问题,怎么解决?

避免在类中声明成员变量,否则就会存在线程安全问题;如果有必须需要,可以放到ThreadLocal中去,因为ThreadLocal是一个线程对应一个对象。

也可以使用线程锁,但是会影响性能。

66 SpringMVC的工作流程?描述一下DispatcherServlet的工作流程?

DispatcherServlet 核心调度器和前端处理器。

  1. 用户发送请求至前端控制器DispatcherServlet;

  2. DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handle;

  3. 处理器映射器根据请求ur1找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet

  4. DispatcherServlet 调用 HandlerAdapter处理器适配器;

  5. HandlerAdapter 经过适配调用 具体处理器(Handler,也叫后端控制器);

  6. Handler执行完成返回ModelAndView;

  7. HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet,

  8. DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析;

  9. ViewResolver解析后返回具体View;

  10. DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中) DispatcherServlet啊应用户。

 

67 SpringMVC 中如何处理AJAX请求?
  1. 加入Jackson依赖

  2. 在配置文件中配置json的消息转换器。(jackson不需要配置HttpMessageConvert 消息转换器)

    <mvc:annotaion-driven conversion-service="conversionService" />
  3. 在接受AJAX请求的方法上就可以加入@RequestBody等注解,就可以自定接受JSON文本,转换成对象。

68 Spring和SpringMVC为什么需要父子容器?
  1. 主要作用是划分边界:Dao和Service层主要通过Spring的容器进行管理;controller一般通过SpringMVC的容器。

  2. 规范架构:父容器service无法访问子容器controller,子容器controller可以访问父容器的service。

  3. 将方便子容器的切换。如果我们想把web层从SpringMVC改成struts,只需要将spring-mvc.xml换成Struts的配置文件,Spring的配置文件是不需要改变的。

  4. 为了节省重复Bean创建。

69 是否可以把SpringMVC中的所有的Bean都交给Spring容器来管理?

不可以,这样会导致我们请求接口的时候产生404。如果所有的Bean都交给父容器,SpringMVC在初始化HandlerMethods的时候(initHandlerMethods)无法根据Controller的handler方法注册HandlerMethod,并没有去査找父容器的bean;也就无法根据请求URI获取到 HandlerMethod来进行匹配,只有getBean才是从父容器中拿。

70 是否可以把Spring容器中的所有的Bean放到SpringMVC中进行管理。

可以,因为父容器的体现无非是为了获取子容器不包含的bean,如果全部包含在子容器完全用不到父容器了, 所以是可以全部放在springmvc子容器来管理。 虽然可以这么做不过一般应该是不推荐这么去做的,一般人也不会这么干的。如果你的项目里有用到事物、或者aop记得也需要把这部分配置需要放到Spring-mvc子容器的配置文件来,不然一部分内容在子容器和一部分内容在父容器,可能就会导致你的事物或者AOP不生效。所以如果aop或事物如果不牛效也,有可能是通讨父容器(Spring)去增强子容器(SpringMVC),也就无法增强。

71 如和实现零配置的SpringMVC?原来是什么?

JavaConfig的配置方式。

  1. 省略web.xml

    1. servlet3.0之后规范中提供了SPI扩展:META-INF/services/javax.servlet.ServletContainerlnitializer

    2. SpringMVC通过实现ServletContainerlnitializer接囗

    3. 动态注册ContextLoaderListener 和DispatcherServlet并创建子父容器(Application)

  2. 省略spring.xml和spring-mvc.xml(只是sprinmvc方式,springboot在自动配置类完成)

    1. 实现一个继承AbstractAnnotationConfigDispatcherServletlnitializer的类

    2. 该类就实现了ServetContainernitializer,它会创建ContextLoaderListener 和DispatcherServlet

    3. 还会创建父子容器,创建容器时传入父子容器配置类则可以替代spring.xml和spring-mvc.xml

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

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

相关文章

【3】迁移学习模型

【3】迁移学习模型 文章目录 前言一、安装相关模块二、训练代码2.1. 管理预训练模型2.2. 模型训练代码2.3. 可视化结果2.4. 类别函数 总结 前言 主要简述一下训练代码 三叶青图像识别研究简概 一、安装相关模块 #xingyun的笔记本 print(xingyun的笔记本) %pip install d2l %…

详解TCP和UDP通信协议

目录 OSI的七层模型的主要功能 tcp是什么 TCP三次握手 为什么需要三次握手&#xff0c;两次握手不行吗 TCP四次挥手 挥手会什么需要四次 什么是TCP粘包问题&#xff1f;发生的原因 原因 解决方案 UDP是什么 TCP和UDP的区别 网络层常见协议 利用socket进行tcp传输代…

【js面试题】深入理解DOM操作:创建、查询、更新、添加和删除节点

面试题&#xff1a;DOM常见的操作有哪些 引言&#xff1a; 在前端开发中&#xff0c;DOM&#xff08;文档对象模型&#xff09;操作是日常工作中不可或缺的一部分。DOM提供了一种以编程方式访问和更新文档内容、结构和样式的接口。 任何html或 xml 文档都可以用dom表示为一个由…

KIVY Button¶

Button — Kivy 2.3.0 documentation Button Jump to API ⇓ Module: kivy.uix.button Added in 1.0.0 The Button is a Label with associated actions that are triggered when the button is pressed (or released after a click/touch). To configure the button, the s…

【论文速读】| 用于安全漏洞防范的人工智能技术

本次分享论文&#xff1a;Artificial Intelligence Techniques for Security Vulnerability Prevention 基本信息 原文作者&#xff1a;Steve Kommrusch 作者单位&#xff1a;Colorado State University, Department of Computer Science, Fort Collins, CO, 80525 USA 关键…

ISO/OSI七层模型

ISO:国际标准化/ OSI:开放系统互联 七层协议必背图 1.注意事项&#xff1a; 1.上三层是为用户服务的&#xff0c;下四层负责实际数据传输。 2.下四层的传输单位&#xff1a; 传输层&#xff1b; 数据段&#xff08;报文&#xff09; 网络层&#xff1a; 数据包&#xff08;报…

1Panel安装命令脚本大全,多Linux操作系统版本

1Panel安装命令脚本大全&#xff0c;包括RedHat、CentOS、Ubuntu、Debian和openEuler等linux操作系统&#xff0c;码笔记整理1Panel安装命令脚本清单&#xff1a; RedHat/CentOS安装命令&#xff1a; curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh…

【Swoole 的生命周期,文件描述符,协程数量,以及默认值】

目录 Swoole 的生命周期 Swoole 文件描述符&#xff08;FD&#xff09;缓存 Swoole设置协程的数量 Swoole 默认值 Swoole 是一个基于 PHP 的高性能网络通信引擎&#xff0c;它采用 C 编写&#xff0c;提供了协程和高性能的网络编程支持。Swoole 支持多种网络服务器和客户端…

python库 - modelscope

ModelScope 是一个集成的机器学习模型库&#xff0c;旨在简化机器学习模型的使用流程&#xff0c;提供多种预训练模型&#xff0c;涵盖计算机视觉、自然语言处理、语音识别等多个领域。用户可以轻松访问、使用和分享各种预训练的机器学习模型&#xff0c;无需从头开始训练模型&…

Vue项目openlayers中使用jsts处理wkt和geojson的交集-(geojson来源zpi解析)

Vue项目openlayers中使用jsts处理wkt和geojson的交集-(geojson来源zpi解析) 读取压缩包中的shape看上一篇笔记&#xff1a;Vue项目读取zip中的ShapeFile文件&#xff0c;并解析为GeoJson openlayers使用jsts官方示例&#xff1a;https://openlayers.org/en/latest/examples/j…

框选table单元格,高亮展示

td单元格内&#xff0c;有未知层dom结构 <style>.highlight {background-color: yellow;} </style> <table id"myTable"><colgroup><col style"background-color: lightblue;"><col style"background-color: light…

#pragma 指令

#pragma 指令作用是设定编译器的状态或者是指示编译器完成一些特定的动作 message 参数能够在编译信息输出窗口中输出相应的信息 #pragma message(“消息文本”) code_seg参数能够设置程序中函数代码存放的代码段&#xff0c;当我们开发驱动程序的时候就会使用到它 #pragma…

科技创新引领水利行业升级:深入分析智慧水利解决方案的核心价值,展望其在未来水资源管理中的重要地位与作用

目录 引言 一、智慧水利的概念与内涵 二、智慧水利解决方案的核心价值 1. 精准监测与预警 2. 优化资源配置 3. 智能运维管理 4. 公众参与与决策支持 三、智慧水利在未来水资源管理中的重要地位与作用 1. 推动水利行业转型升级 2. 保障国家水安全 3. 促进生态文明建设…

下降npm版本

Node版本与NPM版本对应关系 Node版本与NPM版本对应关系_node对应npm版本-CSDN博客 要降低npm的版本&#xff0c;可以按照以下步骤进行操作 1.首先&#xff0c;打开终端或命令提示符窗口。 2.输入以下命令来检査当前安装的npm版本: npm -v 3.如果你想要降低npm的版本&#xff…

vb.netcad二开自学笔记5:ActiveX链接CAD的.net写法

一、必不可少的对象引用 使用activex需要在项目属性中勾选以下两个引用&#xff0c;若找不到&#xff0c;则浏览定位直接添加下面两个文件&#xff0c;可以看到位于cad的安装路径下&#xff0c;图中的3个mgd.dll也可以勾选。 C:\Program Files\Autodesk\AutoCAD 2024\Autodes…

实战 | YOLOv8使用TensorRT加速推理教程(步骤 + 代码)

导 读 本文主要介绍如何使用TensorRT加速YOLOv8模型推理的详细步骤与演示。 YOLOv8推理加速的方法有哪些? YOLOv8模型推理加速可以通过多种技术和方法实现,下面是一些主要的策略: 1. 模型结构优化 网络剪枝:移除模型中不重要的神经元或连接,减少模型复杂度。 模型精…

中文大模型基准测评2024上半年报告

中文大模型基准测评2024上半年报告 原创 SuperCLUE CLUE中文语言理解测评基准 2024年07月09日 18:09 浙江 SuperCLUE团队 2024/07 背景 自2023年以来&#xff0c;AI大模型在全球范围内掀起了有史以来规模最大的人工智能浪潮。进入2024年&#xff0c;全球大模型竞争态势日益加…

Obsidian 文档编辑器

Obsidian是一款功能强大的笔记软件 Download - Obsidian

降Compose十八掌之『见龙在田』| Modifier

公众号「稀有猿诉」 原文链接 降Compose十八掌之『见龙在田』| Modifier 通过前面的文章我们学会了如何使用元素来构建和填充我们的UI页面&#xff0c;但这只完成了一半&#xff0c;元素还需要装饰&#xff0c;以及进行动画和事件响应&#xff0c;这才能生成完整的UI。这…

2.5章节python中布尔类型

在Python中&#xff0c;布尔类型&#xff08;Boolean type&#xff09;用于表示真&#xff08;True&#xff09;或假&#xff08;False&#xff09;的值。这是编程中非常基础且重要的一个概念&#xff0c;因为它允许程序进行条件判断&#xff0c;从而根据条件执行不同的代码块。…