java面试宝典----框架篇

目录

Spring是什么?

谈谈你对AOP的理解

谈谈你对IOC的理解

解释下Spring⽀持的⼏种bean的作⽤域。

2Spring事务的实现⽅式和原理以及隔离级别?

Spring事务传播机制

Spring事务什么时候会失效?

什么是bean的⾃动装配,有哪些⽅式?

Spring中的Bean创建的⽣命周期有哪些步骤

Spring中Bean是线程安全的吗

ApplicationContext和BeanFactory有什么区别

Spring中的事务是如何实现的

Spring中什么时候@Transactional会失效

Spring容器启动流程是怎样的

Spring⽤到了哪些设计模式

Spring Boot、Spring MVC 和 Spring 有什么区别

Spring MVC ⼯作流程

Spring MVC的主要组件?

Spring Boot ⾃动配置原理?

如何理解 Spring Boot 中的 Starter

什么是嵌⼊式服务器?为什么要使⽤嵌⼊式服务器?

Spring Boot中常⽤注解及其底层实现

Spring Boot是如何启动Tomcat的

Spring Boot中配置⽂件的加载顺序是怎样的?

Mybatis的优缺点

MyBatis 与Hibernate 有哪些不同?

#{}和${}的区别是什么?

简述 Mybatis 的插件运⾏原理,如何编写⼀个插件。

Spring是什么?

spring就是一个容器框架,主要就是IOC和Aop

谈谈你对AOP的理解

面向切面编程,我们可以将一些交叉业务封装成一个切面,注入到目标中。业务中会用来记录日志

谈谈你对IOC的理解

控制反转和依赖注入

控制反转:
没有引⼊IOC容器之前,对象A依赖于对象B,那么对象A在初始化或者运⾏到某⼀点的时候,⾃⼰必须 主动去创建对象B或者使⽤已经创建的对象B。⽆论是创建还是使⽤对象B,控制权都在⾃⼰⼿上。
引⼊IOC容器之后,对象A与对象B之间失去了直接联系,当对象A运⾏到需要对象B的时候IOC容器会主动创建⼀个对象B注⼊到对象A需要的地⽅
依赖注⼊:
“获得依赖对象的过程被反转了”。控制被反转之后,获得依赖对象的过程由⾃身管理变为了由IOC容器 主动注⼊。依赖注⼊是实现IOC的⽅法,就是由IOC容器在运⾏期间,动态地将某种依赖关系注⼊到对象 之中。

解释下Spring⽀持的⼏种bean的作⽤域。

singleton:默认,每个容器中只有⼀个bean的实例,单例的模式由BeanFactory⾃身来维护。该对象的⽣命周期是与Spring IOC容器⼀致的(但在第⼀次被注⼊时才会创建)。
prototype:为每⼀个bean请求提供⼀个实例。在每次注⼊时都会创建⼀个新的对象
request:bean被定义为在每个HTTP请求中创建⼀个单例对象,也就是说在单个请求中都会复⽤这
⼀个单例对象。
session:与request范围类似,确保每个session中有⼀个bean的实例,在session过期后,bean会随之失效。
application:bean被定义为在ServletContext的⽣命周期中复⽤⼀个单例对象。
websocket:bean被定义为在websocket的⽣命周期中复⽤⼀个单例对象。
global-session:全局作⽤域,global-session和Portlet应⽤相关。当你的应⽤部署在Portlet容器
中⼯作时,它包含很多portlet。如果你想要声明让所有的portlet共⽤全局的存储变量的话,那么这全局变量需要存储在global-session中。全局作⽤域与Servlet中的session作⽤域效果相同。

Spring事务的实现⽅式和原理以及隔离级别?

实现方式:

        通过申明式事务@Transactional注解实现,如果事务要回滚就用rollbackFor属性回滚;

隔离级别:

        读未提交

        读已提交

        可重复读

        序列化

Spring事务传播机制

required(默认)若果不存在事务就新建一个事务,如果存在事务就加入

required_new 不管你有没有我都会新建一个事务,如果存在事务就给你挂起

support        存在就加入,不存在就以非事务形式执行

not_support 以非事务形式执行,存在事务就挂起

never        不支持事务,存在事务抛异常

Spring事务什么时候会失效?

1.没有交给spring进行管理

2.类里面使用了this自调用

3.方法不是public修饰

4.数据库不支持事务

5.事务默认情况下只在遇到RuntimeException及其子类时才会回滚,如果在事务中遇到了其他类型的异常并且没有进行适当的处理,可能会导致事务失效。

什么是bean的⾃动装配,有哪些⽅式?

@Autowired注解

和xml形式

Spring中的Bean创建的⽣命周期有哪些步骤

  1. 实例化(Instantiation):根据配置或代码创建Bean的实例。可以通过构造函数实例化对象,也可以通过工厂方法或者其他方式来创建。

  2. 属性赋值(Population):将配置文件或注解中定义的属性值赋给Bean实例。这可以通过构造函数、工厂方法、属性注入、注解等方式完成。

  3. Aware接口回调(ApplicationContextAware等):如果Bean实现了Aware接口(如ApplicationContextAware、BeanNameAware等),容器会调用相应的回调方法,将容器上下文等信息注入到Bean中。

  4. 自定义初始化方法(Initialization):如果Bean定义中指定了初始化方法,容器会在属性赋值完成后调用该方法进行自定义的初始化逻辑。可以通过@Bean(initMethod="init")注解或者实现InitializingBean接口来定义初始化方法。

  5. BeanPostProcessor的前置处理(PostProcessBeforeInitialization):在初始化方法调用之前,容器会调用注册的BeanPostProcessor的前置处理方法,可以对Bean进行自定义处理。

  6. 初始化方法调用(Initialization):调用Bean定义中指定的初始化方法。如果没有指定自定义初始化方法,则什么都不做。

  7. BeanPostProcessor的后置处理(PostProcessAfterInitialization):在初始化方法调用之后,容器会调用注册的BeanPostProcessor的后置处理方法,可以对Bean进行自定义处理。

  8. 使用(Bean ready):至此,Bean已经被完全创建且初始化完成,可以被容器及其他Bean使用了。

  9. 销毁(Destruction):当容器关闭时,或者通过调用容器的destroy()方法销毁Bean时,容器会调用Bean定义中指定的销毁方法进行资源释放和清理操作。可以通过@Bean(destroyMethod="destroy")注解或者实现DisposableBean接口来定义销毁方法。

Spring中Bean是线程安全的吗

bean是否线程安全要看这个bean本身是不是线程安全

ApplicationContext和BeanFactory有什么区别

ApplicationContext和BeanFactory是Spring框架中的两个核心接口,它们之间存在以下区别:

  1. 功能:BeanFactory是Spring的基础设施,提供了IoC容器的基本功能,即管理和获取Bean实例。ApplicationContext是BeanFactory的子接口,提供了更多的企业级功能,如事件发布、国际化支持、资源加载、AOP等。

  2. 预加载和延迟加载:BeanFactory采用延迟加载策略,即在首次使用时才去初始化Bean实例,适用于系统启动时对资源要求较低的情况。而ApplicationContext在容器启动时就预加载所有的单例Bean,以提高应用程序的响应速度。

  3. 配置文件的读取:BeanFactory通过ResourceLoader来读取配置文件,支持多种资源格式,如XML、Properties、注解等。ApplicationContext在BeanFactory的基础上进一步封装,提供了更多的配置方式和更强大的功能,如自动装配、AOP代理等。

  4. 生命周期管理:ApplicationContext对Bean的生命周期进行主动管理,可以检测到Bean的初始化和销毁事件,并触发相应的回调方法。而BeanFactory则需要手动调用相应的方法来进行生命周期管理。

  5. 国际化支持:ApplicationContext提供了国际化支持的功能,可以方便地实现多语言环境的应用,读取和切换不同的资源文件。而BeanFactory本身不具备这个功能。

  6. AOP支持:ApplicationContext内置了对AOP的支持,可以方便地应用切面编程,实现事务管理、日志记录等横切关注点的功能。而BeanFactory需要手动配置和管理AOP相关的组件。

综上所述,ApplicationContext是Spring的高级容器,提供了更多的企业级功能和扩展,适用于大多数应用场景。而BeanFactory则是Spring的基础设施,提供了基本的IoC容器功能,适用于资源要求较低的场景。如果需要使用Spring的高级功能,推荐使用ApplicationContext。

Spring中的事务是如何实现的

底层是aop

1. Spring事务底层是基于数据库事务和AOP机制的
2. ⾸先对于使⽤了@Transactional注解的Bean,Spring会创建⼀个代理对象作为Bean
3. 当调⽤代理对象的⽅法时,会先判断该⽅法上是否加了@Transactional注解
4. 如果加了,那么则利⽤事务管理器创建⼀个数据库连接
5. 并且修改数据库连接的autocommit属性为false,禁⽌此连接的⾃动提交,这是实现Spring事务⾮常重要的⼀步
6. 然后执⾏当前⽅法,⽅法中会执⾏sql
7. 执⾏完当前⽅法后,如果没有出现异常就直接提交事务
8. 如果出现了异常,并且这个异常是需要回滚的就会回滚事务,否则仍然提交事务
9. Spring事务的隔离级别对应的就是数据库的隔离级别
10. Spring事务的传播机制是Spring事务⾃⼰实现的,也是Spring事务中最复杂的
11. Spring事务的传播机制是基于数据库连接来做的,⼀个数据库连接⼀个事务,如果传播机制配置为 需要新开⼀个事务,那么实际上就是先建⽴⼀个数据库连接,在此新数据库连接上执⾏sql

Spring中什么时候@Transactional会失效

2.类里面使用了this自调用

3.方法不是public修饰

4.数据库不支持事务

5.事务默认情况下只在遇到RuntimeException及其子类时才会回滚,如果在事务中遇到了其他类型的异常并且没有进行适当的处理,可能会导致事务失效。

Spring容器启动流程是怎样的

  1. 加载配置文件:Spring容器首先会读取配置文件,通常是XML格式的配置文件,如applicationContext.xml。也可以使用基于注解的配置或者Java Config方式进行配置。

  2. 创建容器实例:根据配置文件中的定义,Spring容器会创建相应的容器实例。最常用的容器实现是ApplicationContext,它是BeanFactory接口的具体实现,提供了更多的功能和扩展。

  3. 解析配置文件:容器会解析配置文件中定义的Bean定义和相关的配置元数据,包括Bean的名称、类型、属性、依赖关系等信息。

  4. 实例化Bean:根据解析得到的Bean定义,容器会实例化Bean对象。这可以通过构造函数实例化、工厂方法、通过代理创建等方式来进行。

  5. 设置Bean属性:容器会将配置文件中定义的属性值或引用设置到相应的Bean实例中。这可以通过setter方法注入、构造函数注入、注解等方式来完成。

  6. 处理依赖关系:容器会处理Bean之间的依赖关系,确保被依赖的Bean已经创建并可用。Spring使用依赖注入(Dependency Injection)方式来解决依赖关系,包括构造函数注入、属性注入和接口注入等。

  7. 调用初始化方法:一旦Bean实例化和属性设置完成,容器会调用初始化方法,如果Bean定义中指定了初始化方法的话。这可以通过@Bean(initMethod="init")注解或者实现InitializingBean接口来定义。

  8. 注册Bean和处理后置处理器:容器会将实例化、配置和初始化完成的Bean注册到容器中,以便后续的使用。同时,容器还会处理注册的BeanPostProcessor,执行相应的前置处理和后置处理方法。

  9. 容器就绪:经过上述步骤,容器已经完成了所有Bean的创建和初始化工作,并且就绪可以被外部使用了。

以上是Spring容器的简化启动流程,实际上还涉及更多的细节和功能,如AOP代理、事件发布、国际化支持等。整个启动过程是在容器启动时进行的,以确保所有的Bean在容器可用之前都已经正确地创建和初始化。

Spring⽤到了哪些设计模式

 

Spring Boot、Spring MVC 和 Spring 有什么区别

spring是一个容器

springMVC是spring对web框架的解决方法

springBoot是快速开发工具包

Spring MVC ⼯作流程

1 、用户发送出请求到前端控制器 DispatcherServlet ,这是一个调度中心
2 、 DispatcherServlet 收到请求调用 HandlerMapping (处理器映射器)。
3 、 HandlerMapping 找到具体的处理器 ( 可查找 xml 配置或注解配置 ) ,生成处理器对象及处理器拦截器( 如果有 ) ,再一起返回给 DispatcherServlet 。
4 、 DispatcherServlet 调用 HandlerAdapter (处理器适配器)。
5 、 HandlerAdapter 经过适配调用具体的处理器( Handler/Controller )。
6 、 Controller 执行完成返回 ModelAndView 对象。 7 、 HandlerAdapter 将 Controller 执行结果 ModelAndView 返回给 DispatcherServlet。
8 、 DispatcherServlet 将 ModelAndView 传给 ViewReslover (视图解析器)。
9 、 ViewReslover 解析后返回具体 View (视图)。
10 、 DispatcherServlet 根据 View 进行渲染视图(即将模型数据填充至视图
中)。
11 、 DispatcherServlet 响应用户。

Spring Boot ⾃动配置原理?

 通过注解@SpringBootApplication

Spring Boot中常⽤注解及其底层实现

SpringBootApplication,@Controller,@Service,@ResponseBody,@Autowired

#{}和${}的区别是什么?

使⽤#{}可以有效的防⽌ SQL 注⼊, 提⾼系统安全性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值