Spring和SpringBoot的区别
Spring 和 Spring Boot 是两个完全不同的概念,虽然它们在名字上有一定的关联,但是它们的作用和定位是不同的。
Spring 是一个开源的企业级 Java 应用开发框架,它提供了一系列的解决方案来简化企业级应用开发的复杂性。Spring 框架支持各种应用程序,从小程序到大型企业级应用,包括 Web 应用程序、消息队列、批处理和大数据等,因此 Spring 被广泛应用于 Java 应用程序的开发。
Spring Boot 则是 Spring 生态系统中的一部分,它是使构建基于 Spring 的应用程序变得更快、更容易的工具。Spring Boot 提供了预先配置好的开发环境,可以极大地降低开发人员的工作量。开发人员可以使用 Spring Boot 快速创建独立的、产品级别的 Spring 应用程序,并且这些应用程序可以直接运行,而无需进行任何配置。
Spring Boot 与 Spring 的最大区别在于,Spring Boot 可以快速帮助开发人员创建可运行的、生产水平的应用,而 Spring 框架本身只是一个框架。Spring Boot 充分利用了 Spring 生态系统的各种模块,根据约定的配置来自动配置应用程序。开发人员可以根据需求选择所需的组件,而无需手动配置所有组件。
简单来说,Spring 是一种框架,用于简化 Java 应用程序的开发;Spring Boot 是一种工具,用于自动配置 Spring 应用程序,使得开发人员可以更快、更易地实现基于 Spring 的应用程序的开发。
SpringBoot核心注解
-
@SpringBootApplication
:一个组合注解,代表着一个Spring Boot应用,包括@Configuration, @EnableAutoConfiguration和 @ComponentScan。 -
@RestController
:常与@RequestMapping
一同使用,表示这是一个 REST 风格的控制器。该注解简化了@Controller
和@ResponseBody
两个注解的组合。 -
@RequestMapping
:用于将请求映射到控制器的处理方法上,支持 GET、POST、PUT 等 HTTP 请求方法。 -
@Autowired
:自动注入 Bean,实现了依赖注入。 -
@Value
:注入值,可以从配置文件中读取。 -
@Configuration
:标注该类为配置类,将一些组件加载到 Spring 容器。 -
@EnableAutoConfiguration
:自动配置注解,让 SpringBoot 自动加载所需的配置。 -
@ComponentScan
:自动扫描注解,指定扫描的包路径,以便 Spring Boot 能够自动加载 Spring 组件。 -
@EnableConfigurationProperties
:可选注解,用于绑定配置文件中的属性值。
以上是 Spring Boot 的部分核心注解,它们为 Spring Boot 应用的开发提供了方便和便捷。使用这些注解可以简化开发过程并提高开发效率。
SpringBoot自动配置
Spring Boot 自动配置(Auto-configuration)是指在 Spring Boot 应用中,当出现某个 Bean 时,Spring Boot 会在容器中自动配置该 Bean,而无需手动配置,从而减少了开发过程中的配置量和复杂度。
其工作原理是通过 Spring Boot 自动配置模块中的 META-INF/spring.factories
文件中配置的自动配置类自动创建 Bean。当 Spring Boot 启动时,自动配置模块中 spring-boot-autoconfigure-*.jar
文件中的 META-INF/spring.factories
中的自动配置类都会被加载,并按优先级顺序执行。
自动配置流程大致如下:
-
Spring Boot 启动时自动加载
spring-boot-autoconfigure-*.jar
包中的META-INFO/spring.factories
文件,寻找里面定义的自动配置类; -
在加载所有的自动配置类的时候,会根据类路径上的条件自动加入(Condition)各自的配置;
-
自动装配器(AutoConfigurationImportSelector)根据配置或条件判断是否需要自动配置;
-
自动装配器创建所有需要的 Bean;
-
自动配置完成后的 Bean 会以 Bean 容器的形式注入到应用中以供使用。
Spring Boot 自动配置的优点在于,它避免了对各种依赖和框架进行详细的配置,开箱即用,使我们的开发者可以更专注于业务逻辑的实现。同时,由于我们可以覆盖和定制自动配置,这就可以让我们在需要的时候手动进行调整和优化。
@ConfigurationProperties和@Value注解的作用和区别
@Value
和 @ConfigurationProperties
都可以注入值,它们的作用和区别如下:
-
作用:
@Value
注解用于注入一个具体的值或表达式,适用于简单场景。而@ConfigurationProperties
注解常用于将一个配置文件的属性值注入到一个 JavaBean 中,适用于复杂场景。 -
引用类型:
@Value
只支持基本数据类型和 String 类型。而@ConfigurationProperties
支持基本数据类型、String 类型、引用类型等。 -
读取值的方式:
@Value
注解只能从配置文件中读取值,不能从系统属性、环境变量中读取值。而@ConfigurationProperties
注解则可以通过 prefix 属性指定前缀,可以读取配置文件中的值,也可以从系统属性、环境变量中或者其它配置源中读取配置值。 -
校验:
@Value
不支持校验。而@ConfigurationProperties
支持校验,可以通过 @Validated 注解结合 JSR-303 标准进行校验。
因此,@Value
适用于简单的配置,而 @ConfigurationProperties
适用于复杂的配置。