Spring篇

作者: markDownMan | 来源:发表于2023-03-29 22:47 被阅读0次

    来源:B站图灵课堂的视频

    1 BeanFactory和ApplicationContext的区别?
    1. ApplicationContext实现BeanFactory,具备BeanFactory的功能。
    2. ApplicationContext具备更多的功能,有国际化(MessageSource),环境变量(EnvironmentCapable),事件发布(ApplicationEventPubilsher)。
    2 SpringBoot,SpringMVC,和Spring有什么区别?
    1. Spring是一个IOC容器,用来管理bean,一个使用依赖注入实现控制反转。使用AOP将不同的方法抽取成切面,自动注入给方法执行,比如日志,异常。
    2. SpringMVC是Spring对web框架的一个解决方案,提供了一个DispatherServlet,处理请求,定义了一套路由策略(URL到handler的映射)以及适配执行handler,将handler处理结果用视图解析器生成视图返回到前端。
    3. SpringBoot是Spring提供的一个快速开发工具包,便于开发者更方便,快捷开发Spring+SpringMVC应用,简化配置,使用starter整合一些列解决方案(redis,mongodb,es)
    3 过滤器和拦截器的 5 个区别!
    1. 出身不同。过滤器依赖Servlet的包,拦截器依赖Spring的相关包。因此拦截器不仅可以在web项目应用,还能在appliaction,swing应用。
    2. 触发时机不同。请求-过滤器-servlet-拦截器-controller
    3. 实现原理不同。过滤器是上一级方法回调。拦截器是动态代理调用实现。
    4. 场景不同。过滤器偏通用功能过滤(字符编码,敏感词过滤,响应数据压缩),拦截器偏业务功能(权限判断,日志记录,登录判断)
    4 Spring事件监听机制概述

    SpringBoot中事件监听机制则通过发布-订阅实现,主要包括以下三部分:

    1. 事件 ApplicationEvent,继承JDK的EventObject,可自定义事件继承ApplicationEvent。
    2. 事件发布者 ApplicationEventPublisher,负责事件发布自定义事件。
    3. 事件监听者 ApplicationListener,继承JDK的EventListener,负责监听指定的事件。
    5 SpringBoot如何启动Tomcat?
    1. 创建Spring容器时,会利用@ConditionalOnClass
      技术判断当前classpath是否存在tomcat依赖,如果存在则会生成一个启动Tomcat的Bean。
    2. 容器创建后,获取启动Tomcat的Bean,并创建Tomcat对象,并绑定端口,启动Tomcat。
    6 SpringBoot常用注解以及底层实现?
    1. SpringBootApplication注解:3个注解组合
    • @SpringBootConfiguration:这个注解实际是一个@Configuration
    • @EnableAutoConfiguration:向Spring导入Selector,并自动加载classpath下META-INF/目录下的spring.factories文件所定义的自动配置类为Bean
    • @ComponentScan:标记扫描路径,默认扫描路径是启动类所在包,以及子包。
    1. @Bean注解:定义Bean,类似XML中的<bean>标签。Spring启动时,会对@Bean注解的方法解析,以方法名为BeanName作为Bean对象的Id。
    2. @Controller,@Service,@ResponseBody,@AutoWrited
    7 SpringBoot中配置文件的加载顺序?

    下面是SpringBoot项目读取配置文件的顺序,以优先级排序

    • config/application.properties(项目根目录中config目录下)
    • config/application.yml
    • application.properties(项目根目录下)
    • application.yml(项目根目录下)
    • resources/config/application.properties(项目- resources目录中config目录下)
    • resources/config/application.properties(项目resources目录中config目录下)
    • resources/config/application.yml
    • resources/application.properties(项目的resources目录下)
    • resources/application.yml
    8 SpringBoot自动配置原理?
    • 判断是否开启自动装配
    • 读取META-/INF/spring.factories文件的自动装配的所有配置类
    • 根据@ConditionOnXX注解,筛选满足条件的bean对象,并且注册到spring的ioc容器中。
    9 如何实现一个Starter?
    • 创建spring-boot-xxx-starter工程
    • 引入spring boot的的相关依赖
    • 创建XXConfigurtaion类,并用@Configuration注解,@Bean和@ConditionOnXX注解在部分方法
    • 在resources/创建META-INF/spring.factories

    @Configuration 和 @Component 注解的区别?
    @Configuration中所有带有@Bean注解的方法都被cglib动态代理,因此该方法返回的实例都是同一个。而@Component中@Bean注解的方法返回的实例都不同。

    10 SpringMVC的底层工作流程
    1. 客户端发送请求到前端控制器DispatcherServlet
    2. DispaterServlet收到请求调用HandlerMapping处理器映射器。
    3. HandlerMapping处理器映射器找到对应的处理器,生成处理器以及处理器拦截器一并返回到DispaterServlet
    4. DispaterServlet调用HandlerAdapter处理器适配器。
    5. HandlerAdapter经过适配调用具体的处理器Controller,即后端控制器。
    6. Controller执行并返回ModlerAndView
    7. HandlerAdapter将controller执行结果ModelAndView返回到DispaterServlet
    8. DispaterServlet将modelAndView传给ViewReslover视图解析器。
    9. ViewResolver解析并返回具体的view
    10. DispaterServlet根据view进行视图渲染,将模型数据填充至视图。
    11. DispatcherServlet响应用户。
    11 SpringMVC的9大组件
    1. HandlerMapping
      处理器映射器,根据用户请求的uri查询对应的Handler。
    2. HandlerAdapter
      处理器适配器,固定的Servlet处理方法调用灵活的Handler来处理。
      Handler是用来干活的工具;HandlerMapping是根据需要干的活找对应的工具;HandlerAdapter是使用工具干活的人;
    3. HandlerExceptionResolver 统一异常处理页面
    4. ViewResolver 视图渲染
    5. RequestToViewNameTranslator void返回类型交给他处理
    6. LocaleResolver 国际化
    7. ThemeResolver 主题解析
    8. MultipartResolver 上传文件请求
    9. FlashMapManager 重定向传递参数
    12 SrpingMVC的控制器是不是单例模式?如何保证线程安全?

    控制器是单例模式。单例模式会有线程安全问题。
    Spring保证线程安全的方法

    1. 将scope设置成非singlton。如:request,prototype
    2. 控制器设置成无状态模式,不要携带数据,引用无状态的service和dao。
    13 Spring框架用了哪些设计模式?
    1. 简单工厂:由一个工厂类根据参数,动态创建对象。
      Spring中的BeanFactory就是简单工厂模式的体现,根据传入唯一的标识符来获取Bean对象,多例Bean,Lazy-delay是传参后才创建的对象。

    2. 工厂方法

    3. 单例模式:Bean对象。

    4. 适配器模式:
      AdvisedAdapter-将advisor适配成MethodInterceptor

    5. 装饰者模式
      BeanWrapper-比单纯的Bean对象更强大

    6. 动态代理:
      AOP
      @Configuration
      @Lazy

    7. 观察者模式
      ApplicationListener-事件监听机制

    8. 策略模式
      InstantiationStrategy-Spring根据BeanDefinition实例化Bean,可以根据不同策略实例化。
      BeanNameGenerator-beanName生成器

    9. 构造器:
      BeanDefinitionBuilder-构造器
      StringBuilder

    10. 访问者:
      PropertyAccessor-属性访问器
      MessageSourceAccessor-国际化资源访问器

    14 bean的生命周期

    实例化-属性填充-初始化-销毁
    1.实例化
    new XXX(),主动创建,被动创建AOP,BeanDefinition对象保存
    2.属性填充
    Spring通过BeanDefinition找到对象依赖的其他对象,并赋予给当前依赖的对象。
    3.初始化
    Aware接口,BeanNameAware,BeanFactoryAware
    BeanPostProcessor接口前置处理,postProcessBeforeInitialization方法
    InitializingBean接口,afterPorpertiesSet方法
    init-method配置,调用配置的方法
    BeanPostProcessor接口后置处理,postProcessAfterInitialzation方法
    4.销毁
    DisposableBean:销毁前调用destory
    destory-method配置

    15 Spring的循环依赖

    A依赖B,B又依赖A
    单例
    第一个加载的bean对象不能是构造方法注入
    三级缓存,第一级存完整的对象,二级存new后,但没有填充属性,三级存储存储创建bean的工厂对象。

    -为什么需要二级缓存不能解决循环依赖?
    解决创建aop代理对象,如果在第二级缓存也加上这个判断,那么就会提前初始化代理对象。而代理对象的初始化是在postProcessAfterInitialization才执行的,如果在这里提前初始化,违背bean定义的生命周期。

    16 Spring事务失效的场景?

    1.public
    2.final,static
    3.方法内部调用
    4.spring是否开启事务
    5.库表是否支持事务。MyIASM不支持,InndoDB支持。
    6.抛自定义的Exception异常
    7.自己处理了异常,没有往外抛
    8.事务的传播特性,设置了never,如果上下文没有事务,则会报错。设置了require_new,非同一个事务,也不会回滚
    9.事务的传播特性,设置了nest,嵌套事务,比如一个事务方法包含save,update(嵌套事务),则save方法不会回滚。
    10.多线程。2个线程执行方法获取的连接不是同一个。
    11.没有配置spring事务管理器

    17 Spring容器启动流程是怎么样的?
    1. 扫描得到所有的 n对象,存入Map
    2. 筛选非懒加载的单例BeanDefinition进行创建Bean。
    3. 利用BeanDefinition创建Bean,包括Bean的创建的生命周期,包含合并BeanDefinition,推测构造方法,实例化,属性填充,初始化等操作,其中AOP发生在初始化的这一步骤。
    4. 单例Bean创建完之后,Spring会发布一个容器启动事件。
    5. Spring启动结束。
    18 @PostConstruct怎么实现?

    反射,如果方法里的注解等于PostConstruct就会执行。
    被@PostConstructor修饰的方法会在服务器加载Servlet(Bean)的时候执行,且只执行一次,类似servlet的init方法。在执行构造方法后,执行init方法前执行。

    19 Spring如何处理事务?
    1. 编程式事务:TransactionTemplate。
    2. 声明式事务:Spring在AOP基础上提供的事务实现机制。不需要在业务代码添加事务管理的代码,只需要在配置文件中做相关的事务规则声明即可。但是声明式事务只能支持方法级别的,不能针对代码级别。
    20 Spring事务的传播级别
    1. PROPAGATION_REQUIRED 有就加入事务,没有就创建事务。
    2. PROPAGATION_SUPPORTS 有就加入事务,没有以非实物方式执行。
    3. PROPAGATION_MANDATORY 有就加入事务,没有就抛出异常
    4. PROPAGATION_REQUIRED_NEW 无论有没有事务,都新建事务执行。
    5. PROPAGATION_NOT_SUPPORTED 以非事务执行,如果有事务抛出异常。
    6. PROPAGATION_NESTED 嵌套事务。外部事务回滚,内部事务必然回滚。内部事务回滚,如果
    21 Spring事务的隔离级别
    1. default:使用数据库默认的事务隔离级别
    2. 读未提交
    3. 读已提交
    4. 可重复读
    5. 所有事务依次执行
    22 Spring支持的几种作用域?
    1. signletion:单例
    2. prototype:多例
    3. request:每一个HTTP请求会创建一个单例对象
    4. session:每一个session会有创建一个单例对象
    5. application:ServletContext生命周期复用的一个单例对象。
    6. websocket:websocket生命周期复用的一个单例对象。
    23 Spring的Bean是线程安全的吗?

    Spring没有对Bean做线程安全的处理

    1. 如果Bean是无状态的,那么Bean则是线程安全的。
    2. 如果Bean是有状态的,那么Bean是线程不安全的。
    24 @autowrited和@Resouces

    都可以装载bean
    @autowrited是spring定义的,默认按照类型查找。
    @Resource是J2EE的标准,默认按照名称查找。

    25 Spring的事务底层原理?
    1. 数据库事务和AOP机制。
    2. @Transactional注解的Bean,创建代理对象
    3. 调用代理对象的方法,会判断该方法是否加@Transactional注解。
    4. 如果加了,就会利用事务管理器创建一个数据库连接。
    5. 且修改数据库连接的autocommit属性为false,禁止自动提交。
    6. 执行sql
    7. 提交事务。
    8. 异常回滚。
    9. Spring事务的隔离级别=数据库的隔离级别。
    10. Spring事务的传播机制是Spring事务自己实现的。
    11. Spring事务的传播机制是基于数据库连接实现的。一个数据库连接=一个事务,新开事务=新创建数据库连接。
    26

    相关文章

      网友评论

          本文标题:Spring篇

          本文链接:https://www.haomeiwen.com/subject/sphqddtx.html