Spring,Springboot,Springcloud⾯试题
⽬录
Spring
IOC底层原理
IOC的基础实现是BeanFactory
spring ioc注解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
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论