Spring篇

您所在的位置:网站首页 spring框架实现原理 Spring篇

Spring篇

2023-04-06 23:30| 来源: 网络整理| 查看: 265

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

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

事件 ApplicationEvent,继承JDK的EventObject,可自定义事件继承ApplicationEvent。 事件发布者 ApplicationEventPublisher,负责事件发布自定义事件。 事件监听者 ApplicationListener,继承JDK的EventListener,负责监听指定的事件。 5 SpringBoot如何启动Tomcat? 创建Spring容器时,会利用@ConditionalOnClass 技术判断当前classpath是否存在tomcat依赖,如果存在则会生成一个启动Tomcat的Bean。 容器创建后,获取启动Tomcat的Bean,并创建Tomcat对象,并绑定端口,启动Tomcat。 6 SpringBoot常用注解以及底层实现? SpringBootApplication注解:3个注解组合 @SpringBootConfiguration:这个注解实际是一个@Configuration @EnableAutoConfiguration:向Spring导入Selector,并自动加载classpath下META-INF/目录下的spring.factories文件所定义的自动配置类为Bean @ComponentScan:标记扫描路径,默认扫描路径是启动类所在包,以及子包。 @Bean注解:定义Bean,类似XML中的标签。Spring启动时,会对@Bean注解的方法解析,以方法名为BeanName作为Bean对象的Id。 @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的底层工作流程 客户端发送请求到前端控制器DispatcherServlet DispaterServlet收到请求调用HandlerMapping处理器映射器。 HandlerMapping处理器映射器找到对应的处理器,生成处理器以及处理器拦截器一并返回到DispaterServlet DispaterServlet调用HandlerAdapter处理器适配器。 HandlerAdapter经过适配调用具体的处理器Controller,即后端控制器。 Controller执行并返回ModlerAndView HandlerAdapter将controller执行结果ModelAndView返回到DispaterServlet DispaterServlet将modelAndView传给ViewReslover视图解析器。 ViewResolver解析并返回具体的view DispaterServlet根据view进行视图渲染,将模型数据填充至视图。 DispatcherServlet响应用户。 11 SpringMVC的9大组件 HandlerMapping 处理器映射器,根据用户请求的uri查询对应的Handler。 HandlerAdapter 处理器适配器,固定的Servlet处理方法调用灵活的Handler来处理。 Handler是用来干活的工具;HandlerMapping是根据需要干的活找对应的工具;HandlerAdapter是使用工具干活的人; HandlerExceptionResolver 统一异常处理页面 ViewResolver 视图渲染 RequestToViewNameTranslator void返回类型交给他处理 LocaleResolver 国际化 ThemeResolver 主题解析 MultipartResolver 上传文件请求 FlashMapManager 重定向传递参数 12 SrpingMVC的控制器是不是单例模式?如何保证线程安全?

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

将scope设置成非singlton。如:request,prototype 控制器设置成无状态模式,不要携带数据,引用无状态的service和dao。 13 Spring框架用了哪些设计模式? 简单工厂:由一个工厂类根据参数,动态创建对象。 Spring中的BeanFactory就是简单工厂模式的体现,根据传入唯一的标识符来获取Bean对象,多例Bean,Lazy-delay是传参后才创建的对象。 工厂方法 单例模式:Bean对象。 适配器模式: 装饰者模式 动态代理:AOP 观察者模式 策略模式 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容器启动流程是怎么样的? 扫描得到所有的BeanDefinition对象,存入Map 筛选非懒加载的单例BeanDefinition进行创建Bean。 利用BeanDefinition创建Bean,包括Bean的创建的生命周期,包含合并BeanDefinition,推测构造方法,实例化,属性填充,初始化等操作,其中AOP发生在初始化的这一步骤。 单例Bean创建完之后,Spring会发布一个容器启动事件。 Spring启动结束。 18 @PostConstruct怎么实现?

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

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

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

如果Bean是无状态的,那么Bean则是线程安全的。 如果Bean是有状态的,那么Bean是线程不安全的。 24


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3