Spring Boot 注解 ---- @Component


前言

在Spring Boot中,各種各樣的Bean都是交由Spring Boot進行管理,其中有一個比較特殊的Bean —— Component,名為組件。通過掃描類路徑加載到容器中。

作用

@Component注解表明一個類會作為組件類,並告知Spring要為這個類創建bean。
Bean和Component的區別

  • 相同點
    • 兩者的結果都是為Spring容器注入Bean
  • 不同點
    • @Component通常是通過類路徑掃描來偵測以及自動裝配Bean到Spring容器中
    • @Bean 注解通常是我們在標有該注解的方法中定義產生這個Bean的邏輯

父子注解及解釋

@Component是一個父注解,其下派生了許多子注解
其中比較常用的有:

  • @Configuration:標注這個類為配置類
  • @Repository:標注這個類為持久層
  • @Service:標注這個類為服務層
  • @Controller:標注這個類為控制層

使用方法

/**
 * 創建組件類
 */
@Component
public class Car {
    private String bread = "BYD";
    private Integer price = 0;


    public String getBread() {
        return bread;
    }

    public void setBread(String bread) {
        this.bread = bread;
    }

    public Integer getPrice() {
        return price;
    }

    public void setPrice(Integer price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Car{" +
                "bread='" + bread + '\'' +
                ", price=" + price +
                '}';
    }
}

/**
 * 引用方法
 * 此處兩個引用方法均按照Spring官方的規范編寫
 */
public class Test {
    /**
     * 引用方法1
     */
    @Resource
	private Car car;

    /**
     * 引用方法2:去掉上面@Resource注解
     */
    @Autowired
    public Test(Car car) {
    	this.car = car;
    }
}

源碼解析

注解源碼分析

/**
 * 表示帶注釋的類是“組件”。在使用基於注釋的配置和類路徑掃描時,
 * 此類類被視為自動檢測的候選對象。其他類級別的注釋也可以被視為標識
 * 組件,通常是一種特殊類型的組件,例如:
 *  @Repository注釋或AspectJ的@Aspect注釋。
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface Component {

	/**
	 * 指定當前Bean的名稱,在引入的時候根據bean的名稱引入即可
	 */
	String value() default "";

}

@Component的注釋上也說了他的作用 :

在使用基於注釋的配置和類路徑掃描時,此類類被視為自動檢測的候選對象。

這句話的意思是,在SpringBoot啟動的時候,會通過掃描當前包下所有注釋@Component的類,將他們實例化注入到Spring容器中。
那他是怎么掃描並注入組件的,下面看一下過程解析

流程解析

未完待續。。。。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM