Java开发工程师面试题(Spring)

一、Spring Bean的生命周期

   生命周期可以分为以下几步

  1. 通过Spring框架的beanFactory工厂利用反射机制创建bean对象
  2. 根据set方法或者有参构造方法给bean对象的属性进行依赖注入
  3. 判断当前bean对象是否实现相关aware接口诸如beanNameAwarebeanFactoryAware接口如果有的话执行对应的方法
  4. 执行bean对象的前置处理器postprocessbeforinitialztion
  5. 执行初始化方法initMethod
  6. 执行bean对象的后置处理器postprocessafterinitialztion
  7. 判断当前bean对象是否为单例是则放到spring对象容器中多例则直接返回bean对象
  8. 使用bean对象
  9. 关闭容器调用destroy方法销毁对象

二、Spring事务在以下几种情况下会失效

  1. 直接new出来的对象添加事务不起作用因为只有Spring定义的bean才接受事务
  2. 由于MySQL的引擎用Myisam不支持事务所以如果使用MySQL的Myisam引擎的话事务不起作用
  3. 如果@Transaction注解到非public方法上事务不起作用这是因为Spring的Aop特性
  4. 如果在当前类中进行内部调用方法比如在A类中有a方法和b方法a方法没有加@Transationb方法加了@Transation在方法a中调用方法b方法b中的事务也不会生效这是因为Spring在扫描bean的时候会自动为标注了@Transaction注解类生成一个代理类在有注解方法被调用时实际是代理类调用的代理类在调用之前会开启事务执行事务操作但是同类中的方法相互调用相当于this.b(),此时的b方法并非代理类调用而是直接通过原有的bean直接调用所以注解不起作用
  5. 开启的线程中
  6. 被final注释
  7. 异常类型错误如果抛出的runtimeException事务才会回滚
  8. 如果异常被catch到必须要抛出异常事务才会回滚

Spring事务是通过面向切面实现的源码在TransactionInterceptor类中事务开启是依赖数据库链接的而链接是和线程绑定的。嵌套事务通过savepoint实现,事务方法中开启新事务则通过获取新的链接进行事务开启(实际就是关闭自动提交)。

链接对象封装在TransactionInfo中,它也记录了前一个事务对象,如果没有则为null。

每开启一个事务,这个事务对象都会绑定到一个ThreadLocal静态变量中,即当前的事务对象。

spring事务切面基于以上逻辑实现了声明式事务管理,及事务属性的传播(在当前存在或不存在事务时,加入当前事务或开启新的事务或以非事务方式执行或在嵌套事务中执行)。

所以在事务方法中

1.使用新的线程执行代码逻辑,会使事务失效。

2.事务方法内部捕获了异常sql的异常,未将抛出到事务切面中,这时候事务会提交,即正常执行的那部分sql执行结果将会生效。

3.未指定回滚的异常,默认是RuntimeException回滚。如果抛出编译期异常,则事务最终也会提交,不会回滚。

三、设计模式在源码中应用

工厂方法模式:在Spring的AbstractBeanFactory

抽象工厂模式:在Spring的BeanFactory

单例模式:Spring中创建单例。

建造者模式:解析xml文件

原型模式:在创建ioc容器后,通过getBean()获取bean对象时,往里追可以发现在核心方法处spring对bean的scope属性进行了判断,配置了prototype时。

适配器模式:spring AOP中的MethodBeforeAdviceAdapter类。

装饰模式:TransactionAwareCacheDecorator 类

代理模式:spring中代理有两种,Jdk代理方式和CGLIB。

外观模式:Tomcat 中,catalina.jar 中的 RequestFacade 和 ResponseFacade 。

桥接模式:JDBC

组合模式:CompositeCacheManager,Mybatis 在处理 xml 动态 sql 中用到了。

享元模式:String常量池, Integer 的静态内部类 IntegerCache。

策略模式:Cglib2AopProxy和JdkDynamicAopProxy分别代表两种策略的实现方式。

模板方法模式:JdbcTemplate实现了一系列常用的数据访问的算法骨架。

观察者模式: ApplicationListener, ContextLoaderListener等。

迭代器模式:集合。

责任链模式:handler,filter,Intercept。

命令模式:Tomcat 中命令模式在 Connector 和 Container 组件之间有体现。

备忘录模式:spring-webflow 中的stateManageableMessageContext.createMessageMemento()

状态模式:spring-statemachine spring状态机

访问者模式:Spring中的 BeanDefinitionVisitor 类主要用于访问 BeanDefinition。

中介者模式:Java web 开发中 MVC 模式(Model-View-Controller)就用到了中介者模式,Controller 就是 Model 和 View 的中介

解释器模式:在 Spring中,ExpressionParser 接口内部采用的是解释器模式。

四、Spring是如何解决循环依赖的?

三级缓存,简单来说,A创建过程中需要B,于是A将自己放到三级缓存里面,去实例化B。B实例化的时候发现需要A,于是B先查一级缓存,没有再查二级缓存,还是没有则再查三级缓存。找到了A然后把三级缓存里面的这个A放到二级缓存里面,并删除三级缓存里面的A,B顺利初始化完毕,将自己放到一级缓存里面(此时B里面的A依然是创建中状态)然后回来接着创建A,此时B已经创建结束,直接从一级缓存里面拿到B,然后完成创建,并将A放到一级缓存中。

注:一级缓存放的是成品对象,二级缓存放的是半成品对象,三级缓存放的是因AOP、getBean的lambda表达式。

五、Spring自动装配bean有哪些方式?

在 Spring 中,自动装配(autowiring)是指由 Spring 容器自动将符合条件的 bean 注入到其他 bean 中的过程。Spring 提供了以下几种自动装配方式:

1. 通过注解(Annotation-based):
@Autowired:这是 Spring 中最常用的自动装配注解,可以用在构造函数、方法、属性和参数上。默认情况下,它按照类型进行自动装配。如果存在多个符合条件的 bean,可以通过 @Qualifier 注解指定具体的 bean。

@Inject:这是一个来自 Java CDI(Contexts and Dependency Injection)规范的注解,用法与 @Autowired 类似。需要额外引入 javax.inject 依赖。

@Resource:这是一个来自 Java EE 的注解,可以指定 bean 的名称进行自动装配。如果没有指定名称,它会根据类型进行自动装配。

2. 通过 XML 配置(XML-based):
autowire="byName":通过属性名自动装配。如果 Spring 容器中存在一个与需要装配属性同名的 bean,则将其注入。

autowire="byType":通过类型自动装配。如果 Spring 容器中存在一个与需要装配属性相同类型的 bean,则将其注入。如果存在多个相同类型的 bean,将会抛出异常。

autowire="constructor":通过构造函数自动装配。会根据构造函数参数的类型,将容器中相应类型的 bean 注入。如果存在多个相同类型的 bean,将会抛出异常。

autowire="autodetect":自动检测自动装配方式。首先尝试通过构造函数自动装配,如果失败,则尝试通过类型自动装配。

尽管 XML 配置方式仍然可用,但现代的 Spring 应用程序通常更倾向于使用注解方式进行自动装配,因为它更简洁、灵活且易于维护。

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

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

相关文章

P1305 新二叉树题解

题目 输入一串二叉树,输出其前序遍历。 输入输出格式 输入格式 第一行为二叉树的节点数n。(1≤n≤26) 后面n行,每一个字母为节点,后两个字母分别为其左右儿子。特别地,数据保证第一行读入的节点必为根节点。空节点用*表示。 …

Java-常见面试题收集(一)

一 Java 基础 1 列举 Java 的 8 大基础类型,并写出对应的占用大小 数据类型占位(字节)数据范围byte1[ -128 , 127 ]short2[ -32768 , 32767 ]int4[ -231 , -231 - 1 ] ≈ [-21 亿,21 亿]long8[ -263 , -263-1 ]float4[-3.4x1038 , ~ 3.4x1038]double8[…

Java的堆如何分代的?

前言: java对象一般都是朝生夕死,也有部分对象是一直存在的。两种对象如何都放在一起,进行垃圾回收的时候效率较低。所以通过将不同时期的对象放在不同的内存池中,节省垃圾回收的时间,提高性能。 组成: 新生…

HUAWEI华为MateBook D 14 2022款 12代酷睿版集显(NbF-16)工厂模式原厂Windows11预装OEM系统,含F10智能还原功能

系统下载链接:https://pan.baidu.com/s/1kgJvwSq5eOdme7J9PDXIxQ?pwdxvz8 提取码:xvz8 华为笔记本电脑原装出厂系统工厂安装包,含F10功能、系统自带所有驱动、系统属性专属联机支持标志、Office办公软件、华为电脑管家等预装程序&#xf…

刷怪日记-01背包理论问题(二维矩阵实现)

01背包理论问题(二维矩阵实现) 题目 解题思路 确定dp数组以及下标的含义 本题采用二维数组进行解题,那么dp[i] [j]表示从下标0-i的物品任意选择,放进容量为j背包,价值总合最大是多少 i 表示物品第几个物品,j 表示背包容量大小 …

Spring MVC PathPatternMatchableHandlerMapping原理解析

在Spring MVC框架中,路由机制是实现HTTP请求到具体处理器方法映射的核心。PathPatternMatchableHandlerMapping是Spring 5之后引入的一个新特性,它基于PathPattern来提供更为灵活和强大的URL路径匹配能力。与传统的RequestMappingHandlerMapping相比&…

ORACLE 如何使用dblink实现跨库访问

dbLink是简称,全称是databaselink。database link是定义一个数据库到另一个数据库的路径的对象,database link允许你查询远程表及执行远程程序。在任何分布式环境里,database都是必要的。另外要注意的是database link是单向的连接。在创建dat…

LeetCode刷题---填充每个节点的下一个右侧节点指针 II

题解:LeetCode题解 解题思想: 通过创建辅助指针来解决该问题 当当前节点cur不为空的时候,创建辅助节点dummy,使其一直作为每一层的第一个节点的前一个节点。 创建辅助指针pre,pre初始指向dummy,之后通过pre来填充当前层…

2.2 评估方法 机器学习

我们若有一个包含m个样例的数据集,若我们既需要训练,也需要测试,我们该如何处理呢?下面是几种方法: 2.2.1 留出法 “留出法”直接将数据集D划分为两个互斥的集合,其中一个作为训练集S,另一个作…

双指针算法(1)

目录 283.移动零 一、题目描述 二、思路解析 三、代码 1089.复写零 一、题目描述 二、思路解析 三、代码 202.快乐数 一、题目描述 二、思路解析 三、代码 11.盛水最多的容器 一、题目描述 二、思路解析 三、代码 283.移动零 一、题目描述 OJ题目链接&#xf…

Linux升级openssl

运行acme.sh更新SSL证书时出现报错:Register account Error 具体错误为: Register account Error: {"type":"urn:ietf:params:acme:error:malformed","status":400,"detail":"[External Account Binding]…

python基于django的药品进销存管理系统elsb2

本系统是通过面向对象的python语言搭建系统框架,通过关系型数据库MySQL存储数据。使用django框架进行药店药品的信息管理,用户只需要通过浏览器访问系统即可获取药店药品信息,并可以在线管理,实现了信息的科学管理与查询统计。本文…

OpenAI 大声朗读出来

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

【MySQL】not in遇上null的坑

今天遇到一个问题: 1、当 in 内的字段包含 null 的时候,正常过滤; 2、当 not in 内的字段包含 null 的时候,不能正常过滤,即使满足条件,最终结果也为 空。 测试如下: select * from emp e;当…

2024全国水科技大会之国际合作与新技术、新产品推介会

召集人:中华环保联合会水环境治理专委会 此论坛主要为筛选新技术、新产品,入选企业后续可参与到我会7月的国际考察中,可为企业推荐国际项目合作! 一、会议背景 为积极应对“十四五”期间我国生态环境治理面临的挑战,加…

剑指offer面试题27 二叉搜索树与双向链表

考察点 树的遍历,双向链表知识点 题目 分析 题目要求把一颗二叉搜索树转换成排序的双向链表,二叉搜索树和双向链表一样都有2个指针,唯一的区别就是对于树来说一个结点具有左子树右子树,对于双向链表来说是直接前驱和直接后驱。…

【nodejs】“__dirname is not defined”错误修复

▒ 目录 ▒ 🛫 问题描述环境 1️⃣ 原理CommonJS vs ESM错误原因 2️⃣ 禁用 ESM 模式并改用 CommonJS方案一:项目方案二:单文件 3️⃣ 在 ESM 模式下自实现__dirname📖 参考资料 🛫 问题 描述 从网上找了一份代码&am…

x86 Ubuntu上编译eudev给龙芯loongarch64架构主机使用

1、下载eudev库eudev-master.zip,链接:eudev库官方地址 2、下载龙芯的交叉编译工具:loongson-gnu-toolchain-8.3-x86_64-loongarch64-linux-gnu-rc1.2.tar.xz,链接:龙芯交叉编译官方地址 3、交叉编译器环境搭建 (1)、…

.bat文件与python

.bat文件通常使用文本编辑器(如记事本)来创建和编辑。你只需要在文本文件中编写一系列命令和指令,然后将文件保存为.bat扩展名即可。这样,Windows操作系统就可以识别它为批处理脚本文件。 .bat文件是由Windows操作系统识别的批处理…

InfluxDB SHOW SERIES语句按照什么顺序返回?

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。 文章目录 引言样例SHOW SERIES比较原理结论结束语 引言 influxdb的计算引擎为了做到自底而上的…