前言
在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容器中。
那他是怎么掃描並注入組件的,下面看一下過程解析
流程解析
未完待續。。。。。。