spring boot experience

Spring Boot 采用“约定大于配置”的思想简化了配置(有默认的配置),而且将一些Spring提供的功能和配置抽象成为“Starter”开箱即用、按需引用。极大地简化了开发。

Spring Boot 应用程序提供嵌入式 HTTP 服务器,如 Tomcat 和 Jetty,可以轻松地开发和测试 web 应用程序

InitializingBean

beanPostAware

@PropertySource 的用法

https://www.cnblogs.com/binghe001/p/13455820.html

spring boot 自己实现starter,偏门。可以不看

自动配置

具体可以从以下几个方面回答:

  1. 什么是spring boot 自动装配?
  2. SB 如何实现自动装配?如何实现按需加载?
  3. 如何实现一个stater

这个有空可以看看,里面的内容如上。

淘宝一面:“说一下 Spring Boot 自动装配原理呗?” - 知乎
 

自动配置原理:

这一段回答就可以的:

 问到springboot 自动配置原理,只需要回答:
Spring Boot启动的时候会通过@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自动配置类,并对其进行加载,而这些自动配置类都是以AutoConfiguration结尾来命名的,它实际上就是一个JavaConfig形式的Spring容器配置类,它能通过以Properties结尾命名的类中取得在全局配置文件中配置的属性如:server.port,而XxxxProperties类是通过@ConfigurationProperties注解与全局配置文件中对应的属性进行绑定的。
 

参考:Spring Boot面试杀手锏————自动配置原理_Morty的技术乐园-CSDN博客_springboot自动配置原理(评论都说好)

1. Spring Boot 优点?

(2)使用 JavaConfig 有助于避免使用 XML。

(3)避免大量的 Maven 导入和各种版本冲突。

(6)没有单独的 Web 服务器需要。

(7)需要更少的配置 因为没有 web.xml 文件。只需添加用@Configuration 注释的类,然后添加用@Bean 注释的方法,Spring 将自动加载对象并像以前一样对其进行管理。您甚至可以将@Autowired 添加到 bean 方法中,以使 Spring 自动装入需要的依赖关系中。

2. Spring Boot 自动配置原理是什么?

注解 @EnableAutoConfiguration, @Configuration, @ConditionalOnClass 就是自动配置的核心,

@EnableAutoConfiguration 给容器导入META-INF/spring.factories 里定义的自动配置类。

筛选有效的自动配置类。

每一个自动配置类结合对应的 xxxProperties.java 读取配置文件进行自动配置功能

3. 你如何理解 Spring Boot 配置加载顺序?

在 Spring Boot 里面,可以使用以下几种方式来加载配置。

  • 1)properties文件;
  • 2)YAML文件;
  • 3)系统环境变量;
  • 4)命令行参数;

4. 什么是 YAML

YAML 是一种人类可读的数据序列化语言。它通常用于配置文件。与属性文件相比,如果我们想要在配置文件中添加复杂的属性,YAML 文件就更加结构化,而且更少混淆。可以看出 YAML 具有分层配置数据的功能

相比 properties 配置文件,YAML 还有一个缺点,就是不支持 @PropertySource 注解导入自定义的 YAML 配置。

5. Spring Boot 是否可以使用 XML 配置 ?

Spring Boot 推荐使用 Java 配置而非 XML 配置,但是 Spring Boot 中也可以使用 XML 配置,通过 @ImportResource 注解可以引入一个 XML 配置。

6. 什么是 Spring Profiles?

Spring Profiles 允许用户根据配置文件(dev,test,prod 等)来注册 bean。因此,当应用程序在开发中运行时,只有某些 bean 可以加载,而在 PRODUCTION中,某些其他 bean 可以加载。假设我们的要求是 Swagger 文档仅适用于 QA 环境,并且禁用所有其他文档。这可以使用配置文件来完成。Spring Boot 使得使用配置文件非常简单

7. 如何在自定义端口上运行 Spring Boot 应用程序?

为了在自定义端口上运行 Spring Boot 应用程序,您可以在application.properties 中指定端口。server.port = 8090

8. 如何实现 Spring Boot 应用程序的安全性

为了实现 Spring Boot 的安全性,我们使用 spring-boot-starter-security 依赖项,并且必须添加安全配置。它只需要很少的代码。配置类将必须扩展WebSecurityConfigurerAdapter 并覆盖其方法。

9. 跨域问题

10. websocket

WebSocket 是一种计算机通信协议,通过单个 TCP 连接提供全双工通信信道

  • 1、WebSocket 是双向的 —— 使用 WebSocket 客户端或服务器可以发起消息发送。
  • 2、WebSocket 是全双工的 —— 客户端和服务器通信是相互独立的。
  • 3、单个 TCP 连接 —— 初始连接使用 HTTP,然后将此连接升级到基于套接字的连接。然后这个单一连接用于所有未来的通信
  • 4、Light —— 与 http 相比,WebSocket 消息数据交换要轻得多

11. Spring Boot 中的 starter 到底是什么

我们在使用Web开发时,选择的是spring-boot-starter-web。starter是一种服务,使用某个功能的开发者不需要关注各种依赖库的处理不需要具体的配置信息,由Spring Boot自动通过classpath路径下的类发现并加载需要的Bean

SpringBoot Starter原理

参考:SpringBoot Starter原理(依赖引入,自动配置)

12. spring-boot-starter-parent 有什么用 ?

我们都知道,新创建一个 Spring Boot 项目,默认都是有 parent 的,这个 parent 就是 spring-boot-starter-parent ,spring-boot-starter-parent 主要有如下作用:

  • 定义了 Java 编译版本为 1.8 。
  • 使用 UTF-8 格式编码。
  • 继承自 spring-boot-dependencies,这个里边定义了依赖的版本,也正是因为继承了这个依赖,所以我们在写依赖时才不需要写版本号。
  • 执行打包操作的配置。
  • 自动化的资源过滤。
  • 自动化的插件配置。
  • 针对 application.properties 和 application.yml 的资源过滤,包括通过 profile 定义的不同环境的配置文件,例如 application-dev.properties 和 application-dev.yml。

参考:https://www.zhihu.com/question/426662759/answer/1739510301

也可以看看这个:https://segmentfault.com/a/1190000018854658

13. 微服务中如何实现 session 共享 

在微服务中,一个完整的项目被拆分成多个不相同的独立的服务,各个服务独立部署在不同的服务器上,各自的 session 被从物理空间上隔离开了,但是经常,我们需要在不同微服务之间共享 session ,常见的方案就是 Spring Session + Redis 来实现 session 共享。将所有微服务的 session 统一保存在 Redis 上,当各个微服务对 session 有相关的读写操作时,都去操作 Redis 上的 session 。这样就实现了 session 共享,Spring Session 基于 Spring 中的代理过滤器实现,使得 session 的同步操作对开发人员而言是透明的,非常简便。

参考:

​​​​​​全网最新、最全的Spring Boot面试题(2021最新版) - 知乎

这个太多了 有空看吧

Spring Boot面试题(2021最新版) - 云+社区 - 腾讯云

spring boot 与缓存的知识点:

肝完了,总结了SpringBoot与缓存的知识点,快速掌握_程序员springmeng-CSDN博客

1. 什么是spring boot starter

一系列依赖关系的集合,因为它的存在,项目的依赖之间的关系对我们来说变的更加简单了。

举个例子:在没有 Spring Boot Starters 之前,我们开发 REST 服务或 Web 应用程序时; 我们需要使用像 Spring MVC,Tomcat 和 Jackson 这样的库,这些依赖我们需要手动一个一个添加。但是,有了 Spring Boot Starters 我们只需要一个只需添加一个spring-boot-starter-web一个依赖就可以了,这个依赖包含的字依赖中包含了我们开发 REST 服务需要的所有依赖。

2. @SpringBootApplication 注解

  • @SpringBootConfiguration:允许在上下文中注册额外的 bean 导入其他配置类
    就是@Configuration 注解的派生注解,与其功能一致。
     
  • @EnableAutoConfiguration:启用 SpringBoot 的自动配置机制
  • @ComponentScan扫描被@Component (@Service,@Controller)注解的 bean,注解默认会扫描该类所在的包下所有的类。

3. Spring Boot 的自动配置是如何实现的

第一步:

因为@SpringBootApplication注解的原因,在上一个问题中已经提到了这个注解。我们知道 @SpringBootApplication看作是 @Configuration@EnableAutoConfiguration@ComponentScan 注解的集合。

  • @EnableAutoConfiguration:启用 SpringBoot 的自动配置机制
  • @ComponentScan: 扫描被@Component (@Service,@Controller)注解的 bean,注解默认会扫描该类所在的包下所有的类。
  • @Configuration:允许在上下文中注册额外的 bean 或导入其他配置类

@EnableAutoConfiguration是启动自动配置的关键。

@EnableAutoConfiguration 注解通过 Spring 提供的 @Import 注解导入了AutoConfigurationImportSelector@Import 注解可以导入配置类或者 Bean 到当前类中)。

AutoConfigurationImportSelector 类中有个方法,selectImport,这里面调用了getCandidateConfigurations方法会将所有自动配置类的信息以 List 的形式返回。这些配置信息被 Spring 容器作 bean 来管理

上述获取的过程会排除一些无效的配置类。

第二步:

而有了配置信息之后,查看META-INF/spring.factories 文件中的那些自动配置类,随便点进去个,发现有这种注解:

 所以对于“自动配置”,还应该和@Conditional 注解配合使用。

比如说WebSecurityEnablerConfiguration,其中声明了注解@ConditionalOnBean(WebSecurityConfigurerAdapter.class)

代表容器中必须还有WebSecurityConfigurerAdapter 类或其实现类

这样自动配置就完成了。

第三步:

注解 @EnableAutoConfiguration, @Configuration, @ConditionalOnClass 就是自动配置的核心,

@EnableAutoConfiguration 给容器导入META-INF/spring.factories 里定义的自动配置类。

筛选有效的自动配置类。

每一个自动配置类结合对应的 xxxProperties.java 读取配置文件进行自动配置功能

如:

@EnableConfigurationProperties(RedisProperties.class) 

可以参考下面小节的“自动配置原理”

 自动配置原理

@SpringBootApplication 注解是个组合注解

里面有三个注解@SpringBootConfiguration、@ComponentScan、@EnableAutoConfiguration

@EnableAutoConfiguration 注解使用@Import 导入了类EnableAutoConfigurationImportSelector

继承了类AutoConfigurationImportSelector

这个类中实现了诸多方法,自动配置的实现则是在selectImports 方法中

方法去加载了META-INF/spring.factories文件,取到该文件下的一系列类名,随后将这些类自动加载至IOC容器中。

这些类都属于内部存在自动配置的类,同样可以发现这些类名都是以AutoConfiguration结尾

总结一下,就是【1】通过@EnableAutoConfiguration注解,【2】加载AutoConfigurationImportSelector类中的selectImports方法,【3】进而扫描MATE-INF下的spring.factories文件下的自动配置类,并将其装配至IOC容器的过程。

参考:https://juejin.cn/post/6998885032467283976

4. 开发 RESTful Web 服务常用的注解有哪些?

  • @Autowired : 自动导入对象到类中,被注入进的类同样要被 Spring 容器管理。
  • 等等

5. Spirng Boot 常用的两种配置文件

可以通过 application.properties或者 application.yml 对 Spring Boot 程序进行简单的配置。

如果不进行配置的话,就是使用的默认配置

6. 什么是 YAML?YAML 配置的优势在哪里 ?

可读的数据序列化语言。它通常用于配置文件。与属性文件相比,如果我们想要在配置文件中添加复杂的属性,YAML 文件就更加结构化,而且更少混淆。可以看出 YAML 具有分层配置数据的功能。

缺点:不支持 @PropertySource 注解导入自定义的 YAML 配置。

7. Spring Boot 常用的读取配置文件的方法有哪些?

1. 通过@Value("${property}") 读取比较简单的信息

2. @ConfigurationProperties 读取并与bean 绑定

3. @PropertySource 读取指定的properties 文件

以上来自:https://juejin.cn/post/6962038430343626782

1. spring boot 的starter 是什么

依赖管理对于项目至关重要。当项目足够复杂时,管理依赖项可能会变成一场噩梦,因为涉及的组件太多了。

这就是Spring Boot 的 starter 就派上用场了。

每个starter都可以为我们提供所需要的Spring技术的一站式服务。并且以一致的方式传递和管理其他所需的依赖关系。所有官方starter都在 org.springframework.boot 组下,其名称以 spring-boot-starter- 开头 。非官方的starter的名称在前,如 mybatis-spring-boot-starter

2. 如何禁用特定的自动配置?

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})

或者@EnableAutoConfiguration 中的同上述配置

或者在配置文件中进行配置

3. 如何根据不同的条件来加载bean

使用@Conditional 系列注解

https://juejin.cn/post/6844903965730013197

@Bean 和@Configuration

参考:SpringBoot - @Configuration、@Bean注解的使用详解(配置类的实现)


@value 【spring 提供】的取值可以是:

  • 字面量
  • 通过 ${key} 方式从环境变量中获取值
  • 通过 ${key} 方式全局配置文件中获取值

@ConfigurationProperties(spring boot 提供)

标有 @ConfigurationProperties 的类的所有属性配置文件中相关的配置项进行绑定。(默认从全局配置文件中获取配置值),绑定之后我们就可以通过这个类去访问全局配置文件中的属性值了。

@Import 【Spring 提供】

@Import 注解支持导入普通 java 类,并将其声明成一个bean。主要用于将多个分散的 java config 配置类融合成一个更大的 config 类。

@Conditional 【Spring提供】

@Conditional 注释可以实现只有在特定条件满足时才启用一些配置。

 @Conditional 注解介绍

https://juejin.cn/post/6933002035537117198

Spring 启动过程

这个up 的ppt 貌似可以:

手把手带你剖析 Spring Boot 启动原理_哔哩哔哩_bilibili

 spring 自动配置原理,里面还有一些注解的解释

SpringBoot自动配置的原理详解 - 知乎

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值