SpringBoot常见面试题

发布于:2024-09-19 ⋅ 阅读:(16) ⋅ 点赞:(0)

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差;


网站公告

今日签到

点亮在社区的每一天
去签到