SpringBootApplication注解詳解與常見SpringBoot注解列表

SpringBootApplication注解

SpringBoot程序啟動入口一個是SpringApplication.run,一個是@SpringBootApplication注解,這個注解是由三部分組成:

  1. @ComponentScan注解谜嫉,主要用于組件掃描和自動裝配区匠。

  2. @SpringBootConfiguration注解,這個注解主要是繼承@Configuration注解蚤蔓,主要用于加載配置文件淑廊。

  3. @EnableAutoConfiguration注解,這個注釋啟用了Spring Boot的自動配置功能说榆,可以自動為您配置很多東西锥忿。
    源碼

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {

    @AliasFor(annotation = EnableAutoConfiguration.class)
    Class[] exclude() default {};

    @AliasFor(annotation = EnableAutoConfiguration.class)
    String[] excludeName() default {};

    @AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
    String[] scanBasePackages() default {};
    @AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
    Class[] scanBasePackageClasses() default {};

}

實例

@SpringBootApplication
public class HelloDemo implements CommandLineRunner {
 
    private static final Logger log = LoggerFactory.getLogger(HelloDemo.class);
 
    public static void main(String args[]) {
        SpringApplication.run(HelloDemo.class);
    }
 
    @Override
    public void run(String...args) throws Exception {
        log.info("hello 51gjie");
    }
}

@SpringBootApplication = @Configuration + @ComponentScan + @EnableAutoConfiguration牛郑,是這三個Spring注釋的組合,只需一行代碼即可提供所有三個注釋的功能缎谷。

Spring ComponentScan注解詳解
Spring中@ComponentScan注解的作用就是根據(jù)定義的掃描路徑井濒,把符合掃描規(guī)則的類裝配到spring的bean容器中。

源碼

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
    @AliasFor("basePackages")
    String[] value() default {};
 
    @AliasFor("value")
    String[] basePackages() default {};
 
    Class[] basePackageClasses() default {};
 
    Class nameGenerator() default BeanNameGenerator.class;
 
    Class scopeResolver() default AnnotationScopeMetadataResolver.class;
 
    ScopedProxyMode scopedProxy() default ScopedProxyMode.DEFAULT;
 
    String resourcePattern() default "**/*.class";
    boolean useDefaultFilters() default true;
    ComponentScan.Filter[] includeFilters() default {};
    ComponentScan.Filter[] excludeFilters() default {};
    boolean lazyInit() default false;
    @Retention(RetentionPolicy.RUNTIME)
    @Target({})
    public @interface Filter {
        FilterType type() default FilterType.ANNOTATION;
        @AliasFor("classes")
        Class[] value() default {};
        @AliasFor("value")
        Class[] classes() default {};
        String[] pattern() default {};
    }
}

basePackages與value:? 用于指定包的路徑列林,進行掃描

basePackageClasses: 用于指定某個類的包的路徑進行掃描

nameGenerator: bean的名稱的生成器

useDefaultFilters: 是否開啟對@Component瑞你,@Repository,@Service希痴,@Controller的類進行檢測

includeFilters: 包含的過濾條件 FilterType.ANNOTATION:按照注解過濾,FilterType.ASSIGNABLE_TYPE:按照給定的類型,FilterType.ASPECTJ:使用ASPECTJ表達式,FilterType.REGEX:正則,FilterType.CUSTOM:自定義規(guī)則

excludeFilters: 排除的過濾條件者甲,用法和includeFilters一樣

注解方式

  1. 掃描包
@ComponentScan(basePackages = “”)     //單個
@ComponentScan(basePackages = {“xxx”,“aaa”,“…”})   //多個

注意:可以省略“basePackages =”

@Configuration
@ComponentScan("com.51gjie.spring.service")
public class MyConfig {}

@Configuration
@ComponentScan("com.51gjie.spring.dao","com.51gjie.spring.service")
public class MyConfig {}

@Configuration
@ComponentScan("com.51gjie.spring.*")   //通配符匹配所有的包
public class MyConfig {}

學(xué)習(xí)目錄

  1. 搭建

    1. Eclipse安裝springboot插件2種方法
    2. Eclipse搭建springboot項目(插件搭建砌创,項目導(dǎo)入搭建)
  2. 原理

    1. springboot原理(核心原理虏缸,啟動流程)
    2. SpringApplication詳解(run執(zhí)行啟動)
    3. SpringBootApplication注解
    4. Spring ComponentScan注解詳解
    5. SpringBootConfiguration注解
    6. EnableAutoConfiguration注解
    7. springboot注解大全
    8. SpringBoot Starter原理(依賴引入,自動配置)
  3. 應(yīng)用

    1. SpringBoot集成mybatis+Druid+mybatis generator
    2. SpringBoot整合Mybatis Plus(代碼自動生成)
    3. SpringBoot+mybatis增改刪查例子

Spring ComponentScan注解詳解

Spring中@ComponentScan注解的作用就是根據(jù)定義的掃描路徑嫩实,把符合掃描規(guī)則的類裝配到spring的bean容器中刽辙。

源碼

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

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

    Class[] basePackageClasses() default {};

    Class nameGenerator() default BeanNameGenerator.class;

    Class scopeResolver() default AnnotationScopeMetadataResolver.class;

    ScopedProxyMode scopedProxy() default ScopedProxyMode.DEFAULT;

    String resourcePattern() default "**/*.class";
    boolean useDefaultFilters() default true;
    ComponentScan.Filter[] includeFilters() default {};
    ComponentScan.Filter[] excludeFilters() default {};
    boolean lazyInit() default false;
    @Retention(RetentionPolicy.RUNTIME)
    @Target({})
    public @interface Filter {
        FilterType type() default FilterType.ANNOTATION;
        @AliasFor("classes")
        Class[] value() default {};
        @AliasFor("value")
        Class[] classes() default {};
        String[] pattern() default {};
    }
}

basePackages與value:? 用于指定包的路徑,進行掃描

basePackageClasses: 用于指定某個類的包的路徑進行掃描

nameGenerator: bean的名稱的生成器

useDefaultFilters: 是否開啟對@Component甲献,@Repository宰缤,@Service,@Controller的類進行檢測

includeFilters: 包含的過濾條件 FilterType.ANNOTATION:按照注解過濾,FilterType.ASSIGNABLE_TYPE:按照給定的類型,FilterType.ASPECTJ:使用ASPECTJ表達式,FilterType.REGEX:正則,FilterType.CUSTOM:自定義規(guī)則

excludeFilters: 排除的過濾條件,用法和includeFilters一樣

注解方式

1. 掃描包

@ComponentScan(basePackages = “”)     //單個
@ComponentScan(basePackages = {“xxx”慨灭,“aaa”,“…”})   //多個

注意:可以省略“basePackages =”

@Configuration
@ComponentScan("com.51gjie.spring.service")
public class MyConfig {}

@Configuration
@ComponentScan("com.51gjie.spring.dao","com.51gjie.spring.service")
public class MyConfig {}

@Configuration
@ComponentScan("com.51gjie.spring.*")   //通配符匹配所有的包
public class MyConfig {}

2. 掃描類

@ComponentScan(basePackageClasses = “”)   //單個
@ComponentScan(basePackageClasses = {“aaa”朦乏,“bbb”,“…”})  //多個

注意:不可以省略“basePackageClasses =”

@Configuration
@ComponentScan(basePackageClasses = HelloController.class)
public class MyConfig {
}

總結(jié)

Spring ComponentScan注解有以下特性:

1. 自定掃描路徑下邊帶有@Controller,@Service氧骤,@Repository呻疹,@Component注解加入spring容器

2. 通過includeFilters加入掃描路徑下沒有以上注解的類加入spring容器

3. 通過excludeFilters過濾出不用加入spring容器的類

4. 自定義增加了@Component注解的注解方式

SpringBootConfiguration注解
SpringBootConfiguration是SpringBoot項目的配置注解,這也是一個組合注解筹陵,SpringBootConfiguration注解可以用java代碼的形式實現(xiàn)spring中xml配置文件配置的效果刽锤,并會將當(dāng)前類內(nèi)聲明的一個或多個以@Bean注解標(biāo)記的方法的實例納入到spring容器中,并且實例名就是方法名惶翻。

實例

@SpringBootConfiguration
public class Config {
    @Bean
    public Map MyMap(){
        Map map = new HashMap();
        map.put("website","51gjie");
        map.put("type","javaschool");
        map.put("age",5);
        return map;
    }
}

@RestController
@SpringBootApplication
public class App 
{   
    public static void main( String[] args )
    {
        Map map = (Map) context.getBean("MyMap");   //注意這里直接獲取到這個方法bean
        int age = (int) map.get("age");
        System.out.println("age=="+age);
    }
}

SpringBoot項目中推薦使用@SpringBootConfiguration替代@Configuration

EnableAutoConfiguration注解
EnableAutoConfiguration是SpringBoot的一個特性姑蓝,可以根據(jù)classpath中的jar依賴,自動注冊bean,一般用于類或接口上,它嘗試根據(jù)您添加的jar依賴項自動配置Spring應(yīng)用程序吕粗。

源碼

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

    Class[] exclude() default {};

    String[] excludeName() default {};
}

@EnableAutoConfiguration實現(xiàn)的關(guān)鍵在于引入了AutoConfigurationImportSelector,其核心邏輯為selectImports方法旭愧,借助AutoConfigurationImportSelector颅筋,它可以幫助SpringBoot應(yīng)用將所有符合條件的@Configuration配置都加載到當(dāng)前SpringBoot創(chuàng)建并使用的IoC容器。

原理
當(dāng)springboot掃描到@EnableAutoConfiguration注解時則會將spring-boot-autoconfigure.jar/META-INF/spring.factories文件中org.springframework.boot.autoconfigure.EnableAutoConfiguration對應(yīng)的value里的所有xxxConfiguration類加載到IOC容器中输枯。spring.factories文件里每一個xxxAutoConfiguration文件一般都會有下面的條件注解:

@ConditionalOnClass : classpath中存在該類時起效

@ConditionalOnMissingClass : classpath中不存在該類時起效

@ConditionalOnBean : DI容器中存在該類型Bean時起效

@ConditionalOnMissingBean : DI容器中不存在該類型Bean時起效

@ConditionalOnSingleCandidate : DI容器中該類型Bean只有一個或@Primary的只有一個時起效

@ConditionalOnExpression : SpEL表達式結(jié)果為true時

@ConditionalOnProperty : 參數(shù)設(shè)置或者值一致時起效

@ConditionalOnResource : 指定的文件存在時起效

@ConditionalOnJndi : 指定的JNDI存在時起效

@ConditionalOnJava : 指定的Java版本存在時起效

@ConditionalOnWebApplication : Web應(yīng)用環(huán)境下起效

@ConditionalOnNotWebApplication : 非Web應(yīng)用環(huán)境下起效

SpringBoot中EnableAutoConfiguration實現(xiàn)的關(guān)鍵在于引入了AutoConfigurationImportSelector议泵,其核心邏輯為selectImports方法,邏輯大致如下:

  1. 從配置文件META-INF/spring.factories加載所有可能用到的自動配置類桃熄;

  2. 去重先口,并將exclude和excludeName屬性攜帶的類排除;

  3. 過濾瞳收,將滿足條件(@Conditional)的自動配置類返回碉京;

SpringBoot注解就是給代碼打上標(biāo)簽的能力。通過引入注解螟深,我們可以簡單快速賦予代碼生命力谐宙,大大提高代碼可讀性和擴展性。注解本身不具有任何能力界弧,只是一個標(biāo)簽凡蜻,但是我們可以定義各種標(biāo)簽然后實現(xiàn)各種標(biāo)簽處理器來對類、方法垢箕、屬性甚至參數(shù)等進行功能擴展划栓、功能開啟、屬性定義条获、行為定義忠荞、規(guī)則定義、關(guān)聯(lián)處理、元數(shù)據(jù)定義等等钻洒。

元注解

@Documented:將會在被此注解注解的元素的javadoc文檔中列出注解奋姿,一般都打上這個注解沒壞處

@Target:注解能被應(yīng)用的目標(biāo)元素,比如類素标、方法称诗、屬性、參數(shù)等等头遭,需要仔細思考

@Retention:僅在源碼保留寓免,還是保留到編譯后的字節(jié)碼,還是到運行時也去加載计维,超過90%的應(yīng)用會在運行時去解析注解進行額外的處理袜香,所以大部分情況我們都會設(shè)置配置為RetentionPolicy.RUNTIME

@Inherited:如果子類沒有定義注解的話,能自動從父類獲取定義了繼承屬性的注解鲫惶,比如Spring的@Service是沒有繼承特性的蜈首,但是@Transactional是有繼承特性的,在OO繼承體系中使用Spring注解的時候請?zhí)貏e注意這點欠母,理所當(dāng)然認為注解是能被子類繼承的話可能會引起不必要的Bug欢策,需要仔細斟酌是否開啟繼承

@Repeatable:Java 8引入的特性,通過關(guān)聯(lián)注解容器定義可重復(fù)注解赏淌,小小語法糖提高了代碼可讀性踩寇,對于元素有多個重復(fù)注解其實是很常見的事情,比如某方法可以是A角色可以訪問也可以是B角色可以訪問六水,某方法需要定時任務(wù)執(zhí)行俺孙,要在A條件執(zhí)行也需要在B條件執(zhí)行

@Native:是否在.h頭文件中生成被標(biāo)記的字段,除非原生程序需要和Java程序交互掷贾,否則很少會用到這個元注解

基本注解

@Service: 注解在類上睛榄,表示這是一個業(yè)務(wù)層bean

@Controller:注解在類上,表示這是一個控制層bean

@Repository: 注解在類上胯盯,表示這是一個數(shù)據(jù)訪問層bean

@Component: 注解在類上懈费,表示通用bean ,value不寫默認就是類名首字母小寫

@Autowired:按類型注入.默認屬性required= true

@Resource: 按名稱裝配博脑。

啟動注解

@SpringBootApplication:包含了@ComponentScan憎乙、@Configuration和@EnableAutoConfiguration注解。其中

@ComponentScan:讓spring Boot掃描到Configuration類并把它加入到程序上下文叉趣。

@SpringBootConfiguration :等同于spring的XML配置文件泞边;使用Java代碼可以檢查類型安全。

@EnableAutoConfiguration :自動配置疗杉。

HTTP注解

@RequestBody:HTTP請求獲取請求體(處理復(fù)雜數(shù)據(jù)阵谚,比如JSON)

@RequestHeader:HTTP請求獲取請求頭

@CookieValue:HTTP請求獲取cookie

@SessionAttribute:HTTP請求獲取會話

@RequestAttribute:HTTP請求獲取請求的Attribute中(比如過濾器和攔截器手動設(shè)置的一些臨時數(shù)據(jù))蚕礼,

@RequestParam:HTTP請求獲取請求參數(shù)(處理簡單數(shù)據(jù),鍵值對)梢什,

@PathVariable:HTTP請求獲取路徑片段奠蹬,

@MatrixAttribute:HTTP請求獲取矩陣變量允許我們采用特殊的規(guī)則在URL路徑后加參數(shù)(分號區(qū)分不同參數(shù),逗號為參數(shù)增加多個值)

其他注解

@Transient:表示該屬性并非一個到數(shù)據(jù)庫表的字段的映射,ORM框架將忽略該屬性嗡午。

@ConfigurationProperties:給對象賦值囤躁,將注解轉(zhuǎn)換成對象。

@RequestMapping:和請求報文是做對應(yīng)的

@EnableCaching:注解驅(qū)動的緩存管理功能

@GeneratedValue:用于標(biāo)注主鍵的生成策略荔睹,通過 strategy 屬性指定

@JsonIgnore:作用是json序列化時將Java bean中的一些屬性忽略掉,序列化和反序列化都受影響狸演。

@JoinColumn(name=”loginId”):一對一:本表中指向另一個表的外鍵。一對多:另一個表指向本表的外鍵僻他。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末宵距,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子吨拗,更是在濱河造成了極大的恐慌满哪,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件劝篷,死亡現(xiàn)場離奇詭異翩瓜,居然都是意外死亡,警方通過查閱死者的電腦和手機携龟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來勘高,“玉大人峡蟋,你說我怎么就攤上這事』” “怎么了蕊蝗?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長赖舟。 經(jīng)常有香客問我蓬戚,道長,這世上最難降的妖魔是什么宾抓? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任子漩,我火速辦了婚禮,結(jié)果婚禮上石洗,老公的妹妹穿的比我還像新娘幢泼。我一直安慰自己,他們只是感情好讲衫,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布缕棵。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪招驴。 梳的紋絲不亂的頭發(fā)上篙程,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機與錄音别厘,去河邊找鬼虱饿。 笑死,一個胖子當(dāng)著我的面吹牛丹允,可吹牛的內(nèi)容都是我干的郭厌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼雕蔽,長吁一口氣:“原來是場噩夢啊……” “哼折柠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起批狐,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤扇售,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后嚣艇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體承冰,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年食零,在試婚紗的時候發(fā)現(xiàn)自己被綠了困乒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡贰谣,死狀恐怖娜搂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吱抚,我是刑警寧澤百宇,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站秘豹,受9級特大地震影響携御,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜既绕,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一啄刹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧岸更,春花似錦鸵膏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽廓译。三九已至,卻和暖如春债查,著一層夾襖步出監(jiān)牢的瞬間非区,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工盹廷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留征绸,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓俄占,卻偏偏與公主長得像管怠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子缸榄,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355