譯自:https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using
4. Auto-configuration
Spring Boot auto-configuration嘗試根據添加的jar依賴項自動配置Spring應用程序。例如,如果HSQLDB在類路徑上,並且您沒有手動配置任何數據庫連接bean,那麼Spring Boot將自動配置內存中的數據庫。
您需要通過在@Configuration類中添加@EnableAutoConfiguration或@SpringBootApplication註解來啓用自動配置。
您應該只添加一個@SpringBootApplication或@EnableAutoConfiguration註解。我們通常建議您只將其中一個添加到主@Configuration類中。
4.1. Gradually Replacing Auto-configuration
auto-configuration是非侵入性的(non-invasive)。在任何時候,您都可以開始定義自己的配置來替換auto-configuration的特定部分。例如,如果您添加自己的DataSource bean,默認的嵌入式數據庫支持就會後退(backs away)。
如果您需要了解當前應用的auto-configuration以及原因,請使用--debug模式(the --debug
switch)啓動應用程序。這樣做可以爲選定的核心記錄器啓用調試日誌,並將條件報告記錄到控制檯。這樣做可以爲選定的核心記錄器啓用調試日誌,並將條件報告記錄到控制檯。
4.2. Disabling Specific Auto-configuration Classes
如果你發現某個你不想要的自動配置類正在被應用,你可以使用@SpringBootApplication的exclude屬性來禁用它們,如下所示:
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }) public class MyApplication { }
5. Spring Beans and Dependency Injection
您可以自由地使用任何標準Spring Framework技術來定義bean及其注入的依賴項。我們通常建議使用構造函數注入來連接依賴和@ComponentScan來查找bean。
如果您按照上面建議的方式構造代碼(將應用程序類定位在頂級包中),您可以不帶任何參數添加@ComponentScan或使用隱式包含它的@SpringBootApplication註釋。您的所有應用程序組件(@Component、@Service、@Repository、@Controller,以及其他)都自動註冊爲Spring bean。
下面的例子展示了一個@Service Bean,它使用構造函數注入來獲得一個所需的RiskAssessor Bean:
import org.springframework.stereotype.Service; @Service public class MyAccountService implements AccountService { private final RiskAssessor riskAssessor; public MyAccountService(RiskAssessor riskAssessor) { this.riskAssessor = riskAssessor; } // ... }
如果一個bean有多個構造函數,你需要用@Autowired標記你想讓Spring使用的構造函數:
import java.io.PrintStream; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class MyAccountService implements AccountService { private final RiskAssessor riskAssessor; private final PrintStream out; @Autowired public MyAccountService(RiskAssessor riskAssessor) { this.riskAssessor = riskAssessor; this.out = System.out; } public MyAccountService(RiskAssessor riskAssessor, PrintStream out) { this.riskAssessor = riskAssessor; this.out = out; } // ... }
6. Using the @SpringBootApplication Annotation
許多Spring Boot開發者喜歡他們的應用使用自動配置(auto-configuration)、組件掃描(component scan),並且能夠在他們的“應用類(application class)”上定義額外的配置(configuration)。一個@SpringBootApplication註釋可以用來啓用這三個特性,即:
- @EnableAutoConfiguration:啓用Spring Boot的自動配置機制(Spring Boot’s auto-configuration mechanism)
- @ComponentScan:在應用程序所在的包上啓用@Component scan(參見the best practices)
- @SpringBootConfiguration:允許在上下文中註冊額外的bean,或者導入額外的配置類。Spring標準@Configuration的替代方案,它可以幫助集成測試中的配置檢測(configuration detection)。
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; // Same as @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan @SpringBootApplication public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } }
這些特性都不是強制性的,您可以選擇用它啓用的任何特性來替換這個單一的註釋。例如,你可能不想在你的應用程序中使用組件掃描(component scan)或配置屬性掃描(configuration properties scan):
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.Import; @SpringBootConfiguration(proxyBeanMethods = false) @EnableAutoConfiguration @Import({ SomeConfiguration.class, AnotherConfiguration.class }) public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } }
在這個例子中,MyApplication和其他任何Spring Boot應用程序一樣,除了帶@Component註釋的類和帶@ConfigurationProperties註釋的類不會自動檢測到,用戶定義的bean會顯式導入(參見@Import)。
10. What to Read Next
現在,您應該瞭解如何使用Spring Boot以及應該遵循的一些最佳實踐。現在,您可以繼續深入瞭解Spring Boot的特定特性(specific Spring Boot features ),或者跳過它,閱讀Spring Boot的“生產準備(production ready)”方面的內容。