iT邦幫忙

2023 iThome 鐵人賽

DAY 9
0
自我挑戰組

探索 Spring Boot Doc系列 第 9

Doc 6.5 Spring Beans and Dependency Injection (一)

  • 分享至 

  • xImage
  •  

上一次官方文件看到Doc 6.4 ,今天接續者看 Doc 6.5

官方原文

You are free to use any of the standard Spring Framework techniques to define your beans and their injected dependencies. We generally recommend using constructor injection to wire up dependencies and @ComponentScan to find beans.

現在已經知道如何定義 Bean 以及他們的相依,官方這裡建議使用 constructor injection ( 建構子注入) 並透過 @ComponentScan 去掃描 bean 。

之前在 Doc 6.3 Configuration Classes & Doc 6.3.1 Importing Additional Configuration Classes,有使用的 @Configuration 外加 @Import 額外的註冊類別,而這裡提到 @ComponentScan,但其實這我們已經看過,就在介紹 @SpringBootApplicaton 之中的 屬性看過,就有透過 @AliasFor 去參考的 @ComponentScan 的 basePackages, basePackageClasses,nameGenerator 這三個屬性,在參考資料處放有官方JavaDoc 可供參考。

MyConfiguration Class

@Slf4j
@Configuration
@ComponentScan({"com.example.officialdocch6.component"})
public class MyConfiguration {

    @Bean
    public Engine engine() {
        return new Engine("v8", 5);
    }

    @Bean
    public Transmission transmission() {
        return new Transmission("sliding");
    }

}

Car Component

@Component
public class Car {

    private final Engine engine;
    private final Transmission transmission;


    public Car(Engine engine, Transmission transmission) {
        this.engine = engine;
        this.transmission = transmission;
    }



    @Override
    public String toString() {
        return String.format("Engine: %s Transmission: %s", engine, transmission);
    }

}

Engine 類別

public class Engine {

    private final String type;
    private final int volume;

    public Engine(String type, int volume) {
        this.type = type;
        this.volume = volume;
    }

    @Override
    public String toString() {
        return String.format("%s %d", type, volume);
    }
}

Transmission 類別

public class Transmission {

    private final String type;

    public Transmission(String type) {
        this.type = type;
    }

    @Override
    public String toString() {
        return String.format("%s", type);
    }

}

啟動入口

@Slf4j
@SpringBootApplication
public class OfficialDocCh6Application {

    public static void main(String[] args) {
        ApplicationContext applicationContext = SpringApplication.run(OfficialDocCh6Application.class, args);
        Car car = applicationContext.getBean(Car.class);
        log.info("Car ? " + car);
    }

}

在MyConfiguartion 之中我們分別註冊兩個 Engine 、 Transmission,Spring 透過 @ComponentScan 會去 com.example.officialdocch6.component 下方將所有標有 @Component 以及其延伸的標籤諸如 @Componet, @Repository, @Service, @Controller 等等註冊成 Bean,以這裡的範例會讀取 Car Component ,並透過Construtcor Injection,將這兩個 Bean 所注入,在官方的文件之中,會寫上 @Autowried 的標籤,但這部分可以省略,Spring 依舊會幫建構時候注入。

輸出結果
https://ithelp.ithome.com.tw/upload/images/20230924/20161770LJsAQXaOkW.png

Doc 6.3 用到的 @Configuration + @Import 的組合,剛剛用到 @Configuration + @ComponentScan ,@Import 、@ComponentScan 差異,前者是對準 bean 的註冊類別,後者是針對 component 的掃描。

參考資料:

{官方} setter injection versus constructor injection and the use of requires

https://spring.io/blog/2007/07/11/setter-injection-versus-constructor-injection-and-the-use-of-required

{官方} ComponentScan JavaDoc

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/ComponentScan.html

ComponentScan 原理解析

https://cloud.tencent.com/developer/article/1928592


上一篇
Configuration proxyBeanMethod
下一篇
Doc 6.5 Spring Beans and Dependency Injection (二)
系列文
探索 Spring Boot Doc30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言