SSM与SpringBoot面试题总结

  • 什么是spring?谈谈你对IOC和AOP的理解。

Spring:是一个企业级java应用框架,他的作用主要是简化软件的开发以及配置过程,简化项目部署环境。

Spring的优点:

1、Spring低侵入设计,对业务代码的污染非常低。

2、Spring的DI机制将对象之间的关系交由框架处理,减少组件的耦合。

3、Spring提供了AOP技术,支持将一些通用的功能进行集中式管理,从而提供更好的复用。

4、Spring对于主流框架提供了非常好的支持。

IOC就是控制反转,指创建对象的控制权转移给Spring来进行管理。简单来说,就是应用不用去new对象了,而全部交由 Spring自动生产。

IOC有三种注入方式:1、构造器注入2、setter方法注入3、根据注解注入。

AOP 面向切面。用于将那些与业务无关,但却对多个对象产生影响的公共行为。抽取并封装成一个可重用的模块。AOP的核心就是动态代理。JDK的动态代理和 CGLIB动态代理。

  • 什么是bean的自动装配,有哪些方式?

开启自动装配,只需要在xml配置文件<bean>中定义“autowire"属性。

<bean id="cutomer"c1ass="com.xxx.xxx.Customer" autowire=""/>

autowire属性有五种装配的方式:

·no-缺省情况下,自动配置是通过“ref”属性手动设定

手动装配:以value或ref的方式明确指定属性值都是手动装配。

需要通过‘ref'属性来连接bean。

·byName-根据bean的属性名称进行自动装配。

Cutomer的属性名称是person,Spring会将bean id为person的bean通过setter方法进行自动装配。

<bean id="cutomer"c1ass="com.xxx.xxx.Cutomer" autowire="byName"/>

<bean id="person" c1ass="com.xxx.xxx.Person"/>

·byType-根据bean的类型进行自动装配。

Cutomer的属性person的类型为Person,Spirng会将Person类型通过setter方法进行自动装配。

<bean id="cutomer" class="com.xxx.xxx.Cutomer" autowire="byType"/>

<bean id="person" class="com.xxx.xxx.Person"/>

.constructor-类似byType,不过是应用于构造器的参数。如果一个bean与构造器参数的类型形同,则进行自动装配,否则导致异常。

Cutomer构造函数的参数person的类型为Person,Spirng会将Person类型通过构造方法进行自动装配。

<bean id="cutomer"class="com.xxx.xxx.Cutomer"autowire="construtor"/>

<bean id="person" c1ass="com.xxx.xxx.Persc

autodetect-如果有默认的构造器,则通过constructor方式进行自动装配,否则使用byType方式进行自动装配。

如果有默认的构造器,则通过constructor方式进行自动装配,否则使用byType方式进行自动装配。

@Autowired自动装配bean,可以在字段、setter方法、构造函数上使用。

  • 如何理解Spring Boot中的Starter

使用spring+springmvc使用,如果需要引入mybatis等框架,需要到xml中定义mybatis需要的bean

starter就是定义一个starter的jar包,写一个@Configuration配置类、将这些bean定义在里面,然后在starte包的META-INFspring.factories中写入该配置类,springboot会按照约定来加载该配置类

开发人员只需要将相应的starter包依赖进应用,进行相应的属性配置(使用默认配置时,不需要配置),就可以直接进行代码开发,使用对应的功能了,比如mybatis-spring-boot--starter, spring-boot-starter-redis

  • 如何实现一个IOC容器

1、配置文件配置包扫描路径

2、递归包扫描获取.class文件

3、反射、确定需要交给IOC管理的类

4、对需要注入的类进行依赖注入

  1. ·配置文件中指定需要扫描的包路径
  2. ·定义一些注解,分别表示访问控制层、业务服务层、数据持久层、依赖注入注解、获取配置文件注解
  3. ·从配置文件中获取需要扫描的包路径,获取到当前路径下的文件信息及文件夹信息,我们将当前路径下所有以.class结尾的文件添加到一个Set集合中进行存储
  4. ·遍历这个set集合,获取在类上有指定注解的类,并将其交给IOC容器,定义一个安全的Map用来存储这些对象
  5. ·遍历这个IOC容器,获取到每一个类的实例,判断里面是有有依赖其他的类的实例,然后进行递归注入

  • 京东一面:Spring中bean是线程安全的吗?

Spring本身并没有针对bean做线程安全的处理,所以:

  1. 如果bean是无状态的,那么bean是线程安全的。
  2. 如果bean是有状态的,则bean不是线程安全的。

另外,bean是不是线程安全,跟bean的作用域没有关系,bean的作用域只是表示bean的生命周期的范围,对于任何生命周期的bean都是一个对象,这个对象是不是线程安全的,还是得看这个bean对象本身。

  • 谈谈你对IOC的理解

容器概念、控制反转、依赖注入

ioc容器:实际上就是个map (key,value),里面存的是各种对象(在xml里配置的bean节点、@repository、@service、@controller、@component),在项目启动的时候会读取配置文件里面的bean节点,根据全限定类名使用反射创建对象放到map里、扫描到打上上述注解的类还是通过反射创建对象放到map里。

这个时候map里就有各种对象了,接下来我们在代码里需要用到里面的对象时,再通过DI注入(autowired、resource等注解,xml里bean节点内的ref属性,项目启动的时候会读取xml节点ref属性根据id注入,也会扫描这些注解,根据类型或id注入;id就是对象名)。

控制反转:

没有引入IOC容器之前,对象A依赖于对象B,那么对象A在初始化或者运行到某一点的时候,自己必须主动去创建对象B或者使用已经创建的对象B。无论是创建还是使用对象B,控制权都在自己手上。

引入IOC容器之后,对象A与对象B之间失去了直接联系,当对象A运行到需要对象B的时候,IOC容器会主动创建一个对象B注入到对象A需要的地方。

通过前后的对比,不难看出来:对象A获得依赖对象B的过程,由主动行为变为了被动行为,控制权颠倒过来了,这就是“控制反转”这个名称的由来。

全部对象的控制权全部上交给"第三方”IOC容器,所以,IOC容器成了整个系统的关键核心,它起到了一种类似”粘合剂”的作用,把系统中的所有对象粘合在一起发挥作用,如果没有这个“粘合剂”,对象与对象之间会彼此失去联系,这就是有人把IOC容器比喻成"粘合剂”的由来。

依赖注入:

“获得依赖对象的过程被反转了”。控制被反转之后,获得依赖对象的过程由自身管理变为了由IOC容器主动注入。依赖注入是实现IOC的方法,就是由IOC容易在运行期间,动态地将某种依赖关系注入到对象之中。

  • 阿里一面:介绍一下Spring,读过源码介绍一下大致流程

1.Spring是一个快速开发框架,Spring帮助程序员来管理对象

2.Spring的源码实现的是非常优秀的,设计模式的应用、并发安全的实现、面向接口的设计等

3.在创建Spring容器,也就是启动Spring时:

a.首先会进行扫描,扫描得到所有的BeanDefinition对象,并存在一个Map中

b.然后筛选出非懒加载的单例BeanDefinition进行创建Bean,对于多例Bean不需要在启动过程中去进行创建,对于多例Bean会在每次获取Bean时利用BeanDefinition去创建

c.利用BeanDefinition创建Bean就是Bean的创建生命周期,这期间包括了合并BeanDefinition、推断构造方法、实例化、属性填充、初始化前、初始化、初始化后等步骤,其中AOP就是发生在初始化后这一步骤中

4.单例Bean创建完了之后,Spring会发布一个容器启动事件

5.Spring启动结束

6.在源码中会更复杂,比如源码中会提供一些模板方法,让子类来实现,比如源码中还涉及到一些BeanFactoryPostProcessor和BeanPostProcessor的注册,Spring的扫描就是通过BenaFactoryPostProcessor来实现的,依赖注入就是通过BeanPostProcessor来实现的

7.在Spring启动过程中还会去处理@lmport等注解

  • 描述一下Srping Bean的生命周期

  1. 解析类得到BeanDefinition
  2. 如果有多个构造方法,则要推断构造方法
  3. 确定好构造方法后,进行实例化得到一个对象
  4. 对对象中的加了@Autowired注解的属性进行属性赋值
  5. 回调Aware方法,比如BeanNameAware、BeanFactoryAware
  6. 调用BeanPostProcessor的初始化前的方法
  7. 调用初始化方法
  8. 调用BeanPostProcesspr的初始化后的方法,在这里进行AOP
  9. 如果当前创建的bean是单例的则会把bean放入单例池
  10. 使用bean
  11. Spring容器关闭时调用DisposableBean中destory()方法

  • 京东二面:Spring用到了哪些设计模式

  • 谈谈你对AOP的理解

系统是由许多不同的组件所组成的,每一个组件各负责一块特定功能。除了实现自身核心功能之外,这些组件还经常承担着额外的职责。例如日志、事务管理和安全这样的核心服务经常融入到自身具有核心业务逻辑的组件中去。这些系统服务经常被称为横切关注点,因为它们会跨越系统的多个组件。

当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。

日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。

在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。

AOP:将程序中的交叉业务逻辑(比如安全,日志,事务等),封装成一个切面,然后注入到目标对象(具体业务逻辑)中去。AOP可以对某个对象或某些对象的功能进行增强,比如对象中的方法进行增强,可以在执行某个方法之前额外的做一些事情,在某个方法执行之后额外的做一些事情

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

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

相关文章

scala编码

1、Scala高级语言 Scala简介 Scala是一门类Java的多范式语言&#xff0c;它整合了面向对象编程和函数式编程的最佳特性。具体来讲Scala运行于Java虚拟机&#xff08;JVM)之上&#xff0c;井且兼容现有的Java程序&#xff0c;同样具有跨平台、可移植性好、方便的垃圾回收等特性…

JavaWeb三大组件(Servlet程序、Filter过滤器、Listener监听器)

文章目录 一、Servlet1、Servlet概述和运行流程2、开发过程&#xff08;xml和注解方式&#xff09;3、Servlet生命周期4、Servlet继承结构4.1、Servlet规范接口4.2、ServletConfig配置接口4.3、GenericServlet抽象类4.4、HttpServlet抽象类 5、ServletConfig和ServletContext6、…

解决高风险代码:Header Manipulation

Abstract HTTP 响应头文件中包含未验证的数据会引发 cache-poisoning、 cross-site scripting、 cross-user defacement、 page hijacking、 cookie manipulation 或 open redirect Explanation 以下情况中会出现 Header Manipulation 漏洞&#xff1a; 1. 数据通过一个不可信…

《opencv实用探索·十七》calcBackProject直方图反向投影

在了解反向投影前需要先了解下直方图的概念&#xff0c;可以看我上一章内容&#xff1a;opencv直方图计算calcHist函数解析 直方图反向投影是一种图像处理技术&#xff0c;通常用于目标检测和跟踪。通过计算反向投影&#xff0c;可以将图像中与给定模式&#xff08;目标对象&a…

Next.js中的App Router与Page Router,各自的作用和使用方式,如何理解和配置使用?

App Router介绍 Next.js中的App Router是全局的路由器&#xff0c;它用于在应用程序的所有页面之间进行导航。它可以用于在页面之间传递状态和数据&#xff0c;类似于React中的Context。 App Router是通过_app.js文件中的getInitialProps方法来配置的。 在 Next.js 中&#xf…

“产学研用”深度融合,校企合作助力烟花产业数字化发展

为推动烟花行业数字化转型升级&#xff0c;充分发挥科教资源优势&#xff0c;技术成果及创新资源&#xff0c;推动构建产学研用高效协同&#xff0c;加快提升烟花产业创新能力&#xff0c;助力企业在国内外复杂的市场环境下提升发展能力及竞争能力。12月6日&#xff0c;烟花生产…

机器学习-KL散度的直观理解+代码

KL散度 直观理解&#xff1a;KL散度是一种衡量两个分布之间匹配程度的方法。通常在概率和统计中&#xff0c;我们会用更简单的近似分布来代替观察到的数据或复杂的分布&#xff0c;KL散度帮我们衡量在选择近似值时损失了多少信息。 在信息论或概率论中&#xff0c;KL散度&#…

Python实战 | 如何抓取腾讯视频

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 爬虫: 作用: 批量采集数据 / 模拟用户行为 原理: 模拟成 客户端 向 服务器 发送网络请求 环境介绍: python 3.8 解释器 pycharm 编辑器 第三方模块: reques…

鸿蒙Stage模型开发—创建你的第一个ArkTS应用

Stage模型开发概述 基本概念 下图展示了Stage模型中的基本概念。 图1 Stage模型概念图 UIAbility组件和ExtensionAbility组件 Stage模型提供UIAbility和ExtensionAbility两种类型的组件&#xff0c;这两种组件都有具体的类承载&#xff0c;支持面向对象的开发方式。UIAbility…

数字化转型:无形资产占比测算数据集(2007-2022年)

参考张永珅老师的做法&#xff0c;利用无形资产占比测算数字化转型程度。希望对大家有所帮助 一、数据介绍 数据名称&#xff1a;数字化转型&#xff1a;无形资产占比 数据年份&#xff1a;2007-2022年 样本数量&#xff1a;37649条 数据说明&#xff1a;包括数字化资产明细…

漏洞复现-某友UFIDA NC系统某接口未授权访问漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

玩家不爱打丧尸后,游戏策划们卷起了编鬼故事

​全球毁灭&#xff0c;病毒入侵。躲避丧尸&#xff0c;收集物资&#xff0c;打造专属的避难所&#xff0c;一步步在混乱的末世中生存下来。 作为开放世界游戏里最经典的赛道&#xff0c;末日题材时至今日仍旧饱受广大玩家的喜爱。玩家在生存压力的刺激下&#xff0c;想方设法…

创建第一个Vue2项目-----HelloWorld

创建第一个Vue项目 第一步先去安装Vue&#xff0c;一共有两种安装方式&#xff0c;这里使用 点击这里下载&#xff1a;Vue.js 添加到自己的项目中 在使用的页面引入<script src"../js/vue.js"></script> 2. 准备好一个容器 <div id"root&qu…

自定义Taro的navBar 组件

由于业务特定&#xff0c;头部的内容会不大相同 下面是自定义的navBar 组件 首先在index.config.ts 文件中 将navigationStyle设置‘custom’&#xff0c;这样头部自带的内容就不会存在 &#xff0c;自定义navBar 这里自定义了一个计算不同设备头部胶囊的高度hook-useCustomNa…

资深测试总结,性能测试目的如何做?主要看什么指标?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、性能测试是什么…

Windows安装Tesseract OCR与Python中使用pytesseract进行文字识别

文章目录 前言一、下载并安装Tesseract OCR二、配置环境变量三、Python中安装使用pytesseract总结 前言 Tesseract OCR是一个开源OCR&#xff08;Optical Character Recognition&#xff09;引擎&#xff0c;用于从图像中提取文本。Pytesseract是Tesseract OCR的Python封装&am…

物联网终端设备众多,为何遥测终端机备受瞩目?

遥测终端机是一种用于数据采集、远程传输、数据存储与处理的综合体设备&#xff0c;已逐渐成为现代智能物联领域的焦点。遥测终端机集成了多种传感器与通信模块&#xff0c;能够实时采集各种环境参数&#xff0c;如温度、湿度、压力、流量等&#xff0c;同时支持无线通信&#…

9.9万做直升机产权项目合伙人 | 新机遇,共享千亿财富

你曾想过能开直升机&#xff1f;甚至想拥有一架直升机&#xff1f;那种飞跃人生的心境&#xff0c;翱翔蓝天白云。可面临居多疑问&#xff0c;比如&#xff1a;学开直升机需要怎样的条件&#xff08;年龄、学历、费用、学习内容及周期等&#xff09;?到哪里学/买直升机比较安全…

高通平台开发系列讲解(USB篇)MBIM 调试记录

文章目录 一、MBIM网卡显示二、未插入SIM卡情况显示三、SIM 无服务四、正常五、抓取QXDM log 分析沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本文主要介绍MBIM网卡调试过程的记录。 一、MBIM网卡显示 若显示黄标,则检查mbimd进程是否正常,mbim驱动是否正常。 二…

【深度学习】注意力机制(四)

本文介绍一些注意力机制的实现&#xff0c;包括VIP/CoAtNet/Scaling Local Self-Attention/PSA/CoT。 【深度学习】注意力机制&#xff08;一&#xff09; 【深度学习】注意力机制&#xff08;二&#xff09; 【深度学习】注意力机制&#xff08;三&#xff09; 【深度学习…