Spring Boot最核心的27個干貨注解住拭,你了解多少?

Spring Boot方式的項目開發(fā)已經(jīng)逐步成為Java應(yīng)用開發(fā)領(lǐng)域的主流框架历帚,它不僅可以方便地創(chuàng)建生產(chǎn)級的Spring應(yīng)用程序滔岳,還能輕松地通過一些注解配置與目前比較火熱的微服務(wù)框架SpringCloud集成。

而Spring Boot之所以能夠輕松地實現(xiàn)應(yīng)用的創(chuàng)建及與其他框架快速集成挽牢,最核心的原因就在于它極大地簡化了項目的配置谱煤,最大化地實現(xiàn)了“約定大于配置”的原則。然而基于Spring Boot雖然極大地方便了開發(fā)禽拔,但是也很容易讓人“云里霧里”刘离,特別是各種注解很容易讓人“知其然而不知其所以然。

所以睹栖,要想用好Spring Boot就必須對其提供的各類功能注解有一個全面而清晰地認(rèn)識和理解硫惕。一方面可以提高基于Spring Boot的開發(fā)效率,另一方面也是面試中被問及框架原理時所必需要掌握的知識點野来。在接下來的內(nèi)容中恼除,小編就帶大家一起來探究下Spring Boot的一些常用注解吧!

Spring相關(guān)6個注解

Spring Boot的有些注解也需要與Spring的注解搭配使用曼氛,這里小編梳理了在項目中與Spring Boot注解配合最為緊密的6個Spring基礎(chǔ)框架的注解豁辉。如

@Configuration

從Spring3.0,@Configuration用于定義配置類舀患,可替換xml配置文件徽级,被注解的類內(nèi)部包含有一個或多個被@Bean注解的方法,這些方法將會被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext類進行掃描聊浅,并用于構(gòu)建bean定義餐抢,初始化Spring容器堵幽。

@Configuration
public class TaskAutoConfiguration {

    @Bean
    @Profile("biz-electrfence-controller")
    public BizElectrfenceControllerJob bizElectrfenceControllerJob() {
        return new BizElectrfenceControllerJob();
    }

    @Bean
    @Profile("biz-consume-1-datasync")
    public BizBikeElectrFenceTradeSyncJob bizBikeElectrFenceTradeSyncJob() {
        return new BizBikeElectrFenceTradeSyncJob();
    }
}

@ComponentScan

做過web開發(fā)的同學(xué)一定都有用過@Controller,@Service弹澎,@Repository注解朴下,查看其源碼你會發(fā)現(xiàn),他們中有一個共同的注解@Component苦蒿,沒錯@ComponentScan注解默認(rèn)就會裝配標(biāo)識了@Controller殴胧,@Service,@Repository佩迟,@Component注解的類到spring容器中团滥。

@ComponentScan(value = "com.abacus.check.api")
public class CheckApiApplication {
    public static void main(String[] args) {
        SpringApplication.run(CheckApiApplication.class, args);
    }
}

@SpringBootApplication注解也包含了@ComponentScan注解,所以在使用中我們也可以通過@SpringBootApplication注解的scanBasePackages屬性進行配置报强。

@SpringBootApplication(scanBasePackages = {"com.abacus.check.api", "com.abacus.check.service"})
public class CheckApiApplication {
    public static void main(String[] args) {
        SpringApplication.run(CheckApiApplication.class, args);
    }
}

@Conditional

@Conditional是Spring4新提供的注解灸姊,通過@Conditional注解可以根據(jù)代碼中設(shè)置的條件裝載不同的bean,在設(shè)置條件注解之前秉溉,先要把裝載的bean類去實現(xiàn)Condition接口力惯,然后對該實現(xiàn)接口的類設(shè)置是否裝載的條件。Spring Boot注解中的@ConditionalOnProperty召嘶、@ConditionalOnBean等以@Conditional*開頭的注解父晶,都是通過集成了@Conditional來實現(xiàn)相應(yīng)功能的。

@Import

通過導(dǎo)入的方式實現(xiàn)把實例加入springIOC容器中弄跌〖缀龋可以在需要時將沒有被Spring容器管理的類導(dǎo)入至Spring容器中。

//類定義
public class Square {}

public class Circular {}

//導(dǎo)入
@Import({Square.class,Circular.class})
@Configuration
public class MainConfig{}

@ImportResource

和@Import類似铛只,區(qū)別就是@ImportResource導(dǎo)入的是配置文件埠胖。

@ImportResource("classpath:spring-redis.xml")      //導(dǎo)入xml配置

public class CheckApiApplication {
    public static void main(String[] args) {
        SpringApplication.run(CheckApiApplication.class, args);
    }
}

@Component

@Component是一個元注解,意思是可以注解其他類注解淳玩,如@Controller @Service @Repository直撤。帶此注解的類被看作組件,當(dāng)使用基于注解的配置和類路徑掃描的時候凯肋,這些類就會被實例化谊惭。其他類級別的注解也可以被認(rèn)定為是一種特殊類型的組件,比如@Controller控制器(注入服務(wù))侮东、@Service服務(wù)(注入dao)、@Repositorydao(實現(xiàn)dao訪問)豹芯。@Component泛指組件悄雅,當(dāng)組件不好歸類的時候,我們可以使用這個注解進行標(biāo)注铁蹈,作用就相當(dāng)于 XML配置宽闲,。

Spring Boot最核心的20個注解

說完與Spring Boot密切相關(guān)的幾個Spring基礎(chǔ)注解后,下面我們就再一起看看Spring Boot提供的核心注解的內(nèi)容吧容诬!

@SpringBootApplication

這個注解是Spring Boot最核心的注解娩梨,用在 Spring Boot的主類上,標(biāo)識這是一個 Spring Boot 應(yīng)用览徒,用來開啟 Spring Boot 的各項能力狈定。實際上這個注解是@Configuration,@EnableAutoConfiguration,@ComponentScan三個注解的組合。由于這些注解一般都是一起使用习蓬,所以Spring Boot提供了一個統(tǒng)一的注解@SpringBootApplication纽什。

@SpringBootApplication(exclude = {
        MongoAutoConfiguration.class,
        MongoDataAutoConfiguration.class,
        DataSourceAutoConfiguration.class,
        ValidationAutoConfiguration.class,
        MybatisAutoConfiguration.class,
        MailSenderAutoConfiguration.class,
})
public class API {
    public static void main(String[] args) {
        SpringApplication.run(API.class, args);
    }
}

@EnableAutoConfiguration

允許 Spring Boot 自動配置注解,開啟這個注解之后躲叼,Spring Boot 就能根據(jù)當(dāng)前類路徑下的包或者類來配置 Spring Bean芦缰。

如:當(dāng)前類路徑下有 Mybatis 這個 JAR 包,MybatisAutoConfiguration 注解就能根據(jù)相關(guān)參數(shù)來配置 Mybatis 的各個 Spring Bean枫慷。

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

  • 從配置文件META-INF/spring.factories加載所有可能用到的自動配置類或听;
  • 去重涕俗,并將exclude和excludeName屬性攜帶的類排除;
  • 過濾神帅,將滿足條件(@Conditional)的自動配置類返回再姑;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
//導(dǎo)入AutoConfigurationImportSelector的子類
@Import({EnableAutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

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

    String[] excludeName() default {};
}

@SpringBootConfiguration

這個注解就是 @Configuration 注解的變體,只是用來修飾是 Spring Boot 配置而已找御,或者可利于 Spring Boot 后續(xù)的擴展元镀。

@ConditionalOnBean

@ConditionalOnBean(A.class)僅僅在當(dāng)前上下文中存在A對象時,才會實例化一個Bean霎桅,也就是說只有當(dāng)A.class 在spring的applicationContext中存在時栖疑,這個當(dāng)前的bean才能夠創(chuàng)建。

@Bean
//當(dāng)前環(huán)境上下文存在DefaultMQProducer實例時滔驶,才能創(chuàng)建RocketMQProducerLifecycle這個Bean
@ConditionalOnBean(DefaultMQProducer.class)
public RocketMQProducerLifecycle rocketMQLifecycle() {
     return new RocketMQProducerLifecycle();
}

@ConditionalOnMissingBean

組合@Conditional注解遇革,和@ConditionalOnBean注解相反,僅僅在當(dāng)前上下文中不存在A對象時揭糕,才會實例化一個Bean萝快。

@Bean
  //僅當(dāng)當(dāng)前環(huán)境上下文缺失RocketMQProducer對象時,才允許創(chuàng)建RocketMQProducer Bean對象
  @ConditionalOnMissingBean(RocketMQProducer.class)
  public RocketMQProducer mqProducer() {
      return new RocketMQProducer();
  }

@ConditionalOnClass

組合 @Conditional 注解著角,可以僅當(dāng)某些類存在于classpath上時候才創(chuàng)建某個Bean揪漩。

@Bean
  //當(dāng)classpath中存在類HealthIndicator時,才創(chuàng)建HealthIndicator Bean對象
  @ConditionalOnClass(HealthIndicator.class)
  public HealthIndicator rocketMQProducerHealthIndicator(Map<String, DefaultMQProducer> producers) {
      if (producers.size() == 1) {
          return new RocketMQProducerHealthIndicator(producers.values().iterator().next());
      }
  }

@ConditionalOnMissingClass

組合@Conditional注解吏口,和@ConditionalOnMissingClass注解相反奄容,當(dāng)classpath中沒有指定的 Class才開啟配置冰更。

@ConditionalOnWebApplication

組合@Conditional 注解,當(dāng)前項目類型是 WEB 項目才開啟配置昂勒。當(dāng)前項目有以下 3 種類型:ANY(任何Web項目都匹配)蜀细、SERVLET(僅但基礎(chǔ)的Servelet項目才會匹配)、REACTIVE(只有基于響應(yīng)的web應(yīng)用程序才匹配)戈盈。

@ConditionalOnNotWebApplication

組合@Conditional注解奠衔,和@ConditionalOnWebApplication 注解相反,當(dāng)前項目類型不是 WEB 項目才開啟配置奕谭。

@ConditionalOnProperty

組合 @Conditional 注解涣觉,當(dāng)指定的屬性有指定的值時才開啟配置。具體操作是通過其兩個屬性name以及havingValue來實現(xiàn)的血柳,其中name用來從application.properties中讀取某個屬性值官册,如果該值為空,則返回false;如果值不為空难捌,則將該值與havingValue指定的值進行比較膝宁,如果一樣則返回true;否則返回false。如果返回值為false根吁,則該configuration不生效员淫;為true則生效。

@Bean
 //匹配屬性rocketmq.producer.enabled值是否為true
 @ConditionalOnProperty(value = "rocketmq.producer.enabled", havingValue = "true", matchIfMissing = true)
 public RocketMQProducer mqProducer() {
     return new RocketMQProducer();
 }

@ConditionalOnExpression

組合 @Conditional 注解击敌,當(dāng) SpEL 表達式為 true 時才開啟配置介返。

@Configuration
@ConditionalOnExpression("${enabled:false}")
public class BigpipeConfiguration {
    @Bean
    public OrderMessageMonitor orderMessageMonitor(ConfigContext configContext) {
        return new OrderMessageMonitor(configContext);
    }
}

@ConditionalOnJava

組合@Conditional 注解,當(dāng)運行的 Java JVM 在指定的版本范圍時才開啟配置沃斤。

@ConditionalOnResource

組合 @Conditional 注解圣蝎,當(dāng)類路徑下有指定的資源才開啟配置。

@Bean
@ConditionalOnResource(resources="classpath:shiro.ini")
protected Realm iniClasspathRealm(){
  return new Realm();
}

@ConditionalOnJndi

組合 @Conditional 注解衡瓶,當(dāng)指定的 JNDI 存在時才開啟配置徘公。

@ConditionalOnCloudPlatform

組合 @Conditional 注解,當(dāng)指定的云平臺激活時才開啟配置哮针。

@ConditionalOnSingleCandidate

組合 @Conditional 注解关面,當(dāng)指定的 class 在容器中只有一個 Bean,或者同時有多個但為首選時才開啟配置十厢。

@ConfigurationProperties

Spring Boot可使用注解的方式將自定義的properties文件映射到實體bean中等太,比如config.properties文件。

@Data
@ConfigurationProperties("rocketmq.consumer")
public class RocketMQConsumerProperties extends RocketMQProperties {
    private boolean enabled = true;

    private String consumerGroup;

    private MessageModel messageModel = MessageModel.CLUSTERING;

    private ConsumeFromWhere consumeFromWhere = ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET;

    private int consumeThreadMin = 20;

    private int consumeThreadMax = 64;

    private int consumeConcurrentlyMaxSpan = 2000;

    private int pullThresholdForQueue = 1000;

    private int pullInterval = 0;

    private int consumeMessageBatchMaxSize = 1;

    private int pullBatchSize = 32;
}

@EnableConfigurationProperties

當(dāng)@EnableConfigurationProperties注解應(yīng)用到你的@Configuration時寿烟,任何被@ConfigurationProperties注解的beans將自動被Environment屬性配置澈驼。 這種風(fēng)格的配置特別適合與SpringApplication的外部YAML配置進行配合使用。

@Configuration
@EnableConfigurationProperties({
    RocketMQProducerProperties.class,
    RocketMQConsumerProperties.class,
})
@AutoConfigureOrder
public class RocketMQAutoConfiguration {
    @Value("${spring.application.name}")
    private String applicationName;
}

@AutoConfigureAfter

用在自動配置類上面筛武,表示該自動配置類需要在另外指定的自動配置類配置完之后缝其。
如 Mybatis 的自動配置類,需要在數(shù)據(jù)源自動配置類之后徘六。

@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class MybatisAutoConfiguration {
}

@AutoConfigureBefore

這個和@AutoConfigureAfter注解使用相反内边,表示該自動配置類需要在另外指定的自動配置類配置之前。

@AutoConfigureOrder

Spring Boot 1.3.0中有一個新的注解@AutoConfigureOrder待锈,用于確定配置加載的優(yōu)先級順序漠其。

@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) // 自動配置里面的最高優(yōu)先級
  @Configuration
  @ConditionalOnWebApplication // 僅限于web應(yīng)用
  @Import(BeanPostProcessorsRegistrar.class) // 導(dǎo)入內(nèi)置容器的設(shè)置
  public class EmbeddedServletContainerAutoConfiguration {
      @Configuration
      @ConditionalOnClass({ Servlet.class, Tomcat.class })
      @ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class, search = SearchStrategy.CURRENT)
      public static class EmbeddedTomcat {
         // ...
      }

      @Configuration
      @ConditionalOnClass({ Servlet.class, Server.class, Loader.class, WebAppContext.class })
      @ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class, search = SearchStrategy.CURRENT)
      public static class EmbeddedJetty {
         // ...
      }
}

轉(zhuǎn)自:Spring Boot最核心的27個干貨注解,你了解多少竿音?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末和屎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子春瞬,更是在濱河造成了極大的恐慌柴信,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宽气,死亡現(xiàn)場離奇詭異随常,居然都是意外死亡,警方通過查閱死者的電腦和手機萄涯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門绪氛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人涝影,你說我怎么就攤上這事枣察。” “怎么了燃逻?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵序目,是天一觀的道長。 經(jīng)常有香客問我唆樊,道長宛琅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任逗旁,我火速辦了婚禮嘿辟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘片效。我一直安慰自己红伦,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布淀衣。 她就那樣靜靜地躺著昙读,像睡著了一般。 火紅的嫁衣襯著肌膚如雪膨桥。 梳的紋絲不亂的頭發(fā)上蛮浑,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天唠叛,我揣著相機與錄音,去河邊找鬼沮稚。 笑死艺沼,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蕴掏。 我是一名探鬼主播障般,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼盛杰!你這毒婦竟也來了挽荡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤即供,失蹤者是張志新(化名)和其女友劉穎定拟,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體募狂,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡办素,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了祸穷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片性穿。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖雷滚,靈堂內(nèi)的尸體忽然破棺而出需曾,到底是詐尸還是另有隱情,我是刑警寧澤祈远,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布呆万,位于F島的核電站,受9級特大地震影響车份,放射性物質(zhì)發(fā)生泄漏谋减。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一扫沼、第九天 我趴在偏房一處隱蔽的房頂上張望出爹。 院中可真熱鬧,春花似錦缎除、人聲如沸严就。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽梢为。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間铸董,已是汗流浹背祟印。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留袒炉,地道東北人旁理。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓樊零,卻偏偏與公主長得像我磁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子驻襟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容