天天看點

Spring注解 @Component、@Controller、@Service、@Repository

[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容器的注解掃描過程和原理會在後續文章中進行介紹。