您好,登錄后才能下訂單哦!
導讀
Spring Boot方式的項目開發已經逐步成為Java應用開發領域的主流框架,它不僅可以方便地創建生產級的Spring應用程序,還能輕松地通過一些注解配置與目前比較火熱的微服務框架SpringCloud集成。
而Spring Boot之所以能夠輕松地實現應用的創建及與其他框架快速集成,最核心的原因就在于它極大地簡化了項目的配置,最大化地實現了“約定大于配置”的原則。然而基于Spring Boot雖然極大地方便了開發,但是也很容易讓人“云里霧里”,特別是各種注解很容易讓人“知其然而不知其所以然。
所以,要想用好Spring Boot就必須對其提供的各類功能注解有一個全面而清晰地認識和理解。一方面可以提高基于Spring Boot的開發效率,另一方面也是面試中被問及框架原理時所必需要掌握的知識點。在接下來的內容中,小編就帶大家一起來探究下Spring Boot的一些常用注解吧!
Spring相關6個注解
Spring Boot的有些注解也需要與Spring的注解搭配使用,這里小編梳理了在項目中與Spring Boot注解配合最為緊密的6個Spring基礎框架的注解。如👇
1、@Configuration
從Spring3.0,@Configuration用于定義配置類,可替換xml配置文件,被注解的類內部包含有一個或多個被@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開發的同學一定都有用過@Controller,@Service,@Repository注解,查看其源碼你會發現,他們中有一個共同的注解@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注解可以根據代碼中設置的條件裝載不同的bean,在設置條件注解之前,先要把裝載的bean類去實現Condition接口,然后對該實現接口的類設置是否裝載的條件。Spring Boot注解中的@ConditionalOnProperty、@ConditionalOnBean等以@Conditional*開頭的注解,都是通過集成了@Conditional來實現相應功能的。
4、@Import
通過導入的方式實現把實例加入springIOC容器中。可以在需要時將沒有被Spring容器管理的類導入至Spring容器中。
//類定義 public class Square {} public class Circular {} //導入 @Import({Square.class,Circular.class}) @Configuration public class MainConfig{}
5、@ImportResource
和@Import類似,區別就是@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(實現dao訪問)。@Component泛指組件,當組件不好歸類的時候,我們可以使用這個注解進行標注,作用就相當于 XML配置,<bean id="" class=""/>。
Spring Boot最核心的20個注解
說完與Spring Boot密切相關的幾個Spring基礎注解后,下面我們就再一起看看Spring Boot提供的核心注解的內容吧!
1、@SpringBootApplication
這個注解是Spring Boot最核心的注解,用在 Spring Boot的主類上,標識這是一個 Spring Boot 應用,用來開啟 Spring Boot 的各項能力。實際上這個注解是@Configuration,@EnableAutoConfiguration,@ComponentScan三個注解的組合。由于這些注解一般都是一起使用,所以Spring Boot提供了一個統一的注解@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 就能根據當前類路徑下的包或者類來配置 Spring Bean。
如:當前類路徑下有 Mybatis 這個 JAR 包,MybatisAutoConfiguration 注解就能根據相關參數來配置 Mybatis 的各個 Spring Bean。
@EnableAutoConfiguration實現的關鍵在于引入了AutoConfigurationImportSelector,其核心邏輯為selectImports方法,邏輯大致如下:
@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 后續的擴展。
4、@ConditionalOnBean
@ConditionalOnBean(A.class)僅僅在當前上下文中存在A對象時,才會實例化一個Bean,也就是說只有當A.class 在spring的applicationContext中存在時,這個當前的bean才能夠創建。
@Bean //當前環境上下文存在DefaultMQProducer實例時,才能創建RocketMQProducerLifecycle這個Bean @ConditionalOnBean(DefaultMQProducer.class) public RocketMQProducerLifecycle rocketMQLifecycle() { return new RocketMQProducerLifecycle(); }
5、@ConditionalOnMissingBean
組合@Conditional注解,和@ConditionalOnBean注解相反,僅僅在當前上下文中不存在A對象時,才會實例化一個Bean。
@Bean //僅當當前環境上下文缺失RocketMQProducer對象時,才允許創建RocketMQProducer Bean對象 @ConditionalOnMissingBean(RocketMQProducer.class) public RocketMQProducer mqProducer() { return new RocketMQProducer(); }
6、@ConditionalOnClass
組合 @Conditional 注解,可以僅當某些類存在于classpath上時候才創建某個Bean。
@Bean //當classpath中存在類HealthIndicator時,才創建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來實現的,其中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 的自動配置類,需要在數據源自動配置類之后。
@AutoConfigureAfter(DataSourceAutoConfiguration.class) public class MybatisAutoConfiguration { }
20、@AutoConfigureBefore
這個和@AutoConfigureAfter注解使用相反,表示該自動配置類需要在另外指定的自動配置類配置之前。
21、@AutoConfigureOrder
Spring Boot 1.3.0中有一個新的注解@AutoConfigureOrder,用于確定配置加載的優先級順序。
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) // 自動配置里面的最高優先級 @Configuration @ConditionalOnWebApplication // 僅限于web應用 @Import(BeanPostProcessorsRegistrar.class) // 導入內置容器的設置 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 { // ... } }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。