最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Spring Boot最核心的27個注解,你了解多少?

 更新時間:2019年08月13日 14:40:25   作者:無敵的碼農(nóng)  
這篇文章主要介紹了詳解Spring Boot最核心的27個注解,你了解多少?文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

導讀 

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

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

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

Spring相關6個注解

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

1、@Configuration

從Spring3.0,@Configuration用于定義配置類,可替換xml配置文件,被注解的類內(nèi)部包含有一個或多個被@Bean注解的方法,這些方法將會被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext類進行掃描,并用于構建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();
  }
}

2、@ComponentScan

做過web開發(fā)的同學一定都有用過@Controller,@Service,@Repository注解,查看其源碼你會發(fā)現(xiàn),他們中有一個共同的注解@Component,沒錯@ComponentScan注解默認就會裝配標識了@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);
  }
}

3、@Conditional

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

4、@Import

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

//類定義
public class Square {}

public class Circular {}

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

5、@ImportResource

和@Import類似,區(qū)別就是@ImportResource導入的是配置文件。

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

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

6、@Component

@Component是一個元注解,意思是可以注解其他類注解,如@Controller @Service @Repository。帶此注解的類被看作組件,當使用基于注解的配置和類路徑掃描的時候,這些類就會被實例化。其他類級別的注解也可以被認定為是一種特殊類型的組件,比如@Controller 控制器(注入服務)、@Service服務(注入dao)、@Repository dao(實現(xiàn)dao訪問)。@Component泛指組件,當組件不好歸類的時候,我們可以使用這個注解進行標注,作用就相當于 XML配置,<bean id="" class=""/>。

Spring Boot最核心的20個注解

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

1、@SpringBootApplication 

這個注解是Spring Boot最核心的注解,用在 Spring Boot的主類上,標識這是一個 Spring Boot 應用,用來開啟 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);
  }
}

2、@EnableAutoConfiguration

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

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

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

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

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

  String[] excludeName() default {};
}

3、@SpringBootConfiguration

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

4、@ConditionalOnBean 

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

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

5、@ConditionalOnMissingBean

組合@Conditional注解,和@ConditionalOnBean注解相反,僅僅在當前上下文中不存在A對象時,才會實例化一個Bean。

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

6、@ConditionalOnClass

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

 @Bean
 //當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());
   }
 }

7、@ConditionalOnMissingClass

組合@Conditional注解,和@ConditionalOnMissingClass注解相反,當classpath中沒有指定的 Class才開啟配置。

8、@ConditionalOnWebApplication

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

9、@ConditionalOnNotWebApplication

組合@Conditional注解,和@ConditionalOnWebApplication 注解相反,當前項目類型不是 WEB 項目才開啟配置。

10、@ConditionalOnProperty

組合 @Conditional 注解,當指定的屬性有指定的值時才開啟配置。具體操作是通過其兩個屬性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();
 }

11、@ConditionalOnExpression

組合 @Conditional 注解,當 SpEL 表達式為 true 時才開啟配置。

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

12、@ConditionalOnJava

組合@Conditional 注解,當運行的 Java JVM 在指定的版本范圍時才開啟配置。

13、@ConditionalOnResource

組合 @Conditional 注解,當類路徑下有指定的資源才開啟配置。

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

14、@ConditionalOnJndi

組合 @Conditional 注解,當指定的 JNDI 存在時才開啟配置。

15、@ConditionalOnCloudPlatform

組合 @Conditional 注解,當指定的云平臺激活時才開啟配置。

16、@ConditionalOnSingleCandidate

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

17、@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;
}

18、@EnableConfigurationProperties 

當@EnableConfigurationProperties注解應用到你的@Configuration時,任何被@ConfigurationProperties注解的beans將自動被Environment屬性配置。 這種風格的配置特別適合與SpringApplication的外部YAML配置進行配合使用。

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

19、@AutoConfigureAfter

用在自動配置類上面,表示該自動配置類需要在另外指定的自動配置類配置完之后。

如 Mybatis 的自動配置類,需要在數(shù)據(jù)源自動配置類之后。

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

20、@AutoConfigureBefore

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

 21、@AutoConfigureOrder

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

 @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) // 自動配置里面的最高優(yōu)先級
 @Configuration
 @ConditionalOnWebApplication // 僅限于web應用
 @Import(BeanPostProcessorsRegistrar.class) // 導入內(nèi)置容器的設置
 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 {
     // ...
   }
}

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。 

相關文章

  • Java利用反射實現(xiàn)文件的讀取操作

    Java利用反射實現(xiàn)文件的讀取操作

    這篇文章主要介紹了Java利用反射實現(xiàn)文件的讀取操作,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • Java面向?qū)ο蠡A之多態(tài)性,抽象類和接口

    Java面向?qū)ο蠡A之多態(tài)性,抽象類和接口

    這篇文章主要介紹了Java面向?qū)ο蠡A:多態(tài)性,抽象類和接口,文中代碼可以幫助各位更好的理解學習,有需求的小伙伴可以參考下
    2020-05-05
  • Java進階教程之運行時類型識別RTTI機制

    Java進階教程之運行時類型識別RTTI機制

    這篇文章主要介紹了Java進階教程之運行時類型識別RTTI機制,在Java運行時,RTTI維護類的相關信息,比如多態(tài)(polymorphism)就是基于RTTI實現(xiàn)的,需要的朋友可以參考下
    2014-09-09
  • 實例講述Java IO文件復制

    實例講述Java IO文件復制

    本篇文章通過實例給大家詳細講述Java IO文件復制的相關知識點,需要的讀者們學習下吧。
    2018-02-02
  • Mybatis實體類和表映射問題(推薦)

    Mybatis實體類和表映射問題(推薦)

    在項目開發(fā)中我們經(jīng)常會遇到表中的字段名和表對應實體類的屬性名稱不一定都是完全相同的。下面小編給大家介紹下這種情況下如何解決字段名與實體類屬性名不相同的沖突問題。下面小編給大家?guī)砹薓ybatis實體類和表映射的解決方法,小伙伴們一起學習吧
    2016-09-09
  • 聊聊finally中的代碼一定會執(zhí)行嗎

    聊聊finally中的代碼一定會執(zhí)行嗎

    通常在面試中,只要是疑問句一般答案都是“否定”的,因為如果是“確定”和“正?!钡?那面試官就沒有必要再問了嘛,本文想和大家聊聊finally中的代碼一定會執(zhí)行嗎?,感興趣的朋友跟著小編一起來看看吧
    2023-12-12
  • 使用Netty快速實現(xiàn)一個群聊功能的示例詳解

    使用Netty快速實現(xiàn)一個群聊功能的示例詳解

    這篇文章主要為大家詳細介紹了如何利用?Netty?框架開發(fā)一個?WebSocket?服務端,從而實現(xiàn)一個簡單的在線聊天功能,感興趣的小伙伴可以了解下
    2023-11-11
  • Java 關于eclipse導入項目發(fā)生的問題及解決方法(推薦)

    Java 關于eclipse導入項目發(fā)生的問題及解決方法(推薦)

    下面小編就為大家分享一篇Java 關于eclipse導入項目發(fā)生的問題及解決方法(推薦),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • Springmvc發(fā)送json數(shù)據(jù)轉(zhuǎn)Java對象接收

    Springmvc發(fā)送json數(shù)據(jù)轉(zhuǎn)Java對象接收

    這篇文章主要介紹了Springmvc發(fā)送json數(shù)據(jù)轉(zhuǎn)Java對象接收,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • MyBatisPlus報錯:Failed to process,please exclude the tableName or statementId問題

    MyBatisPlus報錯:Failed to process,please exclud

    這篇文章主要介紹了MyBatisPlus報錯:Failed to process,please exclude the tableName or statementId問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08

最新評論

娄底市| 琼结县| 阿巴嘎旗| 延川县| 和静县| 新邵县| 临朐县| 塘沽区| 景德镇市| 六盘水市| 元氏县| 新昌县| 太湖县| 泗洪县| 铜陵市| 瓦房店市| 娄底市| 建湖县| 安顺市| 东方市| 舟曲县| 库尔勒市| 德清县| 无极县| 昌宁县| 莱西市| 同江市| 高雄县| 广平县| 蒲城县| 松阳县| 佛山市| 大厂| 南通市| 宁远县| 伊吾县| 准格尔旗| 梧州市| 德钦县| 贡嘎县| 哈巴河县|