一、Spring
1、Spring好处是什么?
轻量:spring是轻量的,基本的版本大约为2MB;
控制反转(IOC):Spring通过控制反转实现了松耦合;
面向切面编程(AOP):Spring支持面向切面编程,并且把应用业务逻辑和系统服务分开;
容器:Spring包含并管理应用中对象的生命周期和配置;
2、什么是Spring beans?
- Spring beans 是那些形成Spring应用的主干java对象,它们被Spring IOC初始化、装配和管理。这些beans通过容器中配置的元数据创建。比如:以XML文件的形式定义。
3、解释Spring框架中bean的生命周期
- 实例化一个bean,也就是new一个bean;
- 按照Spring上下文对实例化的bean进行配置,也就是IOC注入;
- 如果这个Bean已经实现了BeanNameAware接口,会调用它实现的SetBeanName(String)方法,此处传递的就是Spring配置文件中Bean的id值;
- 如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(BeanFactory)传递的是Spring工厂本身;
- 如果这个Bean已经实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文(同样这个方法也可以实现上一步的内容,但会比上一步实现的更好,因为ApplicationContext是BeanFactory的子接口,有更多的实现方法);
- 如果这个Bean关联了BeanPostProcessor接口,将会调用PostProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor经常会被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用那个的方法,也可以被应用于内存或缓存技术;
- 如果Bean在Spring配置文件中配置了init-method属性,会自动调用其配置的初始化方法;
- 如果这个Bean关联了BeanPostProcessor接口,将会调用PostProcessAfterInitizlization(Object ibj, String s);
- //注:以上工作完成以后就可以使用这个Bean了,这个Bean是一个单例的,所以一般情况下我们调用同一个id的Bean会是内容地址都相同的实例,当然在Spring配置文件中也可以配置非单例的Bean;
- 当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用那个其实现的destroy()方法;
- 最后,如果这个Bean的Spring配置了destory-mothod属性,会自动调用其配置的销毁方法;
4、Spring AOP的底层实现原理?
- 动态代理,在不修改原有类方法的基础上,通过代理对象实现原有类对象方法的增强,也就是扩展原有类对象的功能
5、SpringAOP的使用场景
- 项目中的事物、安全、日志等功能都可以使用AOP技术
6、Spring中的设计模式
- BeanFactory和ApplicationContext应用了工厂模式
- 在Bean的创建中,Spring提供了单例和原型模式
- AOP领域使用的是代理模式、装饰器模式
- 事件监听器使用的是观察者模式
- 类似JdbcTemplate等模版对象,使用的是模版模式
二、Spring MVC
1、Spring MVC的执行流程
- 客户端发出http请求,服务器收到请求,如果匹配DispatchServlet的请求映射路径(在web.xml中指定),web容器将请求转发交给DispatchServlet处理;
- DispatchServlet根据请求的信息(包括URL、http方法、请求报文头、请求参数、cookie等)及HandMapping的配置找到处理请求的处理器(Handler);
- 得到请求的Handler后,通过HandlerAdapter进行封装,再以同一的适配器接口调用Handler。HandlerAdapter是一个适配器,它用统一的接口对各种Handler方法进行调用;
- 处理器完成业务逻辑后,将返回一个ModelAndView给DispatchServlet。ModelAndView包含了视图逻辑名和模型数据信息;
- 当得到真实的视图队形view后,DispatchServlet就使用这个view对象,对ModelAndView中的模型数据进行视图渲染;
- 客户端得到相应信息,可能是HTML、xml、json等不同的媒体格式;
三、Spring boot
1、什么是Spring boot ?Spring boot有什么特性?
- Spring boot 不是对Spring功能上的增强,而是提供了一种快速使用Spring的方式;
- 用来简化Spring应用的初始搭建以及开发过程,使用特定方式来进行配置(properties或yml文件);
- 创建独立的Spring引用程序main方法运行;
- 嵌入的Tomcat无需部署war文件;
2、Spring boot 自动配置的原理?
- 在Spring程序main方法中,添加@SpringBootApplication或者@EnableAutoConfiguration会自动去maven中读取每个starter中的spring.factories文件,该文件里配置了所有需要被创建Spring容器中的Bean
3、Spring Boot中有哪些注解?
- @SpringBootApplication = @SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan
- @EnableAutoConfiguration 允许Spring Boot自动配置注解,开启这个注解后,Spring Boot就能根据当前类路径下的包或者类来配置Spring Bean
- @Configuration 这是Spring 3.0添加的一个注解,用来代替ApplicationContext.xml配置文件,所有这个配置文件里面能做到的事情都可以通过这个注解所在类来进行注册
- @SpringBootConfiguration 这个注解就是@Configuration注解的变体,只是用来修饰是SpringBoot配置,利于SpringBoot后续扩展
- @PostMapping = @RequestMapping(method = RequestMethod.POST)
- @Controller
- @RestController
- @Autowired
- @RestMapping
- @Service
- @Configuration
- @MapperScan(“com.abc.server”) 指定扫描包路径
- @Value
- @Transactional
四、Spring Cloud
1、什么是Spring Cloud?Spring Cloud有什么特性?
- Spring Cloud就是一套服务治理框架,它不会提供具体功能的操作,更专注于服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等
2、Spring Boot 和Spring Cloud的区别?
- Spring Boot是Spring的一套快速配置脚手架,可以基于Spring boot快速开发单个服务;
- Spring Cloud是一个基于Spring Boot实现的云应用开发工具
- Spring Boot专注于快速、方便集成单个个体,Spring Cloud是关注全局的服务治理框架;
- Spring Boot使用了默认大于配置的理念,很多集成方案已经帮你选择好了,能不配置就不配置;
- Spring Cloud很大一部分,是基于Spring Boot来实现的;
- Spring Boot可以离开Spring Cloud,独立使用开发项目,但是Spring Cloud 离不开Spring Boot,属于依赖关系;
3、Spring Cloud 组件
- Eureka 注册发现
- Zuul 服务网关
- Hystrix 降级熔断
- Ribbon 负载均衡
- Feign Rest客户端
- Config 分布式配置管理中心
- Bus 总线
- Task 批量任务
- Stream 数据流
- Sleuth 分布式追踪系统
4、Eureka 服务注册与发现
- 注册:服务提供者在启动时会将自己的信息注册到Eureka Server(双层结构的HashMap)
- 续约:维护一个中心持续发送信息给Eureka Server(注册中心)表示正常运行
- 下线:服务实例正常关闭时,它会发送一个服务下线的消息给注册中心
- 服务同步:同步服务列表到别的Eureka Server
5、Zuul 网关
- Zuul通过filter实现过滤功能,通过在运行时注入过滤规则:
用户鉴权、动态路由、灰度发布、A/B测试负载限流等功能
6、Ribbon
- Ribbon为客户端提供负载均衡:
随机(Random,Dubbo默认采用此方式)、轮询(Ribbon默认采用此方式)、一致性哈希、哈希、加权
7、Feign
- Feign 声明的伪RPC的REST客户端,基于Feign的动态代理机制,根据注解和选择的机器,拼接请求URL地址,发起请求:
封装Http调用流程、Spring Cloud 给Feign添加了支持Spring MVC注解、整合Ribbon及Eureka进行支持负载均衡
8、Hystrix 服务降级与熔断
- 提供服务隔离、熔断、降级机制
- 发起请求是通过Hystrix的线程池来走的,不同的服务走不同的线程池,实现了不同服务调用的隔离,防止服务出现雪崩
- 功能:
在复杂的分布式系统中阻止级联故障
快速失败,快速恢复
回退,尽可能优雅地降级
启用近实时监控、警报和操作
9、Nginx和Zuul区别?
- Nginx是C语言开发;Zuul是Java语言开发
- Zuul采用Ribbon + Eureka实现本地负载均衡功能;Nginx采用服务器实现负载均衡
- Nginx相比Zuul功能会更强大,因为Nginx整合一些脚本语言(Nginx + Lua)
- Nginx适合于服务器端负载均衡;Zuul 适合微服务中实现网关
10、Spring Cloud中有哪些注解?
- @EnableEurekaServer:把当前微服务标记为Eureka注册中心,接收其他微服务的注册
- @EnableEurekaClient:注册该微服务到Eureka中
- @HystrixCommand(fallbackMethod = “回调方法”)
- @FeignClient(value = “服务名”) 写在接口上,用来调用远程服务
五、Dubbo
1、Dubbo是什么?
- Dubbo是一个分布式服务框架,致力于提高性能和透明化的RPC远程服务调用方案。简单来说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要使用dubbo的,只有在分布式的时候,才有dubbo这样的分布式框架的需求。
其核心部分包含:
①远程通讯:提供多种基于长连接的NIO框架抽象封装,包括多种线程模型、序列化,以及“请求-响应”模式的信息交换方式;
②集群容错:提供基于接口方法的透明远程过程调用,包含多协议支持、软负载均衡、失败容错、地址路由、动态配置等集群支持;
③自动发现:基于注册中心目录服务,使服务提供方可以平滑增加或减少机器;
2、Dubbo能做什么?
- 透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需要简单配置,没有任何API侵入;
- 软负载均衡及容错机制;
- 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者;
3、Dubbo的架构
调用关系说明
- 0、服务容器负责启动、加载、运行服务提供者;
- 1、服务提供者在启动时,向注册中心注册自己提供的服务;
- 2、服务消费者在启动时,向注册中心订阅自己所需的服务;
- 3、注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接提送变更数据给消费者;
- 4、服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选用另一台调用;
- 5、服务消费者和远程提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心;
六、Mybatis
1、Mybatis的#{}和${}的区别是什么?
- ${}是变量占位符,属于静态文本替换,就是将传递进来的参数拼接在SQL中;
- #{}是参数占位符,会将参数替换成“?”,属于解析传递进来的参数,有效防止SQL注入,提高系统安全性;
2、Mybatis中,通常一个xml映射文件都会写一个Dao接口与之对应,请问这个Dao接口的工作原理是什么?Dao接口里的方法,当参数不同时,可以重载吗?
- Dao接口,就是人们常说的Mapper接口,接口的全路径名,就是映射文件中的namespace的值,接口的方法名,就是映射文件中MappedStatement的id值,接口方法内的参数就是传递给sql的参数。Mapper接口是没有实现类的,当调用接口方法时,接口全路径名+方法名拼接字符串作为key值,可唯一定位一个MappedStatment。Dao接口里的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Dao接口生成代理对象,代理对象会拦截接口方法,转而执行MappedStatment所代表的sql,然后将sql执行结果返回。
3、Mybatis是如何进行分页的?分页插件的原理是什么?
- Mybatis是针对结果集执行的内存分页,而不是物理分页,可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件完成物理分页。
- 分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内,拦截待执行的sql,然后重写sql,再添加对应的物理分页语句和物理分页参数。
4、为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?
- Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的;
- Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以Mybatis是半自动的ORM映射工具。
5、Mybatis一级缓存和二级缓存
- 一级缓存:基于PerpetualCache的HashMap本地缓存,其存储作用域为session,当session刷新或者关闭后,该session中所有缓存会被清空。默认打开一级缓存。
- 二级缓存:与一级缓存机制相同,默认也是采用PerpetualCache的HashMap存储,不同在于其作用域为Mapper(NameSpace),并且可自定义存储源。默认不打开二级缓存,要开启二级缓存,使用二级缓存的类要实现Serializable序列化接口。
- 对于缓存更新机制,当某一个作用域(一级缓存session/二级缓存NameSpace)进行了增删改操作后,默认该作用域下所有的查询中的缓存将被清除。