文章作者:Tyan
博客:noahsnail.com ?|? CSDN ?|? 簡書
14. 組織你的代碼
Spring Boot工作時不要求任何特定的代碼布局,但是有一些最佳實踐還是很有幫助的。
14.1 使用“default”包
當一個類沒有包含一個package
聲明時,它當做是在default package
中。通常情況下不建議使用default package
,應該避免使用它。當Spring Boot應用使用@ComponentScan
,@EntityScan
或@SpringBootApplication
它會引起一些特別的問題,因為Spring Boot會讀取每個jar中的每個類。
我們建議你遵循Java推薦的包命名規范,使用一個反轉的域名(例如,
com.example.project
)。
14.2 定義主應用類
通常我們建議你將你的主應用類放在其它類之上的根包中。@EnableAutoConfiguration
注解經常放在你的主類(main class)中,對于某些像它隱式的定義了一個基search package
,例如,如果你正在寫一個JPA應用,@EnableAutoConfiguration
注解的類所在的包將被用來搜索@Entity
項。
根包的應用也允許使用@ComponentScan
注解而不需要指定basePackage
特性。如果你的主類是在根包中,你也可以使用@SpringBootApplication
注解。
下面是一個典型的布局:
com
+- example
+- myproject
+- Application.java
|
+- domain
| +- Customer.java
| +- CustomerRepository.java
|
+- service
| +- CustomerService.java
|
+- web
+- CustomerController.java
Application.java
文件會聲明main
方法和基本的@Configuration
。
package com.example.myproject;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
15. 配置類
Spring Boot支持基于Java的注解。盡管可以通過XML源調用SpringApplication.run()
方法,但我們通常建議你主要的源是一個@Configuration
類。
網上已經發布了許多使用XML配置來進行Spring配置的例子。但要盡可能的嘗試使用等價的Java注解。搜索
enable*
注解是一個好的開端。
15.1 導入額外的配置類
你不必將所有的@Configuration
放到一個單獨的類中。可以使用@Import
注解來導入額外的配置類?;蛘?,你可以使用@ComponentScan
來自動獲得所有的Spring組件,包括@Configuration
類。
15.2 導入XML配置
如果你絕對的必須使用基于XML的配置,我們推薦你仍然從@Configuration
類開始。你可以使用額外的@ImportResource
注解來加載XML配置文件。
16. 自動配置
Spring Boot自動配置會基于你添加的jar依賴試圖自動配置你的Spring應用。例如,如果HSQLDB
在你的classpath中,并且你沒有手動的配置任何數據庫連接beans,我們將會在自動配置一個內存中的數據庫。
你需要通過添加@EnableAutoConfiguration
或@SpringBootApplication
注解到你的@Configuration
類中的一個來選擇性的加入自動配置。
你應該僅添加一個
@EnableAutoConfiguration
注解。我們通常建議你將它添加到你主要的@Configuration
類中。
16.1 逐漸替換自動配置
自動配置是非入侵性的,在任何時候你都可以開始定義你自己的配置來替換自動配置的指定部分。例如,如果你要添加你自己的DataSource
bean,默認嵌入的數據庫支持將會退出。
如果你需要找出當前正在應用的自動配置和為什么,你可以用--debug
開關來啟動你的應用。這將會使核心日志的輸出級別變為debug級別并輸出一個自動配置報告到控制臺。
16.2 禁用特定的自動配置
如果你發現正在應用特定的你不想使用的自動配置類,你可以使用@EnableAutoConfiguration
注解的exclude
特性來禁用它們。
import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.jdbc.*;
import org.springframework.context.annotation.*;
@Configuration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class MyConfiguration {
}
如果這個類不在classpath中,你可以使用這個注解的excludeName
特性并指定全限定名來代替。最后,你也可以通過spring.autoconfigure.exclude
屬性來排除,從而控制自動配置類的列表。
你也可以在注解級別或使用屬性來定義排除項。
17. Spring Beans和依賴注入
你可以自由的使用任何標準的Spring框架技術來定義你的beans和它們注入的依賴。為了簡便,我們經常使用@ComponentScan
來發現你的beans,結合@Autowired
構造函數注入也工作的很好。
如果你根據上面的建議組織你代碼(將你的應用類放在根包中),你可以添加@ComponentScan
注解而不需要任何參數。你所有的應用組件(@Component
,@Service
,@Repository
,@Controller
等等)將會作為Spring bean進行自動注冊。
下面是一個@Service
Bean的例子,通過使用構造函數注入來獲得RiskAssessor
bean。
package com.example.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class DatabaseAccountService implements AccountService {
private final RiskAssessor riskAssessor;
@Autowired
public DatabaseAccountService(RiskAssessor riskAssessor) {
this.riskAssessor = riskAssessor;
}
// ...
}
注意使用構造函數注入允許
riskAssessor
字段標記為final
,意味著它接下來不能被修改。
18. 使用@SpringBootApplication注解
許多Spring Boot的開發者總是在它們的主類上加上@Configuration
,@EnableAutoConfiguration
和@ComponentScan
注解。由于這些注解頻繁的在一起使用(尤其是你遵循上面的最佳實踐時),Spring Boot提供了一個方便的@SpringBootApplication
注解來代替它們。
@SpringBootApplication
注解等價于使用@Configuration
,@EnableAutoConfiguration
和@ComponentScan
以及它們的默認特性:
package com.example.myproject;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@SpringBootApplication
也提供了別名來定制@EnableAutoConfiguration
和@ComponentScan
的特性。