[email protected]
在annotaion配置注解中用@Component來表示一個通用注釋,用于說明一個類是一個spring容器管理的類。也就是該類已經進入到spring的管理容器中了。而@Controller, @Service, @Repository是@Component注解的細化,也可以說是具體化,這三個注解比@Component帶有更多的語義,它們分别對應了控制層、服務層、持久層的類。
@Component注解源碼如下:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Component {
/**
* The value may indicate a suggestion for a logical component name,
* to be turned into a Spring bean in case of an autodetected component.
* @return the suggested component name, if any
*/
String value() default "";
}
[email protected]
@Controller注解表明這個類是一個控制器類,用于标注控制層元件,也就是Action。
@Controller注解源碼如下:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
/**
* The value may indicate a suggestion for a logical component name,
* to be turned into a Spring bean in case of an autodetected component.
* @return the suggested component name, if any
*/
String value() default "";
}
[email protected]
@Service注解表明這個類是一個業務類,用于标注業務層元件。
@Service注解源碼如下:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {
/**
* The value may indicate a suggestion for a logical component name,
* to be turned into a Spring bean in case of an autodetected component.
* @return the suggested component name, if any
*/
String value() default "";
}
[email protected]
@Repository注解表明這個類是一個持久化類,用于标注持久化層元件。
@Repository注解源碼如下:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Repository {
/**
* The value may indicate a suggestion for a logical component name,
* to be turned into a Spring bean in case of an autodetected component.
* @return the suggested component name, if any
*/
String value() default "";
}
總結: @Component、@Controller、@Service、@Repository注解的元注解都相同,包括如下三個: @Target元注解:表示标注的注解用于什麼地方,可選的值包括: ElemenetType.CONSTRUCTOR 構造器聲明
ElemenetType.FIELD 域聲明(包括 enum 執行個體)
ElemenetType.LOCAL_VARIABLE 局部變量聲明
ElemenetType.ANNOTATION_TYPE 作用于注解量聲明
ElemenetType.METHOD 方法聲明
ElemenetType.PACKAGE 包聲明
ElemenetType.PARAMETER 參數聲明
ElemenetType.TYPE 類,接口(包括注解類型)或enum聲明 根據上述的源碼中可以看到@Target的值為ElemenetType.TYPE。
@Retention元注解:表示在什麼級别儲存該注解資訊。可選的值包括: RetentionPolicy.SOURCE 注解将被編譯器丢棄
RetentionPolicy.CLASS 注解在class檔案中可用,但會被VM丢棄
RetentionPolicy.RUNTIME VM将在運作期也保留注釋,是以可以通過反射機制讀取注解的資訊。 根據上述的源碼中可以看到@Retention的值為RetentionPolicy.RUNTIME 。
@Documented元注解:表示将此注解包含在javadoc中,此注解會被javadoc工具提取成文檔。
@Controller、@Service和@Repository注解又被@Component注解标注,說明這三個注解是@Component注解的具體化注解。
補充:1.關于元注解的内容會在後續文章中進行介紹。 2.關于Spring容器的注解掃描過程和原理會在後續文章中進行介紹。