Spring面试题——第二篇
1. ApplicationContext通常的实现是什么
FileSystemXmlApplicationContext
: 此容器从一个XML文件中加载beans的定义,XML Bean配置文件的全路径名必须提供给他的构造函数。
ClassPathXmlApplicationContext
:此容器也从一个XML文件中加载beans的定义,这里需要正确设置classpath,因为这个容器将从classpath里找bean配置。
WebXmlApplicationContext
:此容器加载一个XML文件,此文件定义了一个Web应用的所有beans。
2. 什么是Spring IOC容器
Spring IOC容器负责创建对象、管理对象(通过依赖注入),装配对象、配置对象,并且管理这些对象的整个生命周期。
BeanFactory接口提供了一个先进的配置机制,使得任何类型对象的配置称为可能。ApplicationContext接口对BeanFactory进行了扩展,在BeanFactory的基础上添加了其他功能,比如和Spring的AOP更容易集成,也提供了处理message resource(国际化)的机制。
针对Web应用的WebApplicationContext是org.springframework.beans.factory.BeanFactory的Spring IOC容器的具体实现。BeanFactory接口是Spring IOC容器的核心接口。
3. BeanFactory和ApplicationContext有什么区别
BeanFactory可以理解为含有bean集合的工厂类
。
从表面上看,ApplicationContext和BeanFactory一样具有Bean定义、bean关联关系的设置,根据请求分发bean的功能,但是ApplicationContext在此基础上还提供了其他功能。
- 提供了支持国际化的文本消息。
- 统一的资源文件读取方式
- 已在监听器中注册的bean的事件。
4. Spring 支持的几种Bean的作用域(scope)
- singleton: bean在每个Spring IOC容器中只有一个实例
- prototype:一个bean的定义可以有多个实例
- request:每次http请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效。
- session:在一个Http Session中,一个bean定义一个实例,该作用域仅在基于web的Spring ApplicationContext情形下有效。
- global-session: 在一个全局的HTTP Session中,一个bean定义一个实例,该作用域仅在基于web的Spring ApplicationContext情形下有效。
缺省的Spring bean的作用域是singleton
。
5. Spring、SpringMVC、Spring Boot有什么区别
- Spring
Spring最重要的特征是依赖注入。所有Spring Modules不是依赖注入就是IOC控制反转。恰当的使用DI或者IOC的时候,可以开发松耦合应用。- Spring MVC
Spring MVC提供了一种分离式的方法来开发Web应用,通过运用像DispatcherServlet、ModelAndView、ViewResolver等简单概念,开发Web应用将会变的非常简单。- Spring Boot
Spring和Spring MVC的问题在于需要配置大量的参数,而Spring Boot通过一个自动配置和启动的项来解决这个问题。为了更快的构建产品就绪应用程序,Spring Boot提供了一些肺功能性特征。
6. Spring Boot的核心注解是哪个?由哪几个注解组成
核心注解@SpringBootApplication,由三个注解组成
- @SpringBootConfiguration:组合了@Configuration注解,实现配置文件的功能。
- @EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
- @ComponentScan: Spring组件扫描
7. SpringBoot自动配置原理是什么
自动配置依赖@EnableAutoConfiguration注解开启自动配置功能。
- 从配置文件META_INF/spring.factories加载可能用到的自动配置类。
- 去重,将exclude、excludeName属性携带的类排除。
- 过滤,将满足条件(@Conditional)的自动配置类返回。
8. SpringBoot的自动配置是如何实现的
SpringBoot项目的启动注解是:@SpringBootApplication,其实他是由下面三个注解组成
- @Configuration
- @ComponnetScan
- @EnableAutoConfiguration
其中@EnableAutoConfiguration是实现自动配置的入口,该注解又通过@Import注解导入了AutoConfigurationImportSelector,在该类中加载META-INF/spring.factories的配置信息。然后筛选出以EnableAutoConfiguration为key的数据,加载到IOC容器中
9. Spring Boot和Spring Cloud的区别
Spring Boot专注于快速方便的开发单个个体微服务。
Spring Cloud是关注全局的微服务协调整理治理框架
,将Spring Boot开发的一个个单体微服务整合并管理起来,为各个微服务之间提供,配置管理、服务发现、断路器、路由、微代理等等集成服务。
10. Spring Cloud核心组件及其作用,以及SpringCloud工作原理
Spring Cloud由以下几个核心组建构成:
Eureka
:各个服务启动时,EurekaClient都会将服务注册到Eureka Server中,并且Eureka Client还可以反过来从Eureka Server拉取注册表,从而知道其他服务在哪里。
Ribbon
:服务间发起请求的时候,基于Ribbon做负载均衡。
Feign
:基于Feign的动态代理机制,根据注解和选择的机器,拼接请求url,发起请求。
Hystrix
:发起请求是通过Hystrix的线程池来走的,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题。
zuul
: 如果前端、移动端要调用后端系统,统一从zuul网关进入,由zuul网关转发请求给对应的服务。
11. Spring Cloud实现服务注册和发现的原理是什么
- 服务在发布时指定对应的服务名(服务名包括了IP地址和端口号),将服务注册到注册中心(Eureka或者zookeeper)这一过程是Spring Cloud自动实现的,只需要在main方法添加@EnableDiscoveryClient即可,同一个服务修改端口就可以启动多个实例。
- 调用方法:传递服务名称通过注册中心获取所有的可用实例,通过负载均衡策略调用对应的服务。