面试实战题-Spring技术栈

spring

Spring IOC 和DI

●谁依赖于谁:当然是应用程序依赖于IoC容器; ●为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源; ●谁注入谁:很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象; ●注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。

【第二章】 IoC 之 2.1 IoC基础 ——跟我学Spring3 - 《亿级流量网站架构核心技术》~ - ITeye博客

Spring的两种容器类型 (需要细化)

BeanFacotry是spring中比较原始的Factory。如XMLBeanFactory就是一种典型的BeanFactory。原始的BeanFactory无法支持spring的许多插件,如AOP功能、Web应用等。  ApplicationContext接口,它由BeanFactory接口派生而来,ApplicationContext包含BeanFactory的所有功能,通常建议比BeanFactory优先

spring的两种容器类型(spring揭秘)_spring 提供两种容器 使用的是哪一种-CSDN博客  BeanFactory和ApplicationContext的区别 - - ITeye博客 (具体使用案例)

BeanFactory简介以及和FactoryBean区别

BeanFactory是接口,提供了IOC容器最基本的形式,给具体的IOC容器的实现提供了规范,  FactoryBean也是接口,为IOC容器中Bean的实现提供了更加灵活的方式,FactoryBean在IOC容器的基础上给Bean的实现加上了一个简单工厂模式和装饰模式, 我们可以在getObject()方法中灵活配置。

https://www.cnblogs.com/aspirant/p/9082858.html  Spring系列之FactoryBean(一)_spring 实现 factorybean-CSDN博客(源码分析)

AOP与动态代理

使用 JDK 动态代理有一个致命的缺陷——它只能代理接口。也就是你的目标类必须实现接口。而 CGLIB 则即可以代理接口也可以通过继承的方式直接代理一个类。

从根上讲讲AOP——手敲一个简单的实现_手敲aop-CSDN博客

Spring事务

PROPAGATION_REQUIRED(spring 默认) PROPAGATION_REQUIRES_NEW PROPAGATION_SUPPORTS PROPAGATION_NESTED PROPAGATION_MANDATORY PROPAGATION_NOT_SUPPORTED  PROPAGATION_NEVER

详解spring事务_spring 同一个事务,获取他新增的内容-CSDN博客  SpringBoot 快速开启事务(附常见坑点) - 简书

Bean生命周期

bean实例化、属性注入 1、Bean自身的方法 2、Bean级生命周期接口方法 3、容器级生命周期接口方法  4、工厂后处理器接口方法

https://www.cnblogs.com/javazhiyin/p/10905294.html https://www.cnblogs.com/zrtqsk/p/3735273.html 

Spring如何解决循环依赖问题

单例属性注入,单例初始化时将实例放入singletonBeanFacory三级缓存

Spring 如何解决循环依赖的问题 - 简书

过滤器和拦截器的区别

拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。

https://www.cnblogs.com/panxuejun/p/7715917.html

如何获取ApplicationContext

实现ApplicationContextAware接口

spring项目中获取ApplicationContext对象,然后手动获取bean_applicationcontext.getbean-CSDN博客

@Resource和@Autowired注解的区别 

@Resource  默认按名称进行装配,通过name属性进行指定  @Autowired  默认按类型装配 ,也可以使用名称装配,配合@Qualifier注解

https://www.cnblogs.com/joe-tang/p/9213545.html

BeanFactoryPostProcessor接口作用

BeanFactoryPostProcessor的主要作用是让你能接触到bean definitions,对bean definitions进行一定修改,但是也仅此而已了。绝对不允许在BeanFactoryPostProcessor中触发到bean的实例化。否则有可能导致注解注入依赖失败。

使用BeanFactoryPostProcessor——这种姿势不要用 - 简书  spring4.1.8扩展实战之五:改变bean的定义(BeanFactoryPostProcessor接口)_spring 修改bean定义-CSDN博客 

springMVC

validator参数校验

1、快速失败  2、自定义校验  3、分组校验

https://www.cnblogs.com/mr-yang-localhost/p/7812038.html

spring mvc工作流程

1. 客户端请求提交到DispatcherServlet 2. 由DispatcherServlet控制器查询HandlerMapping,找到处理请求的Controller,返回Handler 3.DispatcherServlet拿到Handler后,找到HandlerAdapter(处理器适配器),通过它来访问处理器,并执行处理器。 4. DispatcherServlet将请求提交到Controller 5. Controller调用业务逻辑处理后,返回ModelAndView 6. DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图 7. 视图渲染,就是将ModelAndView对象中的数据放到request域中,用来让页面加载数据的。

spring mvc执行过程_spring mvc工作流程图-CSDN博客

struts2和spring mvc的区别

  1. spring MVC是通过servlet的方式进行拦截,在第一次请求发送时初始化,并随着容器关闭而销毁。 struts2是通过filter(拦截器)的方式进行拦截,在容器初始化时加载。晚于servlet销毁。 2/struts2 是类级别上的拦截,每次请求都会创建一个对应的action,spring MVC是方法级别上的拦截,一个请求对应着一个controller中的方法

https://www.cnblogs.com/slzys/p/10770959.html

session和cookie的区别

服务器从cookie里找到sessionID,再根据sessionID找到以前记录的用户信息就可以知道他之前操控些、访问过哪里

Cookie和Session的使用和区别 - 简书

拦截器、过滤器、监听器的使用场景

https://www.cnblogs.com/feng9exe/p/11217340.html

spring boot

spring boot starter机制

1、@Configuration&与@Bean->基于java代码的bean配置 2、@Conditional->设置自动配置条件依赖 3、@EnableConfigurationProperties与@ConfigurationProperties->读取配置文件转换为bean。 4、@EnableAutoConfiguration、@AutoConfigurationPackage 与@Import->实现bean发现与加载。从所有的jar包中读取META-INF/spring.factories文件信息。通过读取这个配置获取一组@Configuration类

https://www.cnblogs.com/hjwublog/p/10332042.html  springboot2.0自动注入文件spring.factories如何加载详解 - 简书 

spring boot启动流程

第一部分进行SpringApplication的初始化模块,配置一些基本的环境变量、资源、构造器、监听器,第二部分实现了应用具体的启动方案,包括启动流程的监听模块、加载配置环境模块、及核心的创建上下文环境模块,第三部分是自动化配置模块,该模块作为springboot自动配置核心

Spring Boot启动过程分析 - 简书  https://segmentfault.com/a/1190000014525138 

spring boot工作原理

同starter和启动流程

spring boot 工作原理_spring boot框架-CSDN博客  https://www.cnblogs.com/shamo89/p/8184960.html 

spring boot常用注解

@SpringBootApplication是一个复合注解,包含了@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan这三个注解。 @MapperScan

https://www.cnblogs.com/nihaorz/p/10528121.html

2.x版本特性

基础环境升级 1、最低 JDK 8,支持 JDK 9,不再支持 Java 6 和 7 依赖组件升级 1、Jetty 9.4,Jetty 是一个开源的 Servlet 容器,它为基于 Java 的 Web 内容,例如 JSP 和 Servlet 提供运行环境。 2、Tomcat 8.5,Apache Tomcat 8.5.x 旨在取代 8.0.x,完全支持 Java 9。Hibernate 5.2,Hibernate 是一款非常流行的 ORM 框架。Thymeleaf 3.0,Thymeleaf 3 相对于 Thymeleaf 2 有非常大的性能提升 默认软件替换 1、默认数据库连接池已从 Tomcat 切换到 HikariCP 2、redis客户端默认使用 Lettuce,替换掉Jedis.Lettuce 是一个可伸缩的线程安全的 Redis 客户端,用于同步、异步和反应使用 新技术的引入 1、响应式编程WebFlux,重要的变革 2、支持 Quartz,Spring Boot 2.0 给出了最简单的集成方式 3、对Kotlin 的支持 4、JOOQ 的支持,JOOQ 是基于 Java 访问关系型数据库的工具包

https://www.dazhuanlan.com/2020/03/01/5e5af45e164c8/?__cf_chl_jschl_tk__=df89d6bcbd39026c09ef0b6170d868dd7842cc74-1584579560-0-AawgtL0qS07VhaHIXaloaTq4RyEmJPZobSNewLlX1DH57z32ib_MNtrXEbcdtKUEng9Nw-8kkclM1HlSf7LpqN5Y9K6kf3dilTSnpJlLr4jzy5amwMUcoDKWMbu6kKpIFumXSwkfWL5Ar28TWUJ3iYigYsi0FlrQZOTI3k-R37wWFRNPti7d57-xtEKvOHqFShCT62rnDuNCSHlN1NgoZk-tH_6uDYebT6x1PuWtZnmiFeZWj26Mh3z_ZdzCjeFgGGUTLQN7aQvocuEinqUe8Rk7F4KSG_6c3GwJELlUrY_8Qd_KvAzXhjb7eccWYPxKrQ

默认使用的web容器类型

默认是tomcat,还支持Jetty和Undertow

https://www.jianshu.com/p/70233f90859c

Spring Cloud

Eureka自我保护机制

如果Eureka服务节点在短时间里丢失了大量的心跳连接(超过85%),那么这个Eureka节点会进入”自我保护模式“,同时保留那些“心跳死亡“的服务注册信息不过期。此时,这个Eureka节点对于新的服务还能提供注册服务,对于”死亡“的仍然保留,以防还有客户端向其发起请求。当网络故障恢复后,这个Eureka节点会退出”自我保护模式“。所以Eureka的哲学是,同时保留”好数据“与”坏数据“总比丢掉任何”好数据“要更好,所以这种模式在实践中非常有效。 这种模式旨在避免因网络分区故障导致服务不可用的问题

https://www.cnblogs.com/xishuai/p/spring-cloud-eureka-safe.html

Eureka工作流程

当 Eureka Client 从注册中心获取到服务提供者信息后,就可以通过 Http 请求调用对应的服务;服务提供者有多个时,Eureka Client 客户端会通过 Ribbon 自动进行负载均衡。

Eureka工作原理-CSDN博客

Eureka为什么设计成AP

作为一个分布式协同服务,ZooKeeper非常好,但是对于Service发现服务来说就不合适了;因为对于Service发现服务来说就算是返回了包含不实的信息的结果也比什么都不返回要好;再者,对于Service发现服务而言,宁可返回某服务5分钟之前在哪几个服务器上可用的信息,也不能因为暂时的网络故障而找不到可用的服务器,而不返回任何结果。所以说,用ZooKeeper来做Service发现服务是肯定错误的,如果你这么用就惨了! 在Eureka平台中,如果某台服务器宕机,Eureka不会有类似于ZooKeeper的选举leader的过程;客户端请求会自动切换到新的Eureka节点;当宕机的服务器重新恢复后,Eureka会再次将其纳入到服务器集群管理之中;而对于它来说,所有要做的无非是同步一些新的服务注册信息而已。所以,再也不用担心有“掉队”的服务器恢复以后,会从Eureka服务器集群中剔除出去的风险了。Eureka甚至被设计用来应付范围更广的网络分割故障,并实现“0”宕机维护需求。当网络分割故障发生时,每个Eureka节点,会持续的对外提供服务(注:ZooKeeper不会):接收新的服务注册同时将它们提供给下游的服务发现请求。这样一来,就可以实现在同一个子网中(same side of partition),新发布的服务仍然可以被发现与访问。

dockone.io

Eureka客户端缓存

即便Eureka集群中所有节点都失效,或者发生网络分割故障导致客户端不能访问任何一台Eureka服务器;Eureka服务的消费者仍然可以通过Eureka客户端缓存来获取现有的服务注册信息。甚至最极端的环境下,所有正常的Eureka节点都不对请求产生相应,也没有更好的服务器解决方案来解决这种问题时;得益于Eureka的客户端缓存技术,消费者服务仍然可以通过Eureka客户端查询与获取注册服务信息,这点很重要。 

dockone.io  

spring cloud工作流程

● Eureka:各个服务启动时,Eureka Client都会将服务注册到Eureka Server,并且Eureka Client还可以反过来从Eureka Server拉取注册表,从而知道其他服务在哪里 ● Ribbon:服务间发起请求的时候,基于Ribbon做负载均衡,从一个服务的多台机器中选择一台 ● Feign:基于Feign的动态代理机制,根据注解和选择的机器,拼接请求URL地址,发起请求 ● Hystrix:发起请求是通过Hystrix的线程池来走的,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题 ● Zuul:如果前端、移动端要调用后端系统,统一从Zuul网关进入,由Zuul网关转发请求给对应的服务

Spring Cloud原理解析-CSDN博客

hystrix隔离方式

当请求的服务网络开销比较大的时候,或者是请求比较耗时的时候,我们最好是使用线程隔离策略,这样的话,可以保证大量的容器(tomcat)线程可用,不会由于服务原因,一直处于阻塞或等待状态,快速失败返回。而当我们请求缓存这些服务的时候,我们可以使用信号量隔离策略,因为这类服务的返回通常会非常的快,不会占用容器线程太长时间,而且也减少了线程切换的一些开销,提高了缓存服务的效率。

Hystrix系列-5-Hystrix的资源隔离策略_feign整合hystrix 配置隔离策略-CSDN博客

ZUUL和Gateway比较

Gateway基于netty实现异步非阻塞调用 Zuul1.0基于servlet实现同步阻塞调用 Zuul2.0基于netty实现异步非阻塞

https://www.houjq.com/2018/08/zuul-gateway/

Zuul提供的功能

● 作用:API 网关,路由,负载均衡等多种作用。 ● 简介:类似 Nginx ,反向代理的功能,不过 Netflix 自己增加了一些配合其他组件的特性。 ● 在微服务架构中,后端服务往往不直接开放给调用端,而是通过一个 API网关根据请求的 url ,路由到相应的服务。当添加API网关后,在第三方调用端和服务提供方之间就创建了一面墙,这面墙直接与调用方通信进行权限控制,后将请求均衡分发给后台服务端。

https://www.cnblogs.com/rickiyang/p/12057661.html

Ribbon+Feign工作流程

● 首先,用户调用 Feign 创建的动态代理。 ● 然后,Feign 调用 Ribbon 发起调用流程。     ○ 首先,Ribbon 会从 Eureka Client 里获取到对应的服务列表。     ○ 然后,Ribbon 使用负载均衡算法获得使用的服务。     ○ 最后,Ribbon 调用 Feign ,而 Feign 调用 HTTP 库最终调用使用的服务。

http://svip.iocoder.cn  

spring cloud为什么使用http协议

目前很多大型项目多语言共存,http是最通用的协议,可以很好地解决跨语言跨平台兼容性。比如Dubbo协议,无法简单地实现跨语言。 http交互只是协议比较重,但不会慢太多,追求单机极致性能的确可以考虑换协议。目前微服务的一个重要理念就是水平扩展,慢这个问题通过业务设计还有多实例部署可以很好地提速。 http协议很成熟,并且特点为大家所熟知:1.支持客户/服务器模式。2.简单快速。3.灵活。4.无连接。5.无状态。

https://www.cnblogs.com/chen110xi/p/6349580.html https://www.zhihu.com/question/270355472 

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值