springboot-構建

14. Structuring your code

14.1 Using the 「default」 package

官方建議使用反向域名定義包結構,好比com.example.project
若是一個類沒有被定義在一個包中,它會被放在一個default package中,當這個類應用@ComponentScan @EntityScan @SpringBootApplication這幾個註解的時候會對所有依賴jar包進行掃描,應該避免這種狀況java

14.2 Locating the main application class

主啓動類通常在全部類的外面, 位於一個root package中
註解@EnableAutoConfiguration常常被用在main application class,而且默認指定一個特定搜索範圍(search package, 可是具體沒有說清楚,看讀到後面有沒說吧)
文檔中舉了個栗子,若是你是在寫一個JPA的程序,@EnableAutoConfiguration會被指定掃描帶@Bean註解的類
若是啓動類在root package中,那@ComponentScan就能夠不用定義具體的basePackage屬性,也能夠直接使用@SpringBootApplication
經典佈局(直接複製官網):web

com
 +- example
     +- myproject
         +- Application.java
         |
         +- domain
         |   +- Customer.java
         |   +- CustomerRepository.java
         |
         +- service
         |   +- CustomerService.java
         |
         +- web
             +- CustomerController.java

Application.java是主啓動類,定義了啓動main方法spring

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

15. Configuration classes

(汗顏,沒有認真讀過spring api,不知道@Configuration的具體用法,
沒用過, 將就着看這段吧, 讀完springboot後去補spring)

springboot傾向於基於java進行配置,因此儘管能夠經過XML文件配置啓動main方法SpringApplication.run(), 官方仍是建議使用@Configuration註解
Usually the class that defines the main method is also a good candidate as the primary @Configuration.
這段不是很明白, 翻譯過來是一般定義main方法的類也是主@Configuration的很好的候選sql

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放到一個class中, 可使用@Import註解導入額外的配置類. 也可使用@ComponentScan自動掃描spring組件, 包括@Configuration類
本身經過代碼實現來理解數據庫

15.2 Importing XML configuration

即使必須使用xml源, 官方仍然建議使用@Configuration類, 而後使用一個註解@ImportResource來加載xml配置api

16. Auto-configuration

springboot的auto-configuration會嘗試根據你添加的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路徑下, 若是沒有手動配置數據庫鏈接, springboot會自動配置一個內嵌的數據庫.
你須要添加註解@EnableAutoConfiguration或者@SpringBootApplication到其中一個@Configuration類上來實現自動配置.
其實只須要添加一個@EnableAutoConfiguration註解到主要的那個@Configuration類上springboot

16.1 Gradually replacing auto-configuration

auto-configuration並無太大的侵入性, 你能夠在任什麼時候候手動設置替代特定的自動配置.
若是想知道如今哪些auto-configuration正在被使用以及爲何, 可使用--debug, 這回生成自動配置報告並輸出到控制檯(This will enable debug logs for a selection of core loggers and log an auto-configuration report to the console)app

16.2 Disabling specific auto-configuration

若是有本身不想出現的某個自動配置, 可使用@EnableAutoConfiguration中的exclude屬性將禁止它, 例以下dom

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來進行指定. 註解跟配置文件兩種方式可同時定義使用佈局

17. Spring Beans and dependency injection

你能夠自由使用任何標準的spring framework來定義beans以及注入依賴, 好比使用@ComponentScan來掃描beans, 使用@Autowired構造器來注入效果就不錯.
若是代碼構造如以前所推薦的(在根目錄加載Application類), 你能夠毫無爭議的使用@ComponentScan, 全部帶有(@Component @Service @Repository @Controller etc.)註解的類均可以自動註冊爲spring beans.
以下是一個使用構造器注入的@Servicebean

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有一個構造器, 能夠省略@Autowired

@Service
public class DatabaseAccountService implements AccountService {

    private final RiskAssessor riskAssessor;

    public DatabaseAccountService(RiskAssessor riskAssessor) {
        this.riskAssessor = riskAssessor;
    }

    // ...

}

這裏用構造器注入, 容許RiskAssessor被標記成final, 後續RiskAssessor不可改變

18. Using the @SpringBootApplication annotation

由於@ComponentScan @EnableAutoConfiguration @Configuration太常常組合使用了, 因此有一個@SpringBootApplication用來替代它們三個, 與這三個註解的默認屬性配置相同, 例以下

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的屬性

相關文章
相關標籤/搜索