Java开发工程师面试题(Spring)
一、Spring Bean的生命周期
生命周期可以分为以下几步:
- 通过Spring框架的beanFactory工厂利用反射机制创建bean对象。
- 根据set方法或者有参构造方法给bean对象的属性进行依赖注入。
- 判断当前bean对象是否实现相关aware接口,诸如beanNameAware、beanFactoryAware接口,如果有的话执行对应的方法。
- 执行bean对象的前置处理器postprocessbeforinitialztion。
- 执行初始化方法initMethod。
- 执行bean对象的后置处理器postprocessafterinitialztion。
- 判断当前bean对象是否为单例,是则放到spring对象容器中,多例则直接返回bean对象。
- 使用bean对象
- 关闭容器,调用destroy方法销毁对象。
二、Spring事务在以下几种情况下会失效。
- 直接new出来的对象添加事务不起作用,因为只有Spring定义的bean才接受事务。
- 由于MySQL的引擎用Myisam不支持事务,所以如果使用MySQL的Myisam引擎的话,事务不起作用。
- 如果@Transaction注解到非public方法上,事务不起作用,这是因为Spring的Aop特性。
- 如果在当前类中进行内部调用方法,比如在A类中有a方法和b方法,a方法没有加@Transation, b方法加了@Transation,在方法a中调用方法b,方法b中的事务也不会生效。这是因为Spring在扫描bean的时候会自动为标注了@Transaction注解类生成一个代理类,在有注解方法被调用时,实际是代理类调用的,代理类在调用之前会开启事务,执行事务操作。但是同类中的方法相互调用,相当于this.b(),此时的b方法并非代理类调用,而是直接通过原有的bean直接调用,所以注解不起作用。
- 开启的线程中。
- 被final注释
- 异常类型错误,如果抛出的runtimeException事务才会回滚。
- 如果异常被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 应用程序通常更倾向于使用注解方式进行自动装配,因为它更简洁、灵活且易于维护。
相关文章:

Java开发工程师面试题(Spring)
一、Spring Bean的生命周期 生命周期可以分为以下几步: 通过Spring框架的beanFactory工厂利用反射机制创建bean对象。根据set方法或者有参构造方法给bean对象的属性进行依赖注入。判断当前bean对象是否实现相关aware接口,诸如beanNameAware、beanFactor…...

【C++】string类的基础操作
💗个人主页💗 ⭐个人专栏——C学习⭐ 💫点击关注🤩一起学习C语言💯💫 目录 导读 1. 基本概述 2. string类对象的常见构造 3. string类对象的容量操作 4. string类对象的访问及遍历操作 5. 迭代器 6.…...

Java项目:40 springboot月度员工绩效考核管理系统009
作者主页:源码空间codegym 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本系统的功能分为管理员和员工两个角色 管理员的功能有: (1)个人中心管理功能,添加管理员账号…...

opengl 学习(三)-----着色器
着色器 分类demo效果解析教程 分类 OPengl C demo #include "glad/glad.h" #include "glfw3.h" #include <iostream> #include <cmath> #include <vector>#include <string> #include <fstream> #include <sstream>…...

电销平台架构的演变与升级
简介 信也科技电销平台承载了公司400多坐席的日常外呼任务,随着公司业务规模不断增长,业务复杂度不断提升,营销模式需要多样化,营销流程需要更加灵活。为了更好地赋能业务、提高客户转化率,电销平台不断升级优化&#…...

轻薄蓝牙工牌室内人员定位应用
在现代化企业管理的背景下,轻薄蓝牙工牌人员定位应用逐渐崭露头角,成为提升企业效率和安全性的重要工具。本文将从轻薄蓝牙工牌的定义、特点、应用场景以及未来发展趋势等方面,对其进行全面深入的探讨。 一、轻薄蓝牙工牌的定义与特点 轻薄…...

好物周刊#46:在线工具箱
https://github.com/cunyu1943 村雨遥的好物周刊,记录每周看到的有价值的信息,主要针对计算机领域,每周五发布。 一、项目 1. twelvet 一款基于 Spring Cloud Alibaba 的权限管理系统,集成市面上流行库,可以作用为快…...

20240306-1-大数据的几个面试题目
面试题目 1. 相同URL 题目: 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url? 方案1:估计每个文件的大小为50G64320G,远远大于内存限制的4G。所以…...

Vue中如何处理用户权限?
在前端开发中,处理用户权限是非常重要的一个方面。Vue作为一种流行的前端框架,提供了很多便捷的方式来管理用户权限。本文将介绍一些Vue中处理用户权限的方法 1. 使用路由守卫 Vue Router提供了一个功能强大的功能,即导航守卫(N…...

【STM32】HAL库 CubeMX教程---基本定时器 定时
目录 一、基本定时器的作用 二、常用型号的TIM时钟频率 三、CubeMX配置 四、编写执行代码 实验目标: 通过CUbeMXHAL,配置TIM6,1s中断一次,闪烁LED。 一、基本定时器的作用 基本定时器,主要用于实现定时和计数功能…...

2024年最新整理腾讯云学生服务器价格、续费和购买流程
2024年腾讯云学生服务器优惠活动「云校园」,学生服务器优惠价格:轻量应用服务器2核2G学生价30元3个月、58元6个月、112元一年,轻量应用服务器4核8G配置191.1元3个月、352.8元6个月、646.8元一年,CVM云服务器2核4G配置842.4元一年&…...

【QT】重载的信号槽/槽函数做lambda表达式
重载的信号槽 函数指针: int fun(int a,long b) int (*funp)(int, long) fun; 实现回调函数就需要函数指针 信号重载 派生类槽函数发送两个信号 派生类给父类发两个信号 void (SubWidget::*mysigsub)() &SubWidget::sigSub;connect(&subw,mysigsub,t…...

C++之类(一)
1,封装 1.1 封装的引用 封装是C面向对象三大特性之一 封装的意义: 将属性和行为作为一个整体,表现生活中的事物 将属性和行为加以权限控制 1.1.1 封装意义一: 在设计类的时候,属性和行为写在一起,表…...

【工具类】repo是什么,repo常用命令,repo和git和git-repo的关系
1. repo 1. repo 1.1. repo是什么1.2. 安装1.3. repo 命令 1.3.1. repo help1.3.2. repo init1.3.3. repo sync1.3.4. repo upload1.3.5. repo start1.3.6. repo forall 1.4. mainfest 文件1.5. git-repo简介(非android repo)1.6. 参考资料 1.1. repo是什么 Repo 是一个 go…...

Java中可以实现的定时任务策略
Java中可以实现的定时任务策略 文章目录 Java中可以实现的定时任务策略自定义独立线程JDK提供的调度线程池-**ScheduledExecutorService**内核是Spring的Task执行调度quartz调度 #mermaid-svg-mQ9rPqk0Ds3ULnvD {font-family:"trebuchet ms",verdana,arial,sans-seri…...

【目标分类图像增强方法】
图像增强方法及其原理 目标分类图像增强是一种用于提高深度学习模型泛化能力的技术,通过在训练过程中对原始图像进行各种变换来增加模型所见数据的多样性。以下是几种常见的图像增强方法及其原理: 几何变换: 旋转(Rotation&#…...

游戏盾如何应对微商城网站DDoS攻击
游戏盾如何应对微商城网站DDoS攻击?随着电子商务的快速发展,微商城网站已成为众多商家开展在线业务的重要平台。然而,与此同时,网络安全威胁也愈发严重。其中,分布式拒绝服务(DDoS)攻击是一种常…...

安卓手机如何使用JuiceSSH实现公网远程连接本地Linux服务器
文章目录 1. Linux安装cpolar2. 创建公网SSH连接地址3. JuiceSSH公网远程连接4. 固定连接SSH公网地址5. SSH固定地址连接测试 处于内网的虚拟机如何被外网访问呢?如何手机就能访问虚拟机呢? cpolarJuiceSSH 实现手机端远程连接Linux虚拟机(内网穿透,手机端连接Linux虚拟机) …...

钉钉群内自定义机器人发送消息功能实现
文章目录 钉钉群内自定义机器人发送消息功能实现1、设置webhook自定义机器人2、查看官方文档,使用open api3、编写业务代码4、发送成功结果如下 钉钉群内自定义机器人发送消息功能实现 1、设置webhook自定义机器人 设置关键词 添加完成后,获得改机器人的…...

网站维护3年15000元,贵不贵?市场价多少
一般来说,给公司做好网站上线之后,网站就进入了运维期间,某功力公司给客户收费3年15000元网站运维费用,到底高不高呢? 首先,来看看网站运维都有哪些项目 网站运维涉及多个项目和任务,包括但不限…...

ROS 2基础概念#5:执行器(Executor)| ROS 2学习笔记
在ROS 2中,Executor是一个核心概念,负责管理节点(Node)中的回调函数,如订阅消息的回调、服务请求的回调、定时器回调等。Executor决定了何时以及如何执行这些回调,从而在ROS 2系统中实现异步编程。 ROS 2 …...

Unity 动画(旧版-新版)
旧版 旧版-动画组件:Animation 窗口-动画 动画文件后缀: .anim 将制作后的动画拖动到Animation组件上 旧版的操作 using System.Collections; using System.Collections.Generic; using UnityEngine;public class c1 : MonoBehaviour {// Start is called before…...

Linux和Windows操作系统线程调度策略
本文介绍Linux和Windows操作系统线程调度策略。 不同的操作系统具有不同的线程调度策略,本文针对常见的操作系统(Linux和Windows操作系统)对其线程调度策略作简要说明,并不对其内在运行机制作详细介绍。 1.Linux操作系统线程调度…...

[OpenWrt 22.03] ttylogin添加登录密码与禁止登录的配置
ttylogin 的使用 Openwrt 串口默认是没有密码的。Openwrt启动后,一个默认的密码将被启用去保护ssh登录和页面(http)登录,而串口登录密码却是空缺的。 对于 Openwrt,当内核初始化后,就会启动第一个进程 init,init进程会进行一系列的系统初始化工作,然后会读取 /etc/in…...

RK3568平台 USB数据包的收发格式
一.USB硬件拓扑结构 compound device :多个设备组合起来,通过HUB跟Host相连composite device :一个物理设备有多个逻辑设备(multiple interfaces) 在软件开发过程中,我们可以忽略Hub的存在,硬件拓扑图简化如下&#x…...

Day 8.TCP通信
TCP通信 TCP发端: socket connect send recv close TCP收端: socket bind listen accept send recv close 1.connect int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); 功能:发…...

小游戏加固方案已全面适配微信、QQ、抖音、快手、美团、华为、支付宝渠道
2023年,国内移动游戏收入与游戏用户规模双双创下历史新高。其中小游戏异军突起,市场规模达到200亿元,同比增长300%,成了万众瞩目的行业新风口。 小游戏的高速发展带来了更多的活力,产出了多款月流水过亿的热门游戏。行…...

粉色ui微信小程序源码/背景图/头像/壁纸小程序源码带流量主
云开发版粉色UI微信小程序源码,背景图、头像、壁纸小程序源码,带流量主功能。 云开发小程序源码无需服务器和域名即可搭建小程序另外还带有流量主功能噢!微信平台注册小程序就可以了。 这套粉色UI非常的好看,里面保护有背景图、…...

chrome选项页面options page配置
options 页面用以定制Chrome浏览器扩展程序的运行参数。 通过Chrome 浏览器的“工具 ->更多工具->扩展程序”,打开chrome://extensions页面,可以看到有的Google Chrome扩展程序有“选项Options”链接,如下图所示。单击“选项Options”…...

迭代器失效问题(C++)
迭代器失效就是迭代器指向的位置已经不是原来的含义了,或者是指向的位置是非法的。以下是失效的几种情况: 删除元素: 此处发生了迭代器的失效,因为erase返回的是下一个元素的位置的迭代器,所以在删除1这个元素的时候&…...