14. Structuring your code
14.1 Using the “default” package
官方建議使用反向域名定義包結(jié)構(gòu)敌呈,比如com.example.project
如果一個(gè)類沒有被定義在一個(gè)包中伦连,它會(huì)被放在一個(gè)default package中,當(dāng)這個(gè)類應(yīng)用@ComponentScan
@EntityScan
@SpringBootApplication
這幾個(gè)注解的時(shí)候會(huì)對(duì)全部依賴jar包進(jìn)行掃描荐吉,應(yīng)該避免這種情況
14.2 Locating the main application class
主啟動(dòng)類一般在所有類的外面, 位于一個(gè)root package中
注解@EnableAutoConfiguration
經(jīng)常被用在main application class,并且默認(rèn)指定一個(gè)特定搜索范圍(search package, 但是具體沒有說清楚口渔,看讀到后面有沒說吧)
文檔中舉了個(gè)栗子样屠,如果你是在寫一個(gè)JPA的程序,@EnableAutoConfiguration
會(huì)被指定掃描帶@Bean
注解的類
如果啟動(dòng)類在root package中缺脉,那@ComponentScan
就可以不用定義具體的basePackage
屬性痪欲,也可以直接使用@SpringBootApplication
經(jīng)典布局(直接復(fù)制官網(wǎng)):
com
+- example
+- myproject
+- Application.java
|
+- domain
| +- Customer.java
| +- CustomerRepository.java
|
+- service
| +- CustomerService.java
|
+- web
+- CustomerController.java
Application.java
是主啟動(dòng)類,定義了啟動(dòng)main方法
@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
15. Configuration classes
(汗顏攻礼,沒有認(rèn)真讀過spring api业踢,不知道@Configuration的具體用法,
沒用過, 將就著看這段吧, 讀完springboot后去補(bǔ)spring)
springboot傾向于基于java進(jìn)行配置,所以盡管可以通過XML文件配置啟動(dòng)main方法SpringApplication.run()
, 官方還是建議使用@Configuration
注解
Usually the class that defines the main method is also a good candidate as the primary @Configuration
.
這段不是很明白, 翻譯過來是通常定義main方法的類也是主@Configuration的很好的候選
15.1 Importing additional configuration classes
You don’t need to put all your @Configuration into a single class. The @Import annotation can be used to import additional configuration classes. Alternatively, you can use @ComponentScan to automatically pick up all Spring components, including @Configuration classes.
能看得懂, 但不理解, 硬翻不需要將所有的@Configuration放到一個(gè)class中, 可以使用@Import注解導(dǎo)入額外的配置類. 也可以使用@ComponentScan自動(dòng)掃描spring組件, 包括@Configuration類
自己通過代碼實(shí)現(xiàn)來理解
15.2 Importing XML configuration
即便必須使用xml源, 官方仍然建議使用@Configuration類, 然后使用一個(gè)注解@ImportResource
來加載xml配置
16. Auto-configuration
springboot的auto-configuration會(huì)嘗試根據(jù)你添加的jar包配置spring.
For example, If HSQLDB is on your classpath, and you have not manually configured any database connection beans, then we will auto-configure an in-memory database.
比如hsqldb在classpath路徑下, 如果沒有手動(dòng)配置數(shù)據(jù)庫(kù)連接, springboot會(huì)自動(dòng)配置一個(gè)內(nèi)嵌的數(shù)據(jù)庫(kù).
你需要添加注解@EnableAutoConfiguration或者@SpringBootApplication到其中一個(gè)@Configuration類上來實(shí)現(xiàn)自動(dòng)配置.
其實(shí)只需要添加一個(gè)@EnableAutoConfiguration注解到主要的那個(gè)@Configuration類上
16.1 Gradually replacing auto-configuration
auto-configuration并沒有太大的侵入性, 你可以在任何時(shí)候手動(dòng)設(shè)置替代特定的自動(dòng)配置.
如果想知道現(xiàn)在哪些auto-configuration正在被使用以及為什么, 可以使用--debug
, 這回生成自動(dòng)配置報(bào)告并輸出到控制臺(tái)(This will enable debug logs for a selection of core loggers and log an auto-configuration report to the console)
16.2 Disabling specific auto-configuration
如果有自己不想出現(xiàn)的某個(gè)自動(dòng)配置, 可以使用@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
屬性來指定有效的名字, 同樣可以使用property屬性spring.autoconfigure.exclude
來進(jìn)行指定. 注解跟配置文件兩種方式可同時(shí)定義使用
17. Spring Beans and dependency injection
你可以自由使用任何標(biāo)準(zhǔn)的spring framework來定義beans以及注入依賴, 比如使用@ComponentScan
來掃描beans, 使用@Autowired
構(gòu)造器來注入效果就不錯(cuò).
如果代碼構(gòu)造如之前所推薦的(在根目錄加載Application類), 你可以毫無爭(zhēng)議的使用@ComponentScan
, 所有帶有(@Component @Service @Repository @Controller etc.)注解的類都可以自動(dòng)注冊(cè)為spring beans.
如下是一個(gè)使用構(gòu)造器注入的@Service
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;
}
// ...
}
如果bean有一個(gè)構(gòu)造器, 可以省略@Autowired
@Service
public class DatabaseAccountService implements AccountService {
private final RiskAssessor riskAssessor;
public DatabaseAccountService(RiskAssessor riskAssessor) {
this.riskAssessor = riskAssessor;
}
// ...
}
這里用構(gòu)造器注入, 允許RiskAssessor被標(biāo)記成final, 后續(xù)RiskAssessor不可改變
18. Using the @SpringBootApplication annotation
因?yàn)?code>@ComponentScan @EnableAutoConfiguration
@Configuration
太經(jīng)常組合使用了, 所以有一個(gè)@SpringBootApplication
用來替代它們?nèi)齻€(gè), 與這三個(gè)注解的默認(rèn)屬性配置相同, 例如下
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
還提供了別名來定制@ComponentScan
@EnableApplicationConfiguration
的屬性