寫在前面java
在spring大行其道的今天,對於spring的使用和掌握乃是不可缺乏的必備技能。可是spring的整個體系尤其龐大,對它的學習,還得從基礎一點一滴的慢慢積累。本文主要介紹
@Component
註解在spring中的簡單使用,以及註解的派生性
和層次性
spring
@Component
註解是一個元註解,便可以標註在其它的註解上。在spring中,任何被@Component
註解標識的組件均爲組件掃描的候選對象,而且被@Component
元註解標註的註解,在任何組件標註它時,也被視做組件掃描的候選對象。簡單來講,就是在spring中,一個普通的javaBean被@Component
註解標記後,在使用基於註解配置和類路徑掃描時,會被做爲候選組件,添加到spring容器中app
package com.spring.study.ioc.register; /** * spring掃描的候選組件 * * @author TangFD * @since 2019/6/25. */ @Data @Component public class TestComponent { private String id = "@Component"; }
添加spring啓動引導類,以及spring啓動時須要掃描的類路徑學習
/** * spring 容器啓動引導類 * * @author TangFD * @since 2019/6/25. */ @ComponentScan("com.spring.study.ioc.register") public class TestComponentBootstrap { public static void main(String[] args) { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(TestComponentBootstrap.class); System.out.println("context id : " + applicationContext.getId()); TestComponent bean = applicationContext.getBean(TestComponent.class); System.out.println("TestComponent bean : " + bean); applicationContext.close(); } }
spring容器啓動後,控制檯打印的結果:code
context id : org.springframework.context.annotation.AnnotationConfigApplicationContext@21b8d17c
TestComponent bean : TestComponent(id=@Component)component
如此,在spring中經過簡單在一個普通的javaBean上添加@Component
註解,再加上掃描類路徑,就能夠將該javaBean添加到spring容器中。spring就能夠對這個Bean的生命週期進行管理。對象
前面提到
@Component
是一個元註解,當它標記在另外一個註解上時,該組件一樣會具備被spring掃描,並識別組件的能力。在spring中,被@Component
標記的註解有不少,例如:@Controller
,@Service
,@Repository
,當一個普通的javaBean被這些註解標註時,spring容器啓動時一樣會把該Bean視爲候選組件,添加到容器中。繼承
將上面TestComponent
類的註解換成@Service
,結果也是相同的生命週期
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface Service { @AliasFor(annotation = Component.class) String value() default ""; }
/** * spring掃描的候選組件 * * @author TangFD * @since 2019/6/25. */ @Data @Service public class TestComponent { private String id = "@Service"; }
spring容器啓動後,控制檯打印的結果:get
context id : org.springframework.context.annotation.AnnotationConfigApplicationContext@21b8d17c
TestComponent bean : TestComponent(id=@Service)
派生性
和層次性
這兩個概念源自慕課網中小馬哥的課程介紹,嚴格上講,註解是沒有派生性和層次性的,之因此這樣講,是由於在spring中的不少註解都是有着派生性和層次性的結構。經過這兩種特性,咱們也能夠自定義本身的註解,利用@Component
元註解,來將普通的javaBean掃描添加到spring容器中
派生性
自定義一個註解@FirstAnnotation
,被@Component元註解標識,並保持相同的簽名,當有組件使用@FirstAnnotation 註解標註時,就會被spring容器掃描並加載
/** * 自定義註解@FirstAnnotation,被@Component標註 * @author TangFD * @since 2019/6/10. */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface FirstAnnotation { String value() default ""; }
將上面TestComponent
類的註解換成@FirstAnnotation
,結果也是相同的
/** * spring掃描的候選組件 * * @author TangFD * @since 2019/6/25. */ @Data @FirstAnnotation public class TestComponent { private String id = "@FirstAnnotation"; }
spring容器啓動後,控制檯打印的結果:
context id : org.springframework.context.annotation.AnnotationConfigApplicationContext@21b8d17c
TestComponent bean : TestComponent(id=@FirstAnnotation)
層次性
Spring模式註解並不具備真正的派生性和層次性,只是像java類同樣,具備相似繼承和層次結構的功能
自定義一個註解@SecondAnnotation
,被@FirstAnnotation
註解標識,當有組件使用@SecondAnnotation
註解標註時,一樣會被spring容器掃描並加載
/** * 自定義註解@SecondAnnotation ,被@FirstAnnotation標註 * * @author TangFD * @since 2019/6/11. */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @FirstAnnotation public @interface SecondAnnotation { String value() default ""; }
將上面TestComponent
類的註解換成@SecondAnnotation
,結果也是相同的
/** * spring掃描的候選組件 * * @author TangFD * @since 2019/6/25. */ @Data @SecondAnnotation public class TestComponent { private String id = "@SecondAnnotation"; }
spring容器啓動後,控制檯打印的結果:
context id : org.springframework.context.annotation.AnnotationConfigApplicationContext@21b8d17c
TestComponent bean : TestComponent(id=@SecondAnnotation)
本文介紹了spring中
@Component
元註解的簡單使用,並經過示例說明了註解的繼承和層次性功能。文章內容很是簡單,只要對spring有所瞭解和入門,都不會有什麼問題。
之因此把這些簡單的內容拿出來寫,一是給本身在寫博客,或者說是記錄學習筆記的路上開一個簡單的頭,二是將本身認爲會的東西進行梳理,進一步理解,鞏固本身的知識。
學習永遠都不是一件簡單的事情,能夠有迷茫,能夠懶惰,可是前進的腳步永遠都不能中止。
不積跬步,無以致千里;不積小流,無以成江海;