SpringBoot常见面试题
1.请说一说Spring Boot的自动装配原理?
@SpringBootApplication
@EnableAutoConfiguration
AutoConfigurationImportSelector组件
SpringFactoriesLoader读取
(1)META-INF/spring.factories 或者
(2)org.springframework.boot.autoconfigure.AutoConfiguration.imports 中的所有自动配置类;
条件注解进行过滤 ImportSlector接口
BeanDefinition
实例化Bean对象,放入Spring的IOC容器中;
2.如何实现一个自己的Spring Boot Starter?
1、写一个starter项目,一般是一个空壳,里面不写代码,主要起到依赖其他项目的作用; 2、写一个真正实现自动装配逻辑的项目,在项目classpath下写一个META-INF/spring.factories文件;
3、在spring.factories中添加配置: org.springframework.boot.autoconfigure.EnableAutoConfiguration = com.bjpowernode.xxxConfiguration
4、xxxConfiguration类需要添加注解@Configuration;
5、xxxConfiguration类一般也会使用@Conditional来适应不同的环境;
6、在xxxConfiguration类中编写具体代码实现自动化配置,给使用者把该配的配置好,让别人可以直接使用;
3.Spring Boot与SSM有什么区别和优势?
1.Spring MVC + Spring + MyBatis SSM随着版本的不断升级,依赖越来越多,配置越来越多,开发变得越来越重;
2.SpringBoot约定优于配置理念(convention over configuration),约定优于配置也称按约定编程,是一种软件设计范式,旨在减少软件开发人员对配置的维护,更加专注在实际业务逻辑上;
3.SpringBoot不再需要像SSM那样的繁琐配置,采用自动化配置,自动装配Bean;
4.Spring Boot能够直接使用java main方法运行,特别是通过main方法可以启动内嵌的Tomcat服务器运行Spring Boot程序,不需要单独部署Tomcat;
5.Spring Boot采用starter依赖来简化Maven配置,自动管理所有jar包版本,加入web starter,自动引入内嵌的Tomcat;当然还提供了大量的starter;
6.Spring Boot可以直接打成jar包运行,让部署变得简单;
7.SpringBoot核心目的是让开发变得简单;
8.SSM是手动挡汽车,SpringBoot是自动挡汽车;
4.Spring Boot项目如何兼容老的Spring项目?
实际开发中,有一些老的基于Spring开发的项目,想改造成基于Spring Boot开发,但是直接改造成Spring Boot的代价又太大,怎么办? 使用 @ImportResource 注解导入旧配置文件即可;
5.有了解过JavaConfig吗?
1.Java 5 推出,注解
2.Guice 框架 (IOC)
3.Spring 社区推出JavaConfig(采用注解方式开发)
4.Spring 3.0 JavaConfig 代替 xml配置
①@Bean
②@ComponentScan
③@EnableWebMvc
④@ImportResource
⑤@PropertySource
⑥@Value
6.Spring Boot如何排除某些类的自动装配?
1、spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration 2、 @SpringBootApplication(exclude = DataSourceAutoConfiguration.class) public class SpringbootApplication { }
7.Spring Boot项目中如何实现异步调用?
asynchronous call (异步调用) 一个无需等待 被调用函数的返回值 就能让操作继续进行的方法; 使用场景:
对于一些不需要在主线程流程中执行的任务;比如注册时发送欢迎短信;
不需要实时等待计算结果的任务;比如业务执行记录日志;
为了利用多核CPU并发执行的任务;比如下单时获取用户住址、用户余额、商品信息; 我们可以把这些任务异步执行,即放在另一个线程中去执行,从而避免主线程的阻塞和等待;
方式一:@EnableAsync + @Async + Future + ThreadPoolTaskExecutor
方式二:CompletableFuture + ThreadPoolTaskExecutor
8.SpringBoot默认是使用JDK动态代理还是CGLIB动态代理?为什么?
默认是使用CGLIB动态代理;
兼容性:
CGLIB动态代理可以代理任何类型的目标类,无论它是否实现了接口; [ 注意的是,类被final修饰,那么该不可被继承,即不可被代理;同样,类中final修饰的方法,该方法也不可被代理;] JDK动态代理只能代理实现了接口的目标类; 即CGLIB动态代理可以覆盖JDK动态代理的所有场景,而JDK动态代理不能覆盖CGLIB动态代理的所有场景; 所以,为了保证SpringBoot中的AOP(面向切面编程)功能可以应用于任何类型的Bean(无论它是否实现了接口),SpringBoot默认使用CGLIB作为代理的实现方式;
性能:
大家常说CGLIB动态代理性能比JDK性能好,不是主要原因,新版本的JDK做了很多优化,性能不比CGLIB差;