1. Spring Boot 的了解,解决什么问题?
- 我的理解: Spring Boot 是一个基于 Spring 框架的快速开发脚手架,它简化了 Spring 应用的初始搭建和开发过程。
- 解决的问题:
- 简化配置: 传统的 Spring 应用需要大量的 XML 配置,Spring Boot 通过约定大于配置的原则,提供了大量的默认配置,减少了手动配置的工作量。
- 快速启动: Spring Boot 内嵌了常用的服务器(如 Tomcat、Jetty),可以直接运行,无需额外部署,大大缩短了开发周期。
- 依赖管理: Spring Boot 提供了 Starter POMs,将常用的依赖打包在一起,方便管理依赖,避免版本冲突。
- 监控和管理: Spring Boot Actuator 提供了对应用的监控和管理功能,如健康检查、指标收集等。
- 易于部署: Spring Boot 可以打包成独立的 JAR 包或 WAR 包,方便部署到各种环境。
- 总结: Spring Boot 提高了开发效率,降低了维护成本,使开发者可以更专注于业务逻辑的实现。
2. Spring Boot 的自动装配,为什么可以实现自动配置?
- 核心机制: Spring Boot 的自动装配基于 Spring 的条件化配置和
EnableAutoConfiguration
注解。 - 实现原理:
EnableAutoConfiguration
注解: 这是一个复合注解,包含了@Configuration
、@EnableImport
和@ComponentScan
等注解。@Configuration
:表明这是一个配置类。@EnableImport
:导入AutoConfigurationImportSelector
类,该类负责扫描和加载自动配置类。@ComponentScan
:扫描当前应用中的组件。
AutoConfigurationImportSelector
类: 该类实现了DeferredImportSelector
接口,负责延迟加载自动配置类。selectImports()
方法: 该方法会扫描META-INF/spring.factories
文件,该文件中定义了大量的自动配置类。- 条件化配置: Spring Boot 使用
@ConditionalOnClass
、@ConditionalOnBean
等条件化注解,根据当前环境中的类、Bean 等条件,决定是否加载某个自动配置类。
- 总结:
EnableAutoConfiguration
注解触发自动配置的扫描和加载,条件化注解决定是否应用某个自动配置,最终实现自动配置。
3. Spring Boot 怎么做到自动配置,加了 EnableAutoConfiguration
怎样扫描的?
- 详细流程:
@SpringBootApplication
注解: 通常在 Spring Boot 应用的启动类上使用,它包含了@EnableAutoConfiguration
注解。EnableAutoConfiguration
注解: 触发AutoConfigurationImportSelector
类的执行。AutoConfigurationImportSelector
类:selectImports()
方法: 从META-INF/spring.factories
文件中读取自动配置类的全限定名。SpringFactoriesLoader.loadFactoryNames()
方法: 负责加载spring.factories
文件中的配置。- 条件判断: 根据
@ConditionalOnClass
、@ConditionalOnBean
等条件化注解,判断是否需要加载某个自动配置类。 - 实例化 Bean: 如果满足条件,则将自动配置类实例化成 Bean,并添加到 Spring 容器中。
- 总结:
EnableAutoConfiguration
注解通过AutoConfigurationImportSelector
类扫描spring.factories
文件,并根据条件化注解加载自动配置类,最终实现自动配置。
4. 如果我想对 Spring Boot 有一些默认的配置,如何修改这些配置?
- 方法一:使用
application.properties
或application.yml
文件:- 这是最常用的方法,可以在
src/main/resources
目录下创建application.properties
或application.yml
文件,覆盖 Spring Boot 的默认配置。 - 示例:
application.properties
:server.port=8081 spring.datasource.url=jdbc:mysql://localhost:3306/mydb
application.yml
:server:port: 8081 spring:datasource:url: jdbc:mysql://localhost:3306/mydb
- 这是最常用的方法,可以在
- 方法二:使用命令行参数:
- 可以在启动应用时,通过命令行参数覆盖默认配置。
- 示例:
java -jar myapp.jar --server.port=8082 --spring.datasource.url=jdbc:mysql://localhost:3306/mydb
- 方法三:使用环境变量:
- 可以通过设置环境变量覆盖默认配置。
- 示例:
export SERVER_PORT=8083 export SPRING_DATASOURCE_URL=jdbc:mysql://localhost:3306/mydb java -jar myapp.jar
- 方法四:编写自定义配置类:
- 可以编写自定义的配置类,使用
@Configuration
注解,并使用@PropertySource
注解加载自定义的配置文件。 - 示例:
@Configuration @PropertySource("classpath:myconfig.properties") public class MyConfig {@Value("${my.property}")private String myProperty; }
- 可以编写自定义的配置类,使用
- 总结: 可以通过
application.properties
或application.yml
文件、命令行参数、环境变量或自定义配置类来修改 Spring Boot 的默认配置。
5. 那如果不想要默认的数据库,应该如何处理呢?
- 方法一:排除默认的数据源自动配置:
- 在启动类上使用
@SpringBootApplication
注解的exclude
属性,排除默认的数据源自动配置类。 - 示例:
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);} }
- 在启动类上使用
- 方法二:不提供数据源相关的依赖:
- 如果项目中没有引入任何数据源相关的依赖(如
spring-boot-starter-jdbc
、spring-boot-starter-data-jpa
),Spring Boot 就不会自动配置数据源。
- 如果项目中没有引入任何数据源相关的依赖(如
- 方法三:使用条件化配置:
- 可以使用
@ConditionalOnClass
或@ConditionalOnBean
等条件化注解,根据当前环境中的类或 Bean 来决定是否配置数据源。 - 示例:
@Configuration @ConditionalOnMissingBean(DataSource.class) public class NoDataSourceConfig {// 不配置数据源 }
- 可以使用
- 方法四:自定义数据源配置:
- 如果需要使用自定义的数据源,可以编写自定义的配置类,并使用
@Configuration
和@Bean
注解来配置数据源。 - 示例:
@Configuration public class MyDataSourceConfig {@Beanpublic DataSource myDataSource() {// 配置自定义的数据源DriverManagerDataSource dataSource = new DriverManagerDataSource();dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");dataSource.setUsername("root");dataSource.setPassword("password");return dataSource;} }
- 如果需要使用自定义的数据源,可以编写自定义的配置类,并使用
- 总结: 可以通过排除默认的数据源自动配置、不提供数据源相关的依赖、使用条件化配置或自定义数据源配置来处理不想要默认数据库的情况。