項(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