目录

Spring

IOC底层原理

spring bean加载机制

事务传播机制

spring的循环依赖处理

BeanFactory和FactoryBean

Springboot

Springboot的启动流程和原理

spring boot和spring mvc的区别

说说你对spring boot 自动配置的理解

spring boot 的核心配置文件有哪些

spring boot 的核心注解

Spring Boot 可以兼容老 Spring 项目吗,如何做

Springcloud

Spring Cloud核心组件:Eureka

Spring Cloud核心组件:Feign

Spring Cloud核心组件:Ribbon

Spring Cloud核心组件:Hystrix

Spring Cloud核心组件:Zuul

Spring Cloud核心组件:Consul


Spring


  • IOC底层原理

IOC的基础实现是BeanFactory

Spring提供了两种容器类型:BeanFactory和ApplicationContext。

对于二者的用途可以进行简单划分:BeanFactory是Spring框架的基础设施,面向Spring本身;而ApplicationContext面向使用Spring框架的开发者,几乎所有的应用场合都应直接使用ApplicationContext而非底层的BeanFactory。

  • spring bean加载机制

首先通过扫描xml或者@component@Controller@Service注解获取bean,将属性封装到BeanDefintaion接口实现类BeanDefintaionParse

spring获取的时候直接从这里取,取出来存到一个CurrentHashMap里,这个Map存的key是对象的名字,比如Person这个对象,它的名字就是person,值是BeanDefination, 方便下次用

  • 事务传播机制

PROPAGATION_REQUIRED    如果没有事务就创建事务,有的话就加入。最常见和默认的机制

PROPAGATION_SUPPORTS   支持当前事务,如果没有事务就没有

PROPAGATION_MANDATORY 使用当前事务,如果当前没有事务就抛出异常

PROPAGATION_REQUIRES_NEW  新建事务,把当前事务挂起

PROPAGATION_NOT_SUPPORTED  非事务运行,吧当前事务挂起

PROPAGATION_NEVER  非实物运行,当前存在事务抛异常处理

PROPAGATION_NESTED   当前存在事务则嵌套执行,当前不存在事务则新建事务

 

  • spring的循环依赖处理

Spring是通过递归的方式获取目标bean及其所依赖的bean的

Spring实例化一个bean的时候,是分两步进行的,首先实例化目标bean,然后为其注入属性

结合这两点,也就是说,Spring在实例化一个bean的时候,是首先递归的实例化其所依赖的所有bean,直到某个bean没有依赖其他bean,此时就会将该实例返回,然后反递归的将获取到的bean设置为各            个上层bean的属性的

  • BeanFactory和FactoryBean

BeanFactory和FactoryBean都是接口

BeanFactory该接口是IoC容器的顶级接口,是IoC容器的最基础实现,也是访问Spring容器的根接口,负责对bean的创建,访问等工作。

FactoryBean:是一种工厂bean,可以返回bean的实例。Spring的核心接口,Spring本身就提供了70多个FactoryBean的实现,以Bean结尾,表示它是一个Bean,不同于普通Bean的是:它是实现了FactoryBean<T>接口的Bean,获取FactoryBean类型的bean时,如果beanName不加&则获取到对应bean的实例;如果beanName加上&,则获取到FactoryBean 本身的实例。

 

Springboot


  • Springboot的启动流程和原理

@SpringBootApplication核心注解在启动类上,包含 @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan

1. 执行SpringApplication的静态方法run();

2. 创建SpringApplication的实例然后调用非静态的run();

3. run()方法里获取SpringApplicationRunListeners

4. 创建environment

5. 打印banner

6. 创建ApplicationContext

7. 调用prepareContext()

7. 调用refreshContext()

8. 调用afterContext()

9. listeners调用 started方法传入ApplicationContext

 

 

 

 

 

  • spring boot和spring mvc的区别

1. spring boot 约定大于配置可以极少的配置或者不需要配置来启动spring

2.spring boot 有内置的容器, tomcat,jetty

3. spring boot 自带一些启动项,集成一些功能很方便。jpa,data,cache,Actuator(监控,很不错)

  • 说说你对spring boot 自动配置的理解

@EnableAutoConfiguration @Configuration, @ConditionalOnClass 就是自动配置的核心

通过在启动类上加@EnableAutoConfiguration 注解,@EnableAutoConfiguration 注解里存在@Import(AutoConfigurationImportSelector.class)里引入了这个类,在这个类里面会进行一系列操作找到具有META-INF/spring.factories文件的jar包,在我们的依赖spring-boot-autoconfigure.jar里面就有一个这样的文件,此文件中声明了具体有哪些自动配置:这个文件里面记录了需要自动配置的类

  • spring boot 的核心配置文件有哪些

有application和bootstrap

application主要用于spring boot的自动化配置

bootstrap可用于:

1. 一些固定不能被覆盖的配置

2. 使用 spring cloud config的时候添加连接到配置中心的配置属性,来加载外部配置文件

  • spring boot 的核心注解

@SpringBootApplication

该注解由三个注解组合而成:

@EnableAutoConfiguration 打开自动配置功能,exculd可排除一些自动配置

@Configuration  相当于配置文件

@ComponentScan spring 组件扫描

  • Spring Boot 可以兼容老 Spring 项目吗,如何做

可以兼容,使用 @ImportResource 注解导入老 Spring 项目配置文件。

 

Springcloud


Spring Cloud是一个全家桶式的技术栈,包含了很多组件。也就是Eureka、Ribbon、Feign、Hystrix、Zuul这几个组件

  • Spring Cloud核心组件:Eureka

注册中心

  • Spring Cloud核心组件:Feign

各微服务之间相互调用是如何实现的呢

Feign的一个关键机制就是动态代理, 首先你对一个service加上了@FeignClient注解, Feign就会对这个接口实现一个动态代理,接着调用这个接口就调用的动态代理,Feign会对你根据你接口中方法上定义的@RequestMapping等注解,来动态构造出你需要请求的地址,然后针对这个地址发起请求和解析响应

  • Spring Cloud核心组件:Ribbon

看完了Feign,现在问题又来了,分布式下如何知道请求哪服务,Ribbon就是解决问题的,它的作用是负载均衡,会均匀把请求分到各个服务器,它是如何分配的呢 默认是用的轮询算法

此外,Ribbon适合Eureka,Feign紧密结合起来

  • Spring Cloud核心组件:Hystrix

业务场景,一个业务流程里面要调用三个服务,其中一个服务挂了,每次都会卡上几分钟,然后抛出异常。

如果系统高并发情况下,最初的一个服务没有多余的线程处理请求了,也就跟着挂了,不响应其它请求。

多服务相互调用 如果没有报错措施,一个服务挂了就会引发连锁反应,导致别的服务也挂,如果最开始挂掉的方服务我们没有那么大的强依赖,大不了可以记录错误日志或者存库,等它恢复了慢慢处理

Hystrix 是隔离 熔断 以及降级的一个框架, 

说白了 Hystrix会搞很多小的线程,服务是一个线程池,每个线程池处理它的服务的请求,服务挂了 也就它的线程卡死,其它的服务照样运行,

但是如果服务挂了,每次都卡时间, 没有意义,就可以直接熔断,比如前5分钟内的请求都挂了,那就直接熔断直接返回。

当然熔断直接返回比较暴力,就可以请求降级 数据库里面存条数据等。

  • Spring Cloud核心组件:Zuul

路由  也就是微服务网关

假如系统有好多的微服务,客户端不可能要知道所有微服务的地址服务名,之类的。就全部请求发送到网关来路由,根据请求地址的一些特征

有个好处是 可以做统一的 降级 限流 认证授权 安全等

  • Spring Cloud核心组件:Consul

更多推荐

Spring,Springboot, Springcloud面试题