springboot-构建

14. Structuring your code

14.1 Using the “default” package

官方建议使用反向域名定义包结构,比如com.example.project
如果一个类没有被定义在一个包中,它会被放在一个default package中,当这个类应用@ComponentScan @EntityScan @SpringBootApplication这几个注解的时候会对全部依赖jar包进行扫描,应该避免这种情况

14.2 Locating the main application class

主启动类一般在所有类的外面, 位于一个root package中
注解@EnableAutoConfiguration经常被用在main application class,并且默认指定一个特定搜索范围(search package, 但是具体没有说清楚,看读到后面有没说吧)
文档中举了个栗子,如果你是在写一个JPA的程序,@EnableAutoConfiguration会被指定扫描带@Bean注解的类
如果启动类在root package中,那@ComponentScan就可以不用定义具体的basePackage属性,也可以直接使用@SpringBootApplication
经典布局(直接复制官网):

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

Application.java是主启动类,定义了启动main方法

@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的很好的候选

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配置

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类上

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)

16.2 Disabling specific auto-configuration

如果有自己不想出现的某个自动配置, 可以使用@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来进行指定. 注解跟配置文件两种方式可同时定义使用

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容