当前位置: 首页 > news >正文

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 应用程序通常更倾向于使用注解方式进行自动装配,因为它更简洁、灵活且易于维护。

相关文章:

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多坐席的日常外呼任务&#xff0c;随着公司业务规模不断增长&#xff0c;业务复杂度不断提升&#xff0c;营销模式需要多样化&#xff0c;营销流程需要更加灵活。为了更好地赋能业务、提高客户转化率&#xff0c;电销平台不断升级优化&#…...

轻薄蓝牙工牌室内人员定位应用

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

好物周刊#46:在线工具箱

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

20240306-1-大数据的几个面试题目

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

Vue中如何处理用户权限?

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

【STM32】HAL库 CubeMX教程---基本定时器 定时

目录 一、基本定时器的作用 二、常用型号的TIM时钟频率 三、CubeMX配置 四、编写执行代码 实验目标&#xff1a; 通过CUbeMXHAL&#xff0c;配置TIM6&#xff0c;1s中断一次&#xff0c;闪烁LED。 一、基本定时器的作用 基本定时器&#xff0c;主要用于实现定时和计数功能…...

2024年最新整理腾讯云学生服务器价格、续费和购买流程

2024年腾讯云学生服务器优惠活动「云校园」&#xff0c;学生服务器优惠价格&#xff1a;轻量应用服务器2核2G学生价30元3个月、58元6个月、112元一年&#xff0c;轻量应用服务器4核8G配置191.1元3个月、352.8元6个月、646.8元一年&#xff0c;CVM云服务器2核4G配置842.4元一年&…...

【QT】重载的信号槽/槽函数做lambda表达式

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

C++之类(一)

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

【工具类】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…...

【目标分类图像增强方法】

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

游戏盾如何应对微商城网站DDoS攻击

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

安卓手机如何使用JuiceSSH实现公网远程连接本地Linux服务器

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

钉钉群内自定义机器人发送消息功能实现

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

网站维护3年15000元,贵不贵?市场价多少

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

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

Python常用模块:time、os、shutil与flask初探

一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...

海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》

近日&#xff0c;嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》&#xff0c;海云安高敏捷信创白盒&#xff08;SCAP&#xff09;成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天&#xff0c;网络安全已成为企业生存与发展的核心基石&#xff0c;为了解…...