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

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

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

相关文章

打开浏览器控制台,点击应用,浏览器崩溃

调试的时候&#xff0c;打开控制台&#xff0c;点击 “应用” 立马浏览器奔溃&#xff0c;但是点击别的没问题 调查发现是因为manifest.json这个文件引起的 manifest.json 最主要的原因是因为没有设置这个sizes字段 Google浏览器更新大概到126之后的版本会有问题&#xff0c;之…

关于CPU你一定要注意的重要参数,警惕韭菜陷阱

昨天遇到个奇葩事&#xff0c;有个粉丝喷我“懂不懂什么叫I9&#xff1f;”言下之意就是CPU中I9>i7>I5>I3&#xff0c;我也不知道咋说&#xff0c;只是提醒大家小心被坑&#xff0c;花了多的钱用的差的性能。作为回应&#xff0c;仅以此篇说下CPU咱们臭打游戏一定要知…

新手学Cocos报错 [Assets] Failed to open

两个都在偏好设置里面调&#xff08;文件下面的偏好设置&#xff09;&#xff1a; 1.设置中文&#xff1f; 2.报错 [Assets] Failed to open&#xff1f; 这样在点击打开ts文件的时候就不会报错&#xff0c;并且用vscode编辑器打开了&#xff0c; 同样也可以改成你们自己喜欢…

彻底解决Path with “WEB-INF“ or “META-INF“: [WEB-INF/views/index.jsp]

背景描述 项目使用的是springboot2jsp的架构。以前好好的项目复制了一份&#xff0c;然后就无法访问报错。百度了好久都乱七八糟的&#xff0c;还没有解决问题。错误消息如下&#xff1a; 2024-07-05 15:45:51.335 INFO [http-nio-12581-exec-1]org.springframework.web.ser…

【Selenium配置】WebDriver安装浏览器驱动(ChromeEdge)

【Selenium配置】WebDriver安装浏览器驱动&#xff08;Chrome&Edge&#xff09; 文章目录 【Selenium配置】WebDriver安装浏览器驱动&#xff08;Chrome&Edge&#xff09;Chrome确认Chrome版本下载对应driver把解压后的chromedriver文件放在chrome安装目录下&#xff0…

字节跳动与南开联合开源 StoryDiffusion:一键生成漫画和视频故事的神器!完全免费!

大家好&#xff0c;我是程序员X小鹿&#xff0c;前互联网大厂程序员&#xff0c;自由职业2年&#xff0c;也一名 AIGC 爱好者&#xff0c;持续分享更多前沿的「AI 工具」和「AI副业玩法」&#xff0c;欢迎一起交流~ 漫画&#xff0c;是多少人童年的回忆啊&#xff01; 记得小学…

VMware安装centos9详细教程(保姆级)

前言 centos9最新的centos版本&#xff0c;在近期的使用中发现它的操作界面与以往的centos7/8更加舒适&#xff0c;界面优化更加精细 项目终止日期&#xff08;EOL&#xff09; 从公告可知&#xff0c;CentOS 项目重心从 CentOS Linux 转移到了 CentOS Stream。下面是各个项…

初识STM32:开发方式及环境

STM32的编程模型 假如使用C语言的方式写了一段程序&#xff0c;这段程序首先会被烧录到芯片当中&#xff08;Flash存储器中&#xff09;&#xff0c;Flash存储器中的程序会逐条的进入CPU里面去执行。 CPU相当于人的一个大脑&#xff0c;虽然能执行运算和执行指令&#xff0c;…

沪上繁花:上海电信的5G-A之跃

2024年6月18日下午&#xff0c;在上海举行的3GPP RAN第104次会议上&#xff0c;3GPP正式宣布R18标准冻结。R18是无线网络面向5G-A的第一个版本&#xff0c;其成功冻结正式宣布了5G发展迎来新机遇&#xff0c;5G-A商用已进入全新的发展阶段。 在5G-A滚滚而来的时代洪流中&#x…

基于STM32的通用红外遥控器设计: 解码、学习与发射(代码示例)

摘要&#xff1a; 本文将带你使用STM32打造一款功能强大的万能红外遥控器&#xff0c;它可以学习和复制多种红外信号&#xff0c;并通过OLED屏幕和按键实现便捷操作。我们将深入探讨红外通信原理、STM32编程、OLED显示和EEPROM数据存储等关键技术&#xff0c;并提供完整的代码示…

【Linux进阶】文件系统7——文件系统简单操作

1.磁盘与目录的容量 现在我们知道磁盘的整体数据是在超级区块中&#xff0c;但是每个文件的容量则在inode 当中记载。 那在命令行模式下面该如何显示这几个数据&#xff1f;下面就让我们来谈一谈这两个命令&#xff1a; df&#xff1a;列出文件系统的整体磁盘使用量&#xf…

(阿里云在线播放)基于SpringBoot+Vue前后端分离的在线教育平台项目

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

公务员考试、事业编考试、教师资格证、面试、K12资料、电子书

点击上方△腾阳 关注 作者 l 腾阳 转载请联系授权 你好&#xff0c;我是腾阳。 在这个自媒体的海洋里&#xff0c;我曾是一只迷失方向的小鸟&#xff0c;多次尝试飞翔却总是跌跌撞撞。 但每一次跌倒&#xff0c;都让我更坚定地相信&#xff0c;只要不放弃&#xff0c;总…

【Android】自定义换肤框架01之皮肤包制作

前言 目前为止&#xff0c;市面上主流的安卓换肤方案&#xff0c;其实原理都是差不多的 虽然大多都号称一行代码集成&#xff0c;但其实想要做到完全适配&#xff0c;并不简单 这个系列&#xff0c;就是让大家从零开始&#xff0c;完全掌握这方面知识&#xff0c;这样才能对…

Floyd

模板&#xff1a; 时间复杂度&#xff1a;O( ) memset(v,127,sizeof(v));for(int k1;k<n;k)for(int i1;i<n;i)for(int j1;j<n;j)if(v[i][k]<1<<30&&v[k][j]<1<<30)v[i][j]min(v[i][j],v[i][k]v[k][j]);

2024年软件测试八股文(含答案)

Part1 1、你的测试职业发展是什么&#xff1f; 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前3年积累测试经验&#xff0c;按如何做好测试工程师的要点去要求自…

ContextCapture - 开启三维世界的魔法之门

亲爱的朋友们&#xff0c;当我第一次接触到ContextCapture这款软件时&#xff0c;我的内心激动得难以平静。仿佛一位魔法师突然出现在我面前&#xff0c;向我展示了一个全新的世界。是的&#xff0c;这就是ContextCapture带给我的感觉 - 它不仅仅是一款软件&#xff0c;更是一把…

数字化精益生产系统--APS 排程管理系统

APS&#xff08;Advanced Planning and Scheduling&#xff09;排程管理系统&#xff0c;即高级生产计划与排程系统&#xff0c;是一种高度智能化的计划和排程系统。它通过整合各种生产和供应链数据&#xff0c;运用先进的算法和数据模型&#xff0c;根据各种约束条件&#xff…

最新-基于Python的理财和记账系统

博主介绍&#xff1a;&#x1f449;全网个人号和企业号粉丝40W,每年辅导几千名大学生较好的完成毕业设计&#xff0c;专注计算机软件领域的项目研发&#xff0c;不断的进行新技术的项目实战&#x1f448; ⭐️热门专栏推荐订阅⭐️ 订阅收藏起来&#xff0c;防止下次找不到 &am…

非NI GPIB卡与LabVIEW兼容性分析

在许多测试和测量应用中&#xff0c;通用接口总线&#xff08;GPIB&#xff09;是一种广泛使用的标准。尽管国家仪器公司&#xff08;NI&#xff09;提供的GPIB硬件和LabVIEW软件的组合被广泛接受和使用&#xff0c;但成本可能较高。因此&#xff0c;一些用户会考虑使用其他厂商…