面经:Spring

一、基础

1. Spring、Spring MVC、Spring Boot

  • Spring
    是一款开源的轻量级 Java 开发框架,旨在提高开发人员的开发效率以及系统的可维护性。Spring 包含了多个功能模块(上面刚刚提到过),其中最重要的是 Spring-Core(主要提供 IoC 依赖注入功能的支持) 模块, Spring 中的其他模块(比如 Spring MVC)的功能实现基本都需要依赖于该模块
    缺点:spring依赖反射,反射影响性能
  • Spring MVC
    是 Spring 中的一个很重要的模块,主要赋予 Spring 快速构建 MVC 架构的 Web 程序的能力。MVC 是**模型(Model)、视图(View)、控制器(Controller)**的简写,其核心思想是通过将业务逻辑、数据、显示分离来组织代码。
  • Spring Boot
    Spring 旨在简化 J2EE 企业应用程序开发。Spring Boot 旨在简化 Spring 开发(减少配置文件,开箱即用!)。约定大于配置
    各个框架对比连接

2. Spring用了哪些设计模式

详细答案见Spring的设计模式
工厂设计模式 : Spring使用工厂模式通过 BeanFactory、ApplicationContext 创建 bean 对象。
代理设计模式 : Spring AOP 功能的实现。
单例设计模式 : Spring 中的 Bean 默认都是单例的。
模板方法模式 : Spring 中 jdbcTemplate、hibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。
装饰者设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。
适配器模式 :Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配Controller。

3. 过滤器Filter和拦截器的区别

添加链接描述
资料2
资料3
在这里插入图片描述
原理: 拦截器反射,过滤器函数回调
实现: HandlerIntecepter,Filtter
作用范围:
在这里插入图片描述

4. Spring中常用的扩展点

添加链接描述

  • 类型转换器
  • 获取容器Bean
  • 全局异常处理
    RestControllerAdvice + handleException
  • 自定义拦截器
  • 导入配置
  • 当工程启动
    有时候我们需要在项目启动的时候自定义一些额外的功能,比如加载一些系统参数,完成初始化,预热本地缓存等。 我们应该做什么?
    好消息是 SpringBoot 提供了:
    CommandLineRunner
    ApplicationRunner
  • 修改BeanDefinition初
  • 始化 Bean 前和后
    这时候就可以实现:BeanPostProcessor接口。
    该接口目前有两个方法:
    postProcessBeforeInitialization:应该在初始化方法之前调用。
    postProcessAfterInitialization:此方法在初始化方法之后调用。
  • 初始化方法
  • 关闭Spring容器前
  • 自定义Bean的scope

二. Spring IOC

1. 对IOC的了解

IoC(Inversion of Control:控制反转) 是一种设计思想,而不是一个具体的技术实现。IoC 的思想就是将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理。不过, IoC 并非 Spring 特有,在其他语言中也有应用。
控制 :指的是对象创建(实例化、管理)的权力
反转 :控制权交给外部环境(Spring 框架、IoC 容器)
优点:降低代码之间的耦合度、集中资源同一管理,简化开发

2、IoC实现机制(此处未详细展开)

xml配置文件、工厂模式、反射
通过解析xml文件获取对象信息,通过反射获取字节码文件,然后通过字节码文件创建对象,在创建对象的过程中用到了工厂模式

3、BeanFactory和ApplicationContext有什么区别

两大核心接口,都可以当作spring的容器
BeanFactory是最底层的接口,ApplictionContext是BeanFactory的子接口,除了beanFactory的功能外还有额外功能

  • 加载方式不同
    BeanFactory:延迟加载形式注入Bean
    ApplicationContext:预加载形式注入Bean
    在这里插入图片描述

4、依赖注入

  • 定义
    依赖注入是一种消除类之间依赖关系的设计模式。例如,A类要依赖B类,A类不再直接创建B类,而是把这种依赖关系配置在外部xml文件(或java config文件)中,然后由Spring容器根据配置信息创建、管理bean类。

  • 方式
    添加链接描述
    1. 属性注入
    在这里插入图片描述
    给变量上添加一个注解(@Autowired)
    2.Setter 注入
    在这里插入图片描述
    3.构造方法注入
    在这里插入图片描述

  • 如何选择哪种方式注入
    在这里插入图片描述

三、Bean

1. 定义

Bean 代指的就是那些被 IoC 容器所管理的对象。

2. 将一个类声明为Bean的注解

@Component 通用的注解,可标注任意类为 Spring 组件。如果一个 Bean 不知道属于哪个层,可以使用@Component 注解标注。
@Repository 对应持久层即 Dao 层,主要用于数据库相关操作。
@Service 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao 层
@Controller 对应 Spring MVC 控制层,主要用户接受用户请求并调用 Service 层返回数据给前端页面。

3. @Component和@Bean区别

(1) @Component 注解作用于,而**@Bean注解作用于方法**。
(2) @Component通常是通过类路径扫描来自动侦测以及自动装配到 Spring 容器中(我们可以使用 @ComponentScan 注解定义要扫描的路径从中找出标识了需要装配的类自动装配到 Spring 的 bean 容器中)。@Bean 注解通常是我们在标有该注解的方法中定义产生这个 bean,@Bean告诉了 Spring 这是某个类的实例,当我需要用它的时候还给我
(3) @Bean 注解比 @Component 注解的自定义性更强,而且很多地方我们只能通过 @Bean 注解来注册 bean。比如当我们引用第三方库中的类需要装配到 Spring容器时,则只能通过 @Bean来实现。

添加链接描述

4. 注入Bean的注解

在这里插入图片描述
第三个基本不用

5. @Autowired和@Resource区别

  • 来源不同:@Autowired 和 @Resource 来自不同的“父类”,其中 @Autowired 是 Spring 定义的注解,而@Resource 是 Java 定义的注解,它来自于 JSR-250(Java 250 规范提案);
  • 依赖查找的顺序不同:@Autowired 是先根据类型(byType)查找,如果存在多个 Bean 再根据名称(byName)进行查找;而@Resource 是先根据名称查找,如果(根据名称)查找不到,再根据类型进行查找;
  • 支持的参数不同:@Autowired 只支持设置一个 required 的参数,而 @Resource 支持更多的参数设置,@Resource 支持 7 个参数的设置;
  • 依赖注入的支持不同:@Autowired 支持属性注入、构造方法注入和 Setter 注入,而 @Resource 只支持属性注入和Setter 注入;
  • 编译器 IDEA 的提示不同:当使用 IDEA 专业版注入 Mapper 对象时,使用 @Autowired编译器会提示报错信息(虽然报错但不印象程序的执行);而 @Resource 则不会报错。

6. 如何给Spring容器提供配置元数据?Spring有几种配置方式?

XML文件配置元数据
注解配置元数据
Java类配置元素

7. Bean的作用域

  • 什么是作用域
    作用域是在运行时代码中的某些特定部分中变量,函数和对象的可访问性。换句话说,作用域决定了代码区块中变量和其他资源的可见性
  • 常见的五种
    singleton: Bean是单例,在spring ioc容器中只有一个实例
    prototype: 每次请求都会创建一个新的Bean实例
    request: 每次http请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效
    session: 在一个Http Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效
    applicaion/global-session: 在一个全局的HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效

8. Bean的生命周期 ***

生命周期:bean对象从创建到销毁的整体过程
bean生命周期控制:在bean创建后到销毁前做一些事情
在这里插入图片描述

9. 如何解决循环依赖 ***

9.1 答案总结

Spring是通过三级缓存解决的循环依赖问题,创建bean的过程分为实例化、属性注入、初始化三步。假如A和B发生了循环依赖,A完成实例化会放到缓存中,这时候需要在A中注入B的bean,对B进行实例化,这时需要在B中注入A的Bean,从缓存中获取A实例化后的Bean,B的Bean创建完成。A从缓存中获取B的Bean,完成属性注入和初始化。

9.2 Spring创建bean的三步

实例化、属性注入、初始化

9.3 什么是循环依赖

A依赖B,B依赖A 或者 A依赖本身

9.4 哪些形式循环依赖可以解决?哪些不可以?

prototype肯定不行,spring并没有缓存prototype的bean.
想要提供一个半成品的Bean 那就必须不能是构造方法注入
在这里插入图片描述

9.5 三级缓存有哪些

在这里插入图片描述

  • singletonObject:一级缓存,存放完全实例化且属性赋值完成的 Bean ,可以直接使用
  • earlySingletonObject:二级缓存,存放早期 Bean 的引用,尚未装配属性的 Bean
  • singletonFactories:三级缓存,存放实例化完成的 Bean 工厂

9.6 流程图

在这里插入图片描述

10. 如何获取Bean,有哪几种方式?

添加链接描述
方式一:通过BeanFactory获取
方式二:通过BeanFactoryAware获取
方式三:启动获取ApplicationContext
方式四:通过继承ApplicationObjectSupport
方式五:通过继承WebApplicationObjectSupport
方式六:通过WebApplicationContextUtils
方式七:通过ApplicationContextAware
方式八:通过ContextLoader
方式九:通过BeanFactoryPostProcessor

从本质上来讲,无非就是通过BeanFactory或ApplicationContext获取Bean,只不过获取BeanFactory或ApplicationContext容器的方式不同而已。

11. Bean依赖注入的方式

set方法注入
构造器注入
静态工厂注入
实例工厂注入

四、Spring AOP

1. 定义及常用术语

AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。
在这里插入图片描述
在这里插入图片描述

2. Spring AOP和 Aspect AOP的区别

在这里插入图片描述

Spring AOP是基于AspectJ实现的,AspectJ是一种比Spring AOP更强大的AOP框架。Spring AOP提供了一种更简单的方式来实现AOP,而AspectJ则提供了更多的功能和更高级的AOP技术。因此,可以说Spring AOP是AspectJ的一种简化版本,但是在实际应用中,两者可以相互配合使用

3. JDK动态代理和CGLIB动态代理的区别 ****

如果目标对象是实现了接口,默认用JDK动态代理
JDK动态代理:反射机制、InvocationHandler接口、实现接口的类
CGLIB动态代理:加载class文件、MethodInterceptor接口、
在这里插入图片描述
静态代理:目标类和接口类都必须实现接口

4. 应用场景

添加链接描述

  • 幂等性处理
  • 接口限流
  • 日志处理
  • 多数据源处理
  • 方法权限处理
  • 事务处理

5. AOP的通知类型

在这里插入图片描述
如何实现:通过写好通知类,定义好切点,连接点,在需要增强的方法上加上注解 @Before @Afater @Around即可

五、Spring MVC

1. 定义作用优点

在这里插入图片描述

2. 核心组件

DispatcherServlet :核心的中央处理器,负责接收请求、分发,并给予客户端响应。
HandlerMapping处理器映射器,根据 uri 去匹配查找能处理的 Handler ,并会将请求涉及到的拦截器和 Handler 一起封装。
HandlerAdapter :处理器适配器,根据 HandlerMapping 找到的 Handler ,适配执行对应的 Handler;
Handler请求处理器,处理实际请求的处理器。
ViewResolver视图解析器,根据 Handler 返回的逻辑视图 / 视图,解析并渲染真正的视图,并传递给 DispatcherServlet 响应客户端

3. 工作流程 ***

在这里插入图片描述

在这里插入图片描述

4. 统一异常处理

推荐使用注解的方式统一异常处理,具体会使用到 @ControllerAdvice + @ExceptionHandler 这两个注解 。

六、Spring Boot

解释自动装配:自动装配就是通过注解或者配置文件在springboot的帮助下实现某块功能 注解:SpringBoot能够实现自动装配主要是他有一个springbootappliaction注解,这个注解是一个复合注解,它由三个注解组成,其中有一个叫EnableAutoConfiguration的注解,它能够启用springboot的自动配置机制 讲解过程 当项目启动时,注解会对jar包下的spring.factories文件进行扫描,这个文件中包含了可以进行自动配置的类,当满足@Conditional注解指定的条件时,便在依赖的支持下进行实例化,注册到Spring容器中。

1. 自动装配原理 ***

定义:自动装配可以简单理解为:通过注解或者一些简单的配置就能在 Spring Boot 的帮助下实现某块功能
@SpringBootApplication注解会对jar包下的spring.factories文件进行扫描,这个文件中包含了可以进行自动配置的类,当满足@Conditional注解指定的条件时,便在依赖的支持下进行实例化,注册到Spring容器中。
加回答对springbootapplication注解的详细结束。

2. 核心注解 **

@SpringBootApplication相当于以下三个注解
@EnableAutoConfiguration:启用 SpringBoot 的自动配置机制
@ComponentScan: 扫描被@Component (@Service,@Controller)注解的 bean,注解默认会扫描启动类所在的包下所有的类 ,可以自定义不扫描某些 bean。
**@Configuration:**允许在上下文中注册额外的 bean 或导入其他配置类

3. 打的jar包和普通jar包有啥区别

在这里插入图片描述

4. 常用注解

  • @SpringBootApplication
  • @Autowired @Resource
  • @Component,@Repository,@Service, @Controller
    在这里插入图片描述
  • @RestController
  • @Scope
    在这里插入图片描述
  • @Configuration
  • @PathVariable 和 @RequestParam
    在这里插入图片描述
  • @RequestBody
    在这里插入图片描述
  • @ControllerAdvice :注解定义全局异常处理类
  • @ExceptionHandler :注解声明异常处理方法

5. Spring.factory的作用

Spring Factories的最重要的功能就是:可以通过配置文件指定Spring容器加载一些特定的组件。
Spring Factories是一种类似于Java SPI的机制,它在META-INF/spring.factories文件中配置接口的实现类名称,然后在程序中读取这些配置文件并实例化。

七、Spring事务

1. Spring管理事务的方式有几种

编程式事务
在代码中硬编码(不推荐使用) : 通过 TransactionTemplate或者 TransactionManager 手动管理事务,实际应用中很少使用,但是对于你理解 Spring 事务管理原理有帮助。

声明式事务
在 XML 配置文件中配置或者直接基于注解(推荐使用) : 实际是通过 AOP 实现(基于@Transactional 的全注解方式使用最多)

2.事务传播行为

添加链接描述

  • 定义
    事务传播行为是为了解决业务层方法之间互相调用的事务问题。
    当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。
  • 分类
    在这里插入图片描述
  • 默认的事务传播行为:没有事务,创建新事务;存在事务,加入该事务

在这里插入图片描述

  • PROPAGATION_REQUIRES_NEW:每次执行都会创建新事务,并同时将上下文中的事务挂起,执行完当前线程后再恢复上下文中事务(事务是单独的)
    在这里插入图片描述

3. Spring事务隔离级别

在这里插入图片描述

4. Spring事务失效的场景

spring事务失效

  • 数据库引擎不支持事务
    以 MySQL 为例,其 MyISAM 引擎是不支持事务操作的
  • 没有被Spring管理
  • 自身调用问题
    发生了自身调用,就调该类自己的方法,而没有经过 Spring 的代理类,默认只有在外部调用事务才会生效
  • 数据源没有配置事务管理器
  • 不支持事务
    Propagation.NOT_SUPPORTED: 表示不以事务运行
  • 方法不是public
    @Transactional 只能用于 public 的方法上,否则事务不会失效,如果要用在非 public 方法上,可以开启 AspectJ 代理模式。
  • 出现异常

5.四大特性的关系

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值