一、关于Spring beans 和 依赖注入(Dependency Injection)

  spring boot 和 Spring 全家桶无缝衔接,开发过程中可以很轻松地使用 Spring 全家桶的技术来定义 beans 及其需要注入的依赖(their injected dependencies)。最常用的比如@ComponentScan (用于扫描和查找 beans ) 和 @Autowired (用于构造器注入),效果杠杠的,省去了很多配置。

  如果应用按照建议的代码结构来布局(主配置类在 root package 上),可不带参数直接加 @ComponentScan 即可自动扫描,把 root package 下所有有注解声明的 beans (@Component,@Service, @Repository, @Controller 等)都当作 spring beans 自动注册进来。

  例如下面这个例子,一个 @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;
    }

    // ...

}

   如果 bean 中含有一个构造器,可以忽略 @Autowired:

@Service
public class DatabaseAccountService implements AccountService {

    private final RiskAssessor riskAssessor;

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

    // ...

}

  小提示:final 表示赋值之后无法修改只想其他引用了。

二、关于 @SpringBootApplication 注解

  很多开发者在 spring boot 应用中使用 auto-configuration、 component scan,并且在应用类(application class)中定义了额外的配置。其实直接使用 @SpringBootApplication 注解就可以开启这3个特性了:

  • @EnableAutoConfiguration:开启 spring boot 的自动配置机制
  • @ComponentScan:开启 root package 或者指定 package 下的 @Component 扫描(简单理解为 bean 扫描)
  • @Configuration:允许注册其他 bean 到上下文 context,或者引入其他的配置类

  也即是说 @SpringBootApplication 注解再功能上对等于同时使用 @Configuration、@EnableAutoConfiguration 和 @ComponentScan ,而且这3个注解使用默认配置。例子如下:

package com.example.myapplication;

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);
    }

}

   注意点1:@SpringBootApplication 也提供了别名来指定 @EnableAutoConfiguration 和 @ComponentScan 的属性配置。

  注意点2:这几个特性都不是强制性的,可以根据需要进行替换或者直接不开启。例如,不想使用 component scan 功能的话,可以这样写:

package com.example.myapplication;

import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.ComponentScan
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@EnableAutoConfiguration
@Import({ MyConfig.class, MyAnotherConfig.class })
public class Application {

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

}

  上面这个例子除了有 @Component 注解的类不会被自动扫描检测外,和其他 spring boot 应用没啥两样,并且用户自定义的 beans 需要被显示 import 进来(@Import)。

  参考:spring-boot-reference.pdf 2.1.5.RELEASE 的 《17. Spring Beans and Dependency Injection》和《18. Using the @SpringBootApplication Annotation》

12-13 18:58