SpringBootApplication常用的注解

項(xiàng)目中的常用注解:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.scheduling.annotation.EnableAsync;


@EnableDiscoveryClient
@SpringBootApplication
@EnableFeignClients
@ServletComponentScan
@EnableAsync
public class TunnyCommandCenterApplication {
    public static void main(String[] args) {
        SpringApplication.run(TunnyCommandCenterApplication.class, args);
    }
}
@SpringBootApplication: SpringBoot注解,自動(dòng)為我們掃描配置,最終成功啟動(dòng)項(xiàng)目
  • java中元注解有四個(gè): @Retention @Target @Document @Inherited

@Retention:注解的保留位置         
@Retention(RetentionPolicy.SOURCE) //注解僅存在于源碼中,在class字節(jié)碼文件中不包含
@Retention(RetentionPolicy.CLASS) // 默認(rèn)的保留策略,注解會(huì)在class字節(jié)碼文件中存在,但運(yùn)行時(shí)無法獲得,
@Retention(RetentionPolicy.RUNTIME) // 注解會(huì)在class字節(jié)碼文件中存在,在運(yùn)行時(shí)可以通過反射獲取到

@Target:注解的作用目標(biāo)
@Target(ElementType.TYPE) //接口、類、枚舉
@Target(ElementType.FIELD) //字段、枚舉的常量
@Target(ElementType.METHOD) //方法
@Target(ElementType.PARAMETER) //方法參數(shù)
@Target(ElementType.CONSTRUCTOR) //構(gòu)造函數(shù)
@Target(ElementType.LOCAL_VARIABLE)//局部變量
@Target(ElementType.ANNOTATION_TYPE)//注解
@Target(ElementType.PACKAGE) ///包

@Document:說明該注解將被包含在javadoc中

@Inherited:說明子類可以繼承父類中的該注解

  • @SpringBootConfiguration
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {

}

這說明 @SpringBootConfiguration 也是來源于 @Configuration,二者功能都是將當(dāng)前類標(biāo)注為配置類,并將當(dāng)前類里以 @Bean 注解標(biāo)記的方法的實(shí)例注入到Spring容器中,實(shí)例名即為方法名。

至于@Configuration,我想在非Spring Boot時(shí)代大家應(yīng)該就不陌生,作用是配置Spring容器,也即 JavaConfig 形式的 Spring IoC 容器的配置類所使用。

  • @EnableAutoConfiguration
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
 ...
}

作用:從 ClassPath下掃描所有的 META-INF/spring.factories 配置文件,并將spring.factories文件中的 EnableAutoConfiguration對(duì)應(yīng)的配置項(xiàng)通過反射機(jī)制實(shí)例化為對(duì)應(yīng)標(biāo)注了 @Configuration 的形式的IoC配置類,然后注入IoC容器。
@EnableAutoConfiguration 注解啟用自動(dòng)配置,其可以幫助 Spring Boot 應(yīng)用將所有符合條件的 @Configuration 配置都加載到當(dāng)前 IoC 容器之中,可以簡(jiǎn)要用圖形示意如下:

  • @ComponentScan 組件掃描

@ComponentScan 對(duì)應(yīng)于XML配置形式中的 <context:component-scan>,用于將一些標(biāo)注了特定注解的bean定義批量采集注冊(cè)到Spring的IoC容器之中,這些特定的注解大致包括:
@Controller
@Entity
@Component
@Service
@Repository

對(duì)于該注解,還可以通過 basePackages 屬性來更細(xì)粒度的控制該注解的自動(dòng)掃描范圍,比如:

@ComponentScan({"com.huazheng.tunny.commandcenter", "com.huazheng.tunny.organization""})
@EnableDiscoveryClient: 啟用服務(wù)注冊(cè)發(fā)現(xiàn)功能
  • 與EnableEurekaClient的區(qū)別
    @EnableEurekaClient注解源碼:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@EnableDiscoveryClient
public @interface EnableEurekaClient {

}

EnableEurekaClient 中使用了EnableDiscoveryClient。因此,從使用角度來看兩者已經(jīng)沒有什么區(qū)別了,官方建議使用EnableDiscoveryClient。

區(qū)別:
?@EnableDiscoveryClient注解是基于spring-cloud-commons依賴,并且在classpath中實(shí)現(xiàn)。
?@EnableEurekaClient注解是基于spring-cloud-netflix依賴,只能為eureka作用。
?@EnableEurekaClient只適用于Eureka作為注冊(cè)中心,@EnableDiscoveryClient 可以是其他注冊(cè)中心。
?從Spring Cloud 1.0.0.RC1版本開始,就已經(jīng)不推薦使用EnableEurekaClient和EnableHystrix了。服務(wù)注冊(cè)發(fā)現(xiàn)功能被抽象后放入spring-cloud-commons庫,該庫的EnableDiscoveryClient可以取代舊的EnableEurekaClient,使用注解EnableDiscoveryClient就能啟用服務(wù)注冊(cè)發(fā)現(xiàn)功能。 同理,EnableHystrix也被EnableCircuitBreaker取代了。

@EnableFeignClients:?jiǎn)⒂胒eign客戶端(Spring cloud 注解)

源碼:


package org.springframework.cloud.openfeign;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.context.annotation.Import;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Import({FeignClientsRegistrar.class})
public @interface EnableFeignClients {
    String[] value() default {};

    String[] basePackages() default {};

    Class<?>[] basePackageClasses() default {};

    Class<?>[] defaultConfiguration() default {};

    Class<?>[] clients() default {};
}

@ServletComponentScan:Servlet、Filter、Listener可以直接通過@WebServlet、@WebFilter、@WebListener注解自動(dòng)注冊(cè),無需其他代碼。

源碼:

package org.springframework.boot.web.servlet;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.context.annotation.Import;
import org.springframework.core.annotation.AliasFor;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({ServletComponentScanRegistrar.class})
public @interface ServletComponentScan {
    @AliasFor("basePackages")
    String[] value() default {};

    @AliasFor("value")
    String[] basePackages() default {};

    Class<?>[] basePackageClasses() default {};
}
@EnableAsync:開啟異步支持;使用@Async來對(duì)某個(gè)方法進(jìn)行異步執(zhí)行

源碼:


package org.springframework.scheduling.annotation;

import java.lang.annotation.Annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.context.annotation.AdviceMode;
import org.springframework.context.annotation.Import;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({AsyncConfigurationSelector.class})
public @interface EnableAsync {
    Class<? extends Annotation> annotation() default Annotation.class;

    boolean proxyTargetClass() default false;

    AdviceMode mode() default AdviceMode.PROXY;

    int order() default 2147483647;
}

參考:

https://mp.weixin.qq.com/s/SkCWu3xa2t5kcMGQYcOghA
https://blog.csdn.net/sw5131899/article/details/54947192

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容