「Java面试题」 含泪整体Spring面试题大全
nanshan 2024-11-24 19:36 26 浏览 0 评论
spring面试题
1、什么是Spring框架?
spring是分层 的全栈轻量级开源框架,以Ioc和Aop为核心思想,提供了展现层Springmvc和业务层事务管理器等众多企业级应用技术,还能整合开源世界众多著名三方框架和类库的java开源框架。
2、列举一些重要的Spring模块?
Spring是一个分层非常清晰并且依赖关系、职责定位非常明确的轻量级框架。
主要包括这几大模块:数据处理模块,Web模块,Aop/Aspect模块,Core Container模块和Test模块。
3、谈谈自己对Spring Ioc和Aop的理解?
1)、Ioc的理解
Ioc叫做控制反转,它是一个技术思想,不是一个技术实现。
描述了java开发领域对象的创建和管理的问题
为什么叫控制反转?控制指的是对象的创建和管理的权利,反转指的是控制的权利交给了外部环境(SpringIoc)。
Ioc和DI描述的是同一个事情(对象实例化和依赖关系维护),只不过角度不一样罢了。
Ioc是站在对象的角度,对象实例化和依赖维护的权利交给了(反转)容器。
DI是站在容器的角度,容器会把对象的依赖的其他对象注入。
2)、Aop的理解
Aop叫做面向切面编程,Aop是OOP的延续。OOP使用封装、继承和多台解决了大多数的代码重复问题。
但有些情况处理不了(顶级父类中的多个方法出现相同的代码,称为横切逻辑相同)。
AOP为独辟蹊径日出抽取机制,在不改变原有逻辑情况下,增强代码逻辑,从根本上上解耦。
为什么叫做面向切面编程?切:指横切逻辑,面:横切逻辑一般影响多个方法,每个方法如同一个点,多个点构成面。
4、Spring Aop和AspectJ Aop有什么区别?
SpringAop是运行时增强,是基于代理实现的,AspectJ是编译时增强,是基于字节码操作。
5、Spring中的bean的作用域有哪些?
单例:singleton
多例:prototype
reuqest:一次request内有效
Session:同一个session有效
global-session:全局session,spring5中已废弃
6、Spring中的单例bean的线程安全问题了解吗?
单例Bean存在线程安全问题,多线程操作同一个单例的成员变量进行写操作时存在线程安全问题。
解决:使用将成员变量定义在ThreadLocal中。
7、Spring框架中用到了哪些设计模式?
工厂模式:通过BeanFactory和ApplicationContext创建bean对象
代理模式:SpringAop和事务管理
单例模式:Spring中的Bean默认时单例
模板方法:jdbcTemplate等
观察者模式:Spring事件驱动模型就是观察者模式
适配器模式:多种数据库连接使用适配器,SpringMVC使用处理器适配器去获取对应的具体处理器。
8、@Component和@Bean的区别?
作用对象不同,@Component作用于类,@Bean作用于方法
@Component注解通常是通过类路径扫描自动装配到Ioc容器的,@Bean注解是在方法中产生,当我们需要是才实例化。
@Bean注解比@Component注解的自定义性更强,而且很多地方只能通过@Bean注解来注册bean。
9、将一个类声明为Spring Bean的注解有哪些?
@Component,@Service,@Repository,@Controller
10、Spring事务管理的方式有几种?
声明式事务和编程式事务
11、Spring中的事务隔离级别有哪几种?
ISOLATION_DEFAULT
使用数据库默认隔离级别,Mysql默认采用可重复读隔离级别,Oracle默认采用读已提交
ISOLATION_READ_UNCOMMITTED
读未提交,最低隔离界别,可能导致脏读,幻读和不可重复读
ISOLATION_READ_COMMITTED
读已提交,允许读取并发事务已经提交的数据,可避免脏读,幻读和不可重复读可能发生
ISOLATION_REPEATABLE_READ
可重复度,可避免脏读,不可重复读,可能发生幻读
ISOLATION_SERIALIZABLE
串行化,最高隔离界别,但是性能低下。
12、Spring事务中有哪几种事务传播行为?
PROPOGATION_REQUIRED
如果当前存在事务,则加入该事务,没有则新建
PROPOGATION_SUPPORTS
如果存在事务,加入,不存在,非事务执行
13、BeanFactory和ApplicationContext有什么区别?
BeanFactory是SpringIoc的顶层接口,只定义了基础规范。ApplicationContext是它的子接口,具备BeanFactory的全部功能。
BeanFactory是SpringIoc的基础容器,ApplicationContext是容器的高级接口。拥有更多的功能,比如国际化,资源访问等
14、BeanFactory和FactoryBean的区别?
BeanFactory是容器得顶层接口,定义了一些基础行为,是负责生产和管理bean得一个工厂。
FactoryBean是Spring中得一种特殊的工厂Bean,可以生成某一类型的Bean实例,也就是说,可以使用Factory Bean自定义Bean的创建过程。
FactoryBean接口方法
T getObject() 返回FactoryBean创建Bean的实例,如果isSingleton返回true,降入放入单例池。
getObjectType() 返回FactoryBean创建的Bean类型
isSingleton() 返回作用于是否单例
15、描述一下Spring Ioc的初始化过程?
(1)、源码
(2)、初始化过程分析
第一步:调用prepareRefresh()做刷新前的预处理工作
第二步:调用obtainFreshBeanFactory()获取BeanFactory,默认实现时DefaultListableBeanFactory,加载BeanDefinition并注册到BeanDefinitionRegist
ry中
第三步:调用prepareBeanFactory()方法对BeanFactory做一些前置准备工作,比如设置context的类加载器等
第四步:调用postProcessorBeanFactory对BeanFactory做一些后置处理
第五步:调用invokeBeanFactoryPostProcessors()使用反射技术调用实现了BeanFactoryPostProcessor接口的Bean
第六步:调用registerBeanPostProcessors()注册BeanPostProcessor(Bean的后置处理器),在Bean的创建前后执行
第七步:调用initMessageSource()初始化MessageSource(做国际化、消息绑定,消息解析等)
第八步:调用initApplicationEventMulticaster()初始化事件派发器
第九步:调用onRefresh()方法,子类将会重写该方法,在刷新时可以自定义逻辑
第十步:调用registerListeners()注册实现了ApplicationListener接口的Bean
第十一步:调用finishBeanFactoryInitialization()实例化所有没有设置懒加载的单例Bean 比如填充属性,调用初始化方法(比如调用afterPropertiesSet(),init-method等),调用BeanPostProcessor对Bean进行后置处理
第十二步:调用finishRefresh()完成对context的刷新
16、谈一谈BeanFactory是如何创建的?
第一步:调用refreshBeanFactory()刷新BeanFactory
调用AbstractRefreshableApplicationContext的createBeanFactory()创建 BeanFactory
1、判断是否已经有了BeanFactory,有则销毁Bean并关闭BeanFactory
2、没有则调用createBeanFactory()方法创建BeenFactory并设置一些属性
3、调用loadBeanDefinitions()加载应用中的BeanDefinition,会一直调用到XmlBeanDefinitionReader的doLoadBeanDefinitions()方法
1、调用doLoadDocument()方法读取xml,将xml中的信息保存到Document中
2、调用registerBeanDefinitions()解析document对象,封装BeanDefinition并进行注册
1、一直调用下去会调用到DefaultBeanDefinitionDocumentReader的doRegisterBeanDefinitions()方法
2、继续调用parseBeanDefinitions()方法后再调用parseDefaultElement()方法
3、根据Xml的节点名称为bean后调用processBeanDefinition方法进行解析
1、解析为BeanDefinitionHolder对象,是一个BeanDefinition的包装类型
2、使用BeanDefinitionReaderUtils工具类完成BeanDefinition的注册
第二步:调用getBeanFactorty()获取BeanFactory,实际返回一个DefaultListableBeanFactory
17、谈一谈Spring Bean是如何创建的?
第一步:进入入口方法AbstractApplicationContext的finishBeanFactoryInitialization()方法
第二步:调用DefaultListableBeanFactory(也就是上面obtainBeanFactory()的返回值)的preInstantiateSingletons()方法
第三步:不管是工厂Bean还是普通Bean,最终都是通过getBean方法去获取实例
第四步:调用AbstractBeanFactory的doGetBean()去获取Bean实例,调用createBean()方法
第五步:调用AbstractAutowireCapableBeanFactory的createBean方法,接着调用doCreateBean方法
第六步:调用createBeanInstance()创建Bean实例,但是没有进行属性设置(依赖注入)
第七步:调用populateBean()方法进行属性填充,也就是实现依赖注入
第八步:调用initializeBean()进行初始化,并调用BeanPostProcessor后置处理器
18、谈一谈Spring Bean的延迟加载的原理?
普通Bean在容器启动时就初始化了,而被lazy-init=true修饰的Bean则在第一次获取Bean是触发初始化。
spring启动时会把所有的bean信息(xml和注解)解析为BeanDefinition存储到HashMap中,然后对每个BeanDefinition进行处理,如果是懒加载则初始化阶段不处理。
在bean初始化过程中的preInstantiateSingltons()方法中,有判断,必须是单例的并且不时懒加载的才会在容器创建时初始化
19、谈一谈Spring Ioc的循环依赖问题?
Spring中的循环依赖有构造器的循环依赖和set注入的循环依赖,构造器循环依赖是没有办法解决的,只能抛出BeanCurrentlyInCreationException异常
多实例的Bean的循环依赖也是没有办法解决的,这里说的是单实例set注入的循环依赖解决
Spring的循环依赖的理论依据是基于Java的引用传递,当获取对象的引用时,对象的属性是可以延时设置的,但是构造器必须在获取引用之前。
Spring采用提前暴露一个ObjectFactory对象来完成的,简单说就是ClassA调用setClassB之前就把ClassA实例化的对象通过ObjectFactory提前暴露在Spring容器中了
SpringMVC面试题
1、什么是Springmvc?简单介绍一下你对Springmvc的理解?
Springmvc是一个基于Java的实现了MVC模式的请求驱动类型的轻量级Web框架,通过把Model,VIEW,Controller分离,将web层进行解耦,方便组内开发人员分工合作
2、Springmvc的工作流程?
1)、工作流程图
2)、工作流程说明
第一步:用户发送请求到前端控制器DispatchServlet
第二步:前端控制器收到请求调用处理器映射器HandlerMapping
第三步:处理器映射器根据URL找到具体的处理器Handler,生成处理器对象以及处理器拦截器链,并返回前端控制器
第四步:前端控制器调用处理器适配器HandlerAdapter去调用处理器Handler
第五步:处理器适配器执行处理器Handler
第六步:处理器Handler执行完成后给处理器适配器返回ModelAndView
第七步:处理器适配器将ModelAndView(包含Model,View)返回给前端控制器
第八步:前端控制器请求视图解析器ViewResolver进行视图解析,根据逻辑视图名解析真正的视图
第九步:视图解析器返回View对象给前端控制器
第十步:前端控制器进行视图渲染,就是将模型数据填充到request域
第十一步:前端控制器向用户响应结果
3、Springmvc的主要组件?
HandlerMapping(处理器映射器)
HandlerMapping的作用就是根据URL获取响应的处理器,
标注了@RequestMapping的每个方法都可以看做一个Handler,Handler负责处理具体的请求。
HandlerAdapter(处理器适配器)
HandlerAdapter是一个适配器,SpringMvc中的Handler可以是任意形式,只要能处理请求即可。但是请求交给Servlet时,Servlet方法结构是doService(HttpServletRequest req,HttpServletResponse resp)形式的,要让固定的Servlet方法调用Handler进行处理,便是HandlerAdapter的职责
HandlerExceptionResolver(处理器异常解析器)
用于处理Handler产生的异常
ViewResolver(视图解析器)
用于将String类型的视图名和Local解析为View类型的视图,只有一个resolveViewName()方法
RequestToViewNameTranslator
有些组件没有设置View,也没有设置ViewName,该组件从请求中获取ViewName
LocalResolver
从请求中解析出Local
ThemeResolver
用于解析主题
MultipartResolver
用于上传请求
FlashMapManager
用于重定向时的参数传递
4、Springmvc如何设置重定向和转发?
转发就是在返回之前面加上forward 重定向就是加上redirect:
5、如何解决post请求乱码问题,get请求又如何处理?
post请求乱码解决,在web.xml中配置CharacterEncondingFilter, Get请求可以修改Tomcat编码,第二种是对参数进行重新编码。
6、Springmvc的异常处理?
@ControllerAdvice+@ExceptionHandler()注解进行处理
Springboot面试题
1、什么是Springboot?
SpringBoot用来简化Spring应用开发,约定大于配置,去繁化简的轻量级框架
创建独立的Spring应用程序main方法运行
内嵌Tomcat无需部署war包
简化maven配置,很多依赖不需要指定版本号
自动配置Spring添加对应starter即可完成自动化配置
2、Springboot有哪些优缺点?
优点:独立运行,简化配置,自动配置,无代码生成和XML配置(轻量级),应用监控
缺点:太容易上手,但是如果不了解核心技术和流程,一旦遇到问题就会棘手
3、Spring,Springmvc,Springboot有什么区别?
Spring最重要的是IOC和AOP技术思想的具体实现,
SpringMVC其实可以说就是封装了Servlet,让Web开发更加容易,
Spring和Springmvc均需要大量的配置,SpringBoot自动配置和启动就是解决它们的问题的
4、SpringBoot是如何实现自动配置的?
第一步:首先分析@SpringBootApplication注解,由三个核心注解组成@SpringConfiguration,@EnableAutoConfiguration,@ComponentScan
第二步:分析@SpringBootConfiguration发现就是包装了@Configuration注解,声明为一个配置类
第三步:分析@EnableAutoConfiguration注解,它由@AutoConfigurationPackage注解和@Import(AutoConfigurationImportSelector.class)组成
第四步:@AutoConfigurationPackage是使用@Import(AutoConfigurationPackages.Registrar.class)导入了该类实现自动扫描包的功能
第五步:进入Registrar.class可以看到它实现了ImportBeanDefinitionRegistrar接口的registerBeanDefinitions方法,并传入了包名,默认是入口程序的包名称
第六步:回到@EnableAutoConfiguration的第二个注解@Import(AutoConfigurationImportSelector.class),它实现了ImportSelector接口的selectImports方法将符合条件的标注有@Configuration的类注入SpringIoc中
第七步:importSelector会从META-INFO下的spring-autoconfiguration-metadata,properties中加载配置类
第八步:根据元数据信息使用SpringFactoriesLoader在META-INF/spring.factories中加载EnableAutoConfiguration的值,通过反射技术将标注@Configuration的类加载到Ioc容器中,从而实现自动配置
第九步:@ComponentScan可以扫描指定包下面的Bean
5、Springboot打成jar包和普通的jar有什么区别?
Springboot打的jar可以直接执行,普通的jar不能直接执行
6、如何使用Springboot实现异常处理?
@ControllerAdvice + @ExceptionHandler
7、Springboot中如何解决跨域问题?
重写WebMvcConfigurer的addCorsMappings方法,或者编写CorsFilter
8、Springboot的核心配置文件有哪几个?他们的区别是什么?
application(用于自动配置)和bootstrap(SpringCloud Config,需要在bootstrap中添加连接到配置中心的全局配置文件 一些固定的不能被覆盖的属性 一些加密解密场景)
9、Springboot有哪几种读取配置的方式?
@Value,@ConfigurationProperties, @PropertySource, @Enviroment
10、为什么导入dependency不需要指定版本?
因为spring-boot-start-parent中继承了spring-boot-dependencies,在这里面实现了版本号的统一管理
11、为什么要自定义starter?
一些公共的组件可以只要加入jar包,即可使用,方便组件复用
12、如何自定义starter?
第一步:引入spring-boot-autoconfiguration依赖
第二步:编写自动配置的配置类,并定义需要加载的Bean
第三步:在resources目录下创建META-INF/spring.factories文件
第四步:key为org.springframework.boot.autoconfiguration.EnableAutoConfiguration, value值为自己定义的自动配置类
13、SpringApplication.run是如何做到启动SpringBoot项目的呢?
第一步:进入run方法,发现是new SpringApplication,然后调用run方法,也就是先进行初始化,然后再启动。
第二步:主要是调用setInitializers进行初始化,调用setListeners注册监听器,然后给主入口程序类进行赋值
第三步:执行run方法启动容器
第一步:执行getRunListeners()获取并启动监听器
第二步:执行prepareEnviroment()传入监听器,准备环境
第三步:执行createApplicationContext()创建Spring容器
第四步:执行prepareContext()做一些前置处理
第五步:执行refreshContext进行容器的刷新
第六步:执行listeners.started()执行监听器发送容器启动完毕的通知
第七步:调用callReturns()方法返回容器
全部是自己含泪整理,如有错误,请多指教!
- 上一篇:Tomcat8及以上版本性能优化
- 下一篇:SpringBoot 速记
相关推荐
- 人人视频崩了怎么回事 人人视频下架了吗为什么刷不出来了
-
[海峡网]人人视频挂了吗下架了吗人人视频崩了怎么回事刷不出来了?人人视频发生了什么?怎么都看不成了,暂时还是永久?本来还以为是手机的问题,原来是客户端崩了难怪一直显示服务器异常!追着的美剧突然都下架...
- 502 bad gateway怎么解决?(502 bad gatewaynginxundefined)
-
相信许多小伙伴都遇到打开的网页提示502badgateway,502badgateway是提示用户该网址的网关错误,Web服务器作为网关或代理服务器时收到无效的响应,不管怎么刷新怎么重新输入地...
- 2岁男童眼睛被滴入强酸药水,医生亲身“试”药吓坏了……
-
平日里,小孩子爱玩爱闹是常事儿,但是大人的注意力如果时不时的掉线可就麻烦了。这一天,杭师大附院眼科陈舒主任医师像往常一样在接诊病人,然而一个孩子的哭闹声引起了她的注意,一群人神情焦灼,簇拥着一个孩子急...
- 3岁男童误将502胶当滴眼液,幸好妈妈及时处理,医生也为她点赞
-
小孩子由于心智还不够成熟,因此往往会做出一些危险的事情,甚至对自己造成伤害,这就需要家长的监督和保护。巧也不巧,日常生活中能够对孩子造成威胁的东西实在是太多了,堪称数不胜数,水笔、筷子、桌角,甚至刚拖...
- 5岁娃把502胶当眼药水滴眼中,爸爸的做法很机智,医生都称赞
-
文|哑铃妈妈家里有小孩子的一定要注意,在我们的家里存在很多的安全隐患,有的时候连家长都想不到的东西,竟然对孩子带来了伤害。5岁娃把502胶当眼药水滴眼中,爸爸的做法很机智,医生都点赞女孩乐乐长得可爱,...
- 宝宝误食502胶水,连忙送医救治,医生却夸宝妈做得好
-
有了孩子之后,妈妈都会变得神经敏感,生怕自己没有把孩子照顾好,但是毕竟一个人的经历是有限的,再加上孩子要是会走路,会说话之后对宝妈来说更是一种挑战,危及可能无时无刻不存在,这不,因为宝妈一转身的功夫,...
- 记一次Netty「直接内存溢出」导致线上网关项目宕机排查过程
-
作为一名Java开发者,我们都知道Java进程是运行在Java虚拟机上的,而Java进程要想正常运行则需要向计算机申请内存,其中主要为Java对象实例所占用的堆(heap)内存(当然还有其他的也会占用...
- 刚刚,突然崩了!网易云音乐紧急回应
-
今天下午#网易云音乐崩了#登上微博热搜第一在社交平台上,不少网友反馈,网易云音乐疑似崩溃。网友晒出网页端出现“502BadGateway”的服务器错误,同时网易云音乐的移动应用程序也无法正常使用。...
- 常见状态码(常见的状态码)
-
一二三四五原则:(即一:消息系列;二:成功系列;三:重定向系列;四:请求错误系列;五:服务器端错误系列。301状态码是永久移动302是临时移动304如果请求头中带有If-None-Match...
- 8岁男孩眼睛溅入502胶水,妈妈一番操作结果粘得更紧了
-
家有小孩的爸妈们肯定会多留个心眼照看虽然生活中已经时刻留意可能造成伤害的物品但有时一不留神幼小的孩子就会做出让人担心的事↓↓↓家住深圳的辰辰(化名)今年8岁了3月31日他在家里做手工时想要用未开封的5...
- 3岁娃滴502胶水在眼睛疼的尖叫,宝妈急中生智,保住孩子眼睛
-
但还好宝妈急中生智,连忙将孩子带到水龙头处,用水给孩子冲洗了一下眼睛,还用大量的生理盐水来给孩子清洗眼球,之后又立马将孩子送往医院,最后孩子的眼睛也没有什么大碍,拿了点药就能顺利出院了。而502胶水这...
- 网易云音乐回应App崩了:故障已陆续修复,补偿7天会员
-
2024年8月19日下午,多名网友反馈称,网易云音乐服务器疑似出现故障,登录网易云音乐APP后发现,个性化推荐和搜索功能均无法使用,并收到“获取数据失败”的提示。此外,网易云音乐的网页端也显示502错...
- 又崩了!不少人直接傻眼:太离谱!(台湾人到大陆后傻眼)
-
造车新势力哪吒汽车再被推向舆论风口。5月4日,话题#曝哪吒汽车APP断网#冲上微博热搜App断网无法使用从5月2日开始,陆续有多位网友反映哪吒汽车App断网,App控车无法使用。哪吒汽车App目前出现...
- 男子误把502胶水当眼药水!千万别犯这种低级错误!
-
你敢相信吗?有人竟然误把五零二胶水当成了眼药水滴进眼睛里。这可不是什么玩笑话,而是近日发生在武汉的一起真实事件。一名男子因此导致眼角膜严重受损,不得不紧急就医。据武汉大学附属爱尔眼科医院报道,这名男子...
- 502入眼危机!这份急救指南请牢记(502进入眼中怎么办)
-
502入眼,真实案例触目惊心生活中,502胶水是常用的黏合剂,以其强力黏合性备受青睐。但它一旦进入眼睛,后果不堪设想,下面这些真实案例,足以让我们警醒。曾有这样一则新闻,一位4岁女童在家玩耍时...
你 发表评论:
欢迎- 一周热门
-
-
UOS服务器操作系统防火墙设置(uos20关闭防火墙)
-
极空间如何无损移机,新Z4 Pro又有哪些升级?极空间Z4 Pro深度体验
-
如何修复用户配置文件服务在 WINDOWS 上登录失败的问题
-
手机如何设置与显示准确时间的详细指南
-
如何在安装前及安装后修改黑群晖的Mac地址和Sn系列号
-
日本海上自卫队的军衔制度(日本海上自卫队的军衔制度是什么)
-
10个免费文件中转服务站,分享文件简单方便,你知道几个?
-
爱折腾的特斯拉车主必看!手把手教你TESLAMATE的备份和恢复
-
NAS:DS video/DS file/DS photo等群晖移动端APP远程访问的教程
-
FANUC 0i-TF数据备份方法(fanuc系统备份教程)
-
- 最近发表
- 标签列表
-
- linux 查询端口号 (58)
- docker映射容器目录到宿主机 (66)
- 杀端口 (60)
- yum更换阿里源 (62)
- internet explorer 增强的安全配置已启用 (65)
- linux自动挂载 (56)
- 禁用selinux (55)
- sysv-rc-conf (69)
- ubuntu防火墙状态查看 (64)
- windows server 2022激活密钥 (56)
- 无法与服务器建立安全连接是什么意思 (74)
- 443/80端口被占用怎么解决 (56)
- ping无法访问目标主机怎么解决 (58)
- fdatasync (59)
- 405 not allowed (56)
- 免备案虚拟主机zxhost (55)
- linux根据pid查看进程 (60)
- dhcp工具 (62)
- mysql 1045 (57)
- 宝塔远程工具 (56)
- ssh服务器拒绝了密码 请再试一次 (56)
- ubuntu卸载docker (56)
- linux查看nginx状态 (63)
- tomcat 乱码 (76)
- 2008r2激活序列号 (65)