• Spring八股文


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

    使用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>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    基于注解配置

    <beans>
      <context:annotation-config/>
    beans>
    
    • 1
    • 2
    • 3

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

    @Configuration
    public class Config(){
        @Bean
        public Bean bean(){
            return new Bean();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    @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>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    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
    
    • 1
    • 2
    • 3
    • 4

    SpringBoot的核心注解

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

    SpringBoot Starter

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

  • 相关阅读:
    并发支持库(2)-原子操作
    基于华为云 IoT 物联网平台实现家居环境实时监控
    try-except 搭配装饰器使用
    【Canvas】js用Canvas绘制漩涡螺旋图动画效果
    电工什么是电动势
    iOS 设置下载部分文件,如何获取完整文件的大小
    vector的基本实现
    【commons-lang3专题】005- ObjectUtils 专题
    o(1)复杂度找出栈中最小的元素
    「容器管理系统」 3. 初始化配置和日志监控
  • 原文地址:https://blog.csdn.net/m0_45362454/article/details/133695669