Java框架面试题

一、Spring

1.Spring、SpringMVC、SpringBoot区别

Spring是一个开源的轻量型框架,主要配置bean以及维护bean之间的关系,解决开发中基础性问题,让开发人员专注应用程序的开发。Spring在管理bean的时候,其实就是通过反射机制找的底层bean工厂,由它帮我们创建对象。bean创建是工厂模式,默认bean是单例模式。我们知道,最高级抽象是beanFactory接口。他根据xml文件中的定义装入bean,通过getBean()获取xml文件中具体的bean;最后通过applicationContect接口创建bean,所有的bean都是它创建的,可以看做是BeanFactory的一个升级,比如国际化、生命周期监听功能。
重要的三个实现类:
ClassPathXmlApplication–主要加载xml文件
FileSysytemXmlApplication–加载文件
XmlApplicationContext–用在servlet上
SpringMVC是Spring的一个组件,它能极大降低代码耦合,也就是分层,pojo、dao/mapper、service、controller
SpringBoot是一个微服务框架,特点是自动配置,不需要SSM那种繁琐的手动配置;约定大于配置

2.Spring中的bean是线程安全的吗

首先这需要分5种情况:
bean的作用域:singleton(单例)、propotype(多例/原型)、session、request、global session;
原型bean:每次创建一个新对象,也就是线程之间不存在bean共享,自然线程安全的;
单例bean:所有线程都共享这个bean,存在资源竞争。
如果单例Bean,是一个无状态的Bean,也就是线程中的操作不会对Bean成员执行查询以外的操作,那么这个Bean是线程安全的。比如SpringMVC的Controller、Service、Dao等,这些Bean大多无状态,只关注方法本身。

3.什么是IOC?

IOC-控制反转,是Spring中注入bean的一个核心思想。
顾名思义,控制,是对bean的管理权,本来是由开发人员进行bean的管理的,自己去new来创建bean;
反转,也就是对bean的管理权进行了交接,由Spring来帮我们进行管理;
这是一种面向对象编程的设计原则,用来减低代码耦合度。
那么这些功能实现就需要用到DI-依赖注入,这是ioc思想的实现;
当程序中使用Spring时,哪个位置需要bean,它会帮我们自动注入;比如一个bean上还有其他bean时,好比学生里面调用老师,这就根据依赖关系注入

4.Spring注入方式

  • Setter注入(xml注入)–直接在bean.xml文件通过bean标签配置,id=xxx,class=相对路径
    在这里插入图片描述
  • 构造器注入
    在这里插入图片描述
  • 注解注入
    ----直接在实体类上的属性进行注解,@Conponent@Value@Resource-用在类与类上,老师学生
    ----然后在bean.Xml文件中配置组件扫描器conponent-scan
  • 接口注入(了解)–使用接口编程实现层与层之间的降低耦合度,用的少

5.Spring自动装配

两种:xml文件、通过注解
方式一:通过xml文件实现自动装配
只需要在xml配置文件中的bean标签加入一个属性autowire即可:no、byName、byType、constructor、default
方式二:通过注解实现自动装配
首先在xml文件中加入context:annotation-config/,用来开启注解的支持,不加注解就无效;
然后加入@Autowired注解即可!
其实@Resource注解和它功能一样;

6.Spring的五种装配模式

  • no——默认情况下,不自动装配,通过ref手动设定;ref是引用对象,value直接赋值;
  • byName——根据Property的Name自动装配,如果bean的name和另一个相同,则自动装配这个bena到property中;
  • byType——根据Property的数据类型自动装配,如果一个bean的数据类型,兼容另一个bean的数据类型,则自动装配;
  • constructor——根据构造函数参数的数据类型,进行byType模式的自动装配
  • autodetect——容器首先通过构造函数使用 autowire 装配,如果不能,则通过 byType自动装配。

7.Spring对Bean的生命周期

在这里插入图片描述

  • 通过构造器或工厂方法创建Bean实例
  • 为Bean的属性设置值或对其他Bean的引用
  • 将Bean实例传递给Bean后置处理器的postProcessBeforeInitialization方法
  • 调用Bean的初始化方法
  • 将Bean实例传递给Bean后置处理器的postProcessAfterInitialization方法
  • 可以使用Bean了
  • 当容器关闭,调用Bean的destory进行销毁

8.说说AOP

AOP即面向切面编程;主要就是对编程的时候,我们会抽象出来一个切面,当业务走到这个切面上的时候,会触发我们的一些操作(日志管理,事务管理),不影响主流业务;但是如果主流业务有异常,就会帮我们拦截。
其核心思想是将散布于应用中的多处功能,即横切关注点(如日志、安全和事务管理等),与业务逻辑分离,从而提高代码的模块化程度和可重用性。
(就是相当于银行自动门,它的检测范围是2米,这2米就是一个切面;在2米切面之外,是没效果的;当人走到2米内,就会触发开门事件。在写代码时,在切面范围内,我们自己可以进行编程,这就是面向切面编程–例子来说,我们可以编程开门语音欢迎等)在切面上编程,不影响主流业务。比如门打开后没提示我们欢迎,但我们还是要进去取钱。如果人身上带着武器,门就不会开,进行拦截。

9.通知概念

通知(advice)是切面的具体实现。以目标方法为参照点,根据位置,可以分为前置通知、后置通知、异常通知、环绕通知、最终通知。
代码实例:两个AOP实体类,一个主流业务,一个切面:
在这里插入图片描述
在这里插入图片描述
然后配置bean.xml中的注解aspectj
在这里插入图片描述

10.Spring七大组件

在这里插入图片描述

11.@Resource和@Autowire区别

@Autowire来源于spring,装配方式是ByType,属性required
@Resource来源于JDK,装配方式是ByName,属性name,type

二、Mybatis

1.Mybatis定义

※高级映射:就是把数据库的表和代码的类进行映射。操作类的时候也会操作表。
Mybatis是一个持久层框架,支持自定义SQL,存储过程以及高级映射(一对一,一对多,多对多)。Mybatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作**(之前获取到的数据需要java代码去做,即返回一个对象,然后遍历对象取出数据。他就可以直接将取到的数据返回对象,然后遍历取出)。Mybatis通过简单的XML注解**来配置和映射原始类型、接口和java POJO为数据库的记录(就是xml文件中的一个操作和我们接口中的内容对应起来,映射我们的pojo)。

2.Mybatis工作原理

每一个Mybatis应用程序主要都是使用SqlSessionFactory(这是Session工厂)实例,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder(工厂的建造者)获得,SqlSessionFactoryBuilder可以从一个xml配置文件获得。
也就是说,当一个mybatis启动时,先通过xml配置文件找到SqlSessionFactoryBuilder(工厂的建造者),然后他去创建工厂SqlSessionFactory,然后它生产很多session的对象出来,然后对象就可以去调用里边的方法了。
要调方法就要去调用一个执行器executor,然后它去底层调用映射mappedstatement,然后进入数据库进行sql语句操作,最后用过底层映射返回数据给调用者。
在这里插入图片描述

3.Mybatis缓存回收的几种算法

LRU–最近最长时间没有使用的,根据时间
LFO–最近很少使用的,根据频率
FIFO–先进先出,类似队列

4.Mybatis分页方式及区别

逻辑分页物理分页
逻辑分页:使用Mybatis自带的rowBounds进行分页,他是一次性查询很多数据,然后在数据中进行检索;
物理分页:自己手写SQL分页或使用分页插件PageHelper,去数据库查询指定条数的分页数据形式;
区别
• 逻辑分页是一次性查询很多数据,然后再在结果中检索分页的数据。这样做弊端是需
要消耗大量的内存、有内存溢出的风险、对数据库压力较大。
• 物理分页是从数据库查询指定条数的数据,弥补了一次性全部查出的所有数据的种种
缺点,比如需要大量的内存,对数据库查询压力较大等问题。

5.Mybatis常用标签

定义语句相关的:insert、delete、update、select
查询结果集相关的:resultMap
sql动态:if、choose、foreach
关联关系:collection、association

6.Mybatis核心组件

  • SqlSeesionFactory:用于创建SqlSeesion的工厂类
  • SqlSession:Mybatis的核心组件,用于向数据里执行SQL
  • 主配置文件:XML配置文件,可以对Mybatis的底层行为作出详细的配置
  • Mapper接口:即Dao接口,在Mybatis习惯成为Mapper
  • Mapper映射器:用于编写SQL,并将SQL和实体类进进行映射的组件,采用XML、注解均可实现

三、SpringMVC

1.SpringMVC运行流程

首先,用户从前端发送的http请求到我们的DispatcherServlet(前端控制器/核心分发器),然后它查询一个或多个HandlerMapping,从而找到对应的处理器Controller,也就是我们的业务操作;controller进行之后,将结果封装到ModelAndView里面;然后前端控制器调用视图解析器,对ModelAndView进行解析并渲染,最后返回到浏览器进行展示!

2.SpringMVC有哪些组件

  • 前端控制器 DispatcherServlet
  • 映射控制器 HandlerMapping
  • 处理器 Controller
  • 模型和视图 ModelAndView
  • 视图解析器 ViewResolver

3.RequestMapping作用

将http请求映射到相应的方法上

4.SpringMVC怎么和Ajax交互

通过Jackson框架就可以把Java里面的对象直接转化成Js可以识别的Json对象。具体步骤如下 :

  • 加入Jackson.jar
  • 在配置文件中配置json的映射
  • 在接受Ajax方法里面可以直接返回Object,List等,但方法前面要加上@ResponseBody注解。

四、SpringBoot

1.约定大于配置

四个方面

  • 约定大于配置是一种软件设计的范式,核心思想就是解放开发员对配置项的维护,让开发员更聚焦在业务逻辑上;
  • SpringBoot是这一个思想下的产物,它类似于Spring框架下的一个脚手架;通过SpringBoot我们能快速开发Spring生态下的应用程序;
  • 基于传统Spring框架开发web应用时,要做很多和业务无关并且只需要做一次的配置项,比如
    管理jar包的依赖,
    web.xml维护、
    SpringMVC中的Dispatch-servlet配置项的维护、
    应用手动部署到web容器、
    第三方组件集成到Spring IOC中,
    而在SpringBoot中 ,它自动帮我们完成,而前提就是基于约定大于配置的思想;
  • SpringBoot约定大于配置的体现有很多
    比如 1. Spring-Boot-Starter启动依赖,它帮我们管理所有的jar包版本;
    2.如果当前应用依赖web这样一个jar包,SpringBoot会自动内置tomcat运行web应用;
    3.SpringBoot的自动装配机制的实现中,通过扫描约定路径下的spring.factories文件去进行识别配置类,从而实现Bean的自动装载;
    4.SpringBoot默认会加载resource目录下application.properties文件;
    总的来说,约定大约配置核心本质就是更加高效去实现软件系统的开发和维护

2.SpringBoot核心配置文件是什么

有两个核心配置文件:

  • bootstrap(.yml/.properties):它有父ApplicationContext加载的,比application优先加载,且bootstrap里的属性不能被覆盖;
  • application(.yml/.properties):用于springboot项目的自动化配置;

3.SpringBoot热部署实现方式

  • 直接在idea设置中,勾选自动编译;
  • 使用devtools启动热部署,添加devtools库,在配置文件中把spring.devtools.restart.enabled设置为true

4.SpringBoot启动类注解

@SpringBootApplication
标注这个类SpringBoot的一个启动类,它由三个注解所修饰,也可以看做是它们的一个整合!
@ComponentScan:扫描注解,组件扫描器;
@SpringBootConfiguration:其实就是spring中的Configuration,被它修饰的注解是一个配置类,也由spring容器管理;
@EnableAutoConfiguration:自动配置bean

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

11_1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值