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;} }
- 如果需要使用自定義的數據源,可以編寫自定義的配置類,并使用?
- 總結:?可以通過排除默認的數據源自動配置、不提供數據源相關的依賴、使用條件化配置或自定義數據源配置來處理不想要默認數據庫的情況。
?