Spring八股文

复习spring八股文可以从以下四个方面入手
IOC
AOP
事务管理
SpringMVC

文章目录

  • 使用Spring框架的好处
  • Spring的IOC容器
  • 依赖注入的定义和方式
  • BeanFactory和ApplicationContext
  • 区分构造器注入和setter注入
  • Spring提供了哪些配置方式
  • @Component和@Bean的区别
  • Bean的作用域(BeanScope)
  • 理解IOC和DI
  • Bean的生命周期
  • 内部Bean
  • Spring装配
  • @Autowired和@Resource的区别
  • 自动装配的局限
  • 同名Bean
  • 循环依赖
  • Bean的线程安全问题
  • AOP
  • AOP的实现方式
  • 切面编程术语
  • 通知类型
  • SpringAOP和AspectJAOP的区别
  • Spring使用到了哪些设计模式
  • Spring事务的实现方式
  • Spring事务管理的优点
  • Spring事务传播规则
  • Spring事务的隔离级别
  • SpringMVC的工作流程
  • SpringMVC核心组件
  • @Controller注解的作用
  • @RequestMapping注解的作用
  • @RestController的作用
  • SpringMVC的拦截器
  • 统一的异常处理
  • Restful
  • 为什么要使用Springboot
  • Springboot如何实现多环境
  • SpringBoot的核心注解
  • SpringBoot Starter

使用Spring框架的好处

1.轻量,基本的版本大约2MB
2.控制反转 低耦合
3.面向切面 低侵入
4.容器 管理应用中对象的生命周期和配置
5.MVC框架 Spring的WEB框架与Spring无缝使用
6.事务管理 Spring提供持续的事务管理接口 可以扩展到上至本地事务下至全局事物
7.异常处理 Spring提供方便的API把具体技术的异常转化为一致的非受检异常

Spring的IOC容器

Spring框架的核心是Spring容器,容器创建对象,将他们装配在一起,配置并管理他们的完整生命周期。Spring容器使用依赖注入来管理组成应用程序的组件,容器通过读取提供的配置元数据来接收对象进行实例化,配置和组装指令,该原数据可以通过XML,Java注解或者Java代码提供。

依赖注入的定义和方式

定义:在依赖注入中,您不必直接创建对象,但是必须描述如何创建他们,您不是直接在代码中将组件和服务连接在一起,而是描述配置文件中的哪些组件需要哪些服务,由IOC容器把他们装配在一起。
方式:构造器注入、setter注入、接口注入

BeanFactory和ApplicationContext

BeanFactory
懒加载
语法显式提供资源对象
不支持国际化
不支持基于依赖的注解
优点:应用启动占用资源少,对资源要求高的应用有优势。
缺点:运行速度相对较慢,有可能出现空指针异常,通过BeanFactory创建的对象生命周期相对简单。
ApplicationContext
即时加载
自己创建和管理资源对象
支持国际化
支持基于依赖的注解
优点:所有Bean在启动时进行加载,系统运行速度快,系统启动的时候,可以发现系统中的配置问题
缺点:把费时操作放到系统启动中完成,所有对象都可以预加载,缺点就是占用内存比较大

区分构造器注入和setter注入

构造器注入
没有部分注入
不会修改setter属性
任意修改都会创建一个新实例
适用于设置很多属性
setter注入
有部分注入
会覆盖setter属性
任意修改不会创建一个新实例
适用于设置少量属性

Spring提供了哪些配置方式

基于xml配置

<beans>
  <bean id="" class="">
    <propety name="" value="">propety>
  bean>
beans>

基于注解配置

<beans>
  <context:annotation-config/>
beans>

@Controller
@Service
@Repository
@Component
基于Java API配置

@Configuration
public class Config(){
    @Bean
    public Bean bean(){
        return new Bean();
    }
}

@Component和@Bean的区别

@Component作用于类,@Bean作用于方法
@Component标记的类需要通过扫描自动装配到Spring的bean容器中,@bean是在标记的方法中创建bean,放到spring容器中
@bean比@Component具有更强的自定义性,适用于三方类库装配到spring容器

Bean的作用域(BeanScope)

singleton:唯一实例,默认
prototype:每次请求都会创建一个新实例
request:http request内有效
session: http session内有效
application/global-session 整个web应用范围内有效

理解IOC和DI

IOC:控制反转 我们不用自己创建对象,而是使用Spring容器来帮我们创建对象和管理对象的生命周期,使用面向接口编程的方式实现组件的动态依赖,使用依赖注入将某个依赖关系动态的注入到组件中,只需要通过简单的配置,无需任何代码就能够指定目标的资源,完成自身的业务逻辑。实现了低耦合。

Bean的生命周期

1.通过无参构造器创建 bean 实例
2.调用 set 方法为 bean 的属性设置值和对其他 bean 引用
如果实现了*Aware接口,调用相应的方法,主要是对类和容器的感知
3.把 bean 实例传递 bean 后置处理器的方法 postProcessBeforeInitialization
4调用 bean 的初始化的方法、
5.把 bean 实例传递 bean 后置处理器的方法 postProcessAfterInitialization
6.bean 可以使用了
7.当容器关闭时候,调用 bean 的销毁的方法

内部Bean

将一个bean用作另一个bean的属性时,才声明为内部bean,内部bean总是匿名的

<bean id="" class="">
  <property name="">
    <bean class="">bean>
  property>
bean>

Spring装配

bean在Spring容器中装配在一起时,被称为bean装配
自动装配模式
no:显式bean引用进行装配
byName
byType
autodetect

@Autowired和@Resource的区别

@Autowired按照类型注入,配合@Qualifer 按照名称注入
@Resource默认按照名称注入,也可以按照类型注入

自动装配的局限

覆盖:使用构造器或者setter注入显式引用,覆盖自动装配
基本数据类型无法自动装配
不够精确

同名Bean

同一个配置文件,以最上面的定义为准
不同配置文件,后解析的会覆盖先解析的
同文件中的@ComponentScan和@Bean,@Bean生效(覆盖)

循环依赖

构造器的循环依赖
无法处理,直接抛异常
非单例循环依赖
无法处理
单例模式下setter循环依赖
通过三级缓存处理
singletonObjects:完全初始化好的bean
earlySingletonObjects:存放原始bean对象(未填充属性)
singletonFactories:存放bean工厂对象

A依赖B,B依赖A形成循环依赖

A实例化,曝光到三级缓存
A填充属性,需要使用B
B实例化
B填充属性,需要使用A,依次访问一二三级缓存,填充属性A
B初始化
B放到一级缓存
A访问一级缓存,填充属性B
A初始化
A放到一级缓存

Bean的线程安全问题

无状态的bean:没有数据存储功能,线程安全 singleton
有状态的bean:有数据存储功能,线程不安全 prototype
Spring使用ThreadLocal解决线程安全问题,如果Bean有多种状态,自行保证线程安全,定义ThreadLocal成员变量,将可变数据保存在hreadLocal中

AOP

面向切面编程,与面向对象编程相辅相成,面向对象编程的基本单元是类,面向切面编程的基本单元是切面

AOP的实现方式

静态代理
使用AOP框架提供的命令进行编译,从而在编译阶段就可以生成AOP的代理类,因此也称为编译时 增强
编译时编织(特殊编译器实现)
类加载时编织(特殊的类加载器实现)
动态代理
运行时在内存中生成AOP的动态代理类,也称为运行时增强。
JDK动态代理
利用反射实现,要求被代理类必须实现一个接口。JDK动态代理的核心是InvocationHandler接口和Proxy类
CGLIB动态代理
在运行时生成某个类的子类,通过继承的方式做动态代理,如果某个咧被标记为final,无法使用CGLIB动态代理

切面编程术语

目标:被通知的对象
代理:向目标对象应用通知之后生成的代理对象
连接点:目标对象中的所有方法
切入点:被增强的连接点
通知:增强的代码逻辑
切面:切入点+通知
织入:将通知应用到目标对象,生成代理对象的过程

通知类型

前置通知
后置通知
返回通知
异常通知
环绕通知

SpringAOP和AspectJAOP的区别

SpringAOP是基于动态代理实现的,AspectJAOP是基于静态代理实现的
SpringAOP支持方法级别的PointCut,提供了完全的AOP支持

Spring使用到了哪些设计模式

工厂模式:使用BeanFactory、ApplicationContext创建bean
代理模式:SpringAOP动态代理
单例模式:Spring中的bean默认都是单例的
模版方法:jdbcTemplate,redisTemplate等
观察者模式:事件驱动模型
适配器模式:AOP的增强或通知

Spring事务的实现方式

编程式事务:灵活性,难维护
声明式事务:代码分离,易维护

Spring事务管理的优点

不同事务API的一致性编程模型
API简单
支持声明式事务
集成各种数据访问抽象

Spring事务传播规则

PROPAGATION_REQUIRED:支持当前事务,如果没有当前事务,新建一个事务
PROPAGATION_SUPPORTS:支持当前事务,如果没有当前事务,以非事务方式运行
PROPAGATION_MANADATORY:支持当前事务,如果没有当前事务,抛出异常
PROPAGATION_NEW:新建事务,如果当前存在事务,把当前事务挂起
PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,把当前事务挂起
PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,抛出异常
PROPAGATION_NESTED:如果当前存在事务,嵌套事务执行,如果没有当前事务,新建一个事务

Spring事务的隔离级别

ISOLATION_read_uncommitted
ISOLATION_read_committed
ISOLATION_repeatable_read
ISOLATION_serializable

SpringMVC的工作流程

1.客户端发送请求,DispatcherServlet接受请求
2.DispatcherServlet调用HandlerMapping,解析请求对应的Handler
3.HandlerAdapter适配器处理
4.HandlerAdapter调用真正的Handler处理请求
5.返回ModelAndView对象
6.ViewResolver解析视图
7.DispatcherServlet进行时图渲染
8.返回view给浏览器

SpringMVC核心组件

DispatcherServlet:请求入口,接受请求,返回响应,协调各个组件工作
MultipartResolver:Multipart类型请求(如文件上传)解析器
HandlerMapping:请求处理器匹配器,负责找到处理器和拦截器
HandlerAdapter:处理器适配器:处理器实现多变,适配器执行处理器
HandleExceptionResolver:处理器异常解析器,将处理器执行时发生的异常转换成ModelAndView对象
RequestToViewNameTranslator:试图名称转换器,用于解析出请求的默认视图名
LocaleResolver:国际化解析器,提供国际化支持
ThemeResolver:主题解析器,提供可设置整体样式的风格
ViewResolver:视图解析器,根据视图名,获得最终的视图对象
FlashMapManager:FlashMap管理器,负责重定向时,保存参数值临时存储。

@Controller注解的作用

标记一个类为SpringMVC的控制器,SpringMVC会扫描到带有该注解的类,然后扫描这个类下带有RequestMapping注解的方法,根据注解信息,为这个方法生成一个处理器对象。

@RequestMapping注解的作用

配置处理器的请求方法,URI等信息,将请求和方法进行映射,这个注解也可以作用在类上面,作为控制器的前缀

@RestController的作用

包括@Controller和@ResponseBody,适合前后端分离架构,返回Json数据

SpringMVC的拦截器

自定义拦截器必须实现的三个方法
preHandle:执行处理程序之前调用
postHandle:执行处理程序之后调用
afterCompletion:完成请求后调用

统一的异常处理

@ControllerAdvice:标记一个异常处理类
@ExceptionHandler 标记一个异常处理方法,著名要处理的异常类型

Restful

rest:抽象状态转移,根据http协议从客户端发送数据到服务端
安全的Rest操作:是否改变服务端的资源
Restful是基于Http的,是无状态的
Rest通常是不安全的,需要开发人员自己实现安全机制

为什么要使用Springboot

Spring被称为配置地狱,Springboot弱化不必要的操作,提供默认配置,按需修改,快速搭建,开发和运行Spring应用
使用Springboot的好处
自动配置
方便的依赖管理:Springboot starter
嵌入式tomcat服务器,独立应用程序运行
非功能特性:安全和健康检查

Springboot如何实现多环境

创建不同环境的配置文件
application-dev.yml
application-test.yml
application-pre.yml
application-prod.yml
在application.yml中添加

spring:
	profiles:
  	activate:
    	dev/test/pre/prod

SpringBoot的核心注解

@SpringBootApplication
@SpringBootConfiguration 实现配置文件的功能
@EnableAutoConfiguration 打开自动配置功能
@ComponentScan:实现组件扫描功能

SpringBoot Starter

含义:启动器,包含了一系列可以集成到程序中的传递性依赖,可以一站式集成Spring及其他技术,保证程序能够快速持续的运行。
原理:
SpringBoot启动时会在starter包中寻找resources/META-INF/spring.factories文件,然后根据文件中配置的jar包去寻找项目依赖的jar包
根据spring.factories配置加载AutoConfigure类
根据@Contional 注解的条件进行自动配置并将bean注入Spring Context

你可能感兴趣的:(spring,java,后端)