Spring與SpringBoot使用註解開發的優雅

前言

使用註解開發應用是一種非常讚的開發體驗,僅僅使用一個註解就可以完成大量的工作以滿足我們的需求,這是何等的奇妙啊。比如lombok就是一個非常棒的註解工具,僅僅一個@Setter註解就可以爲類的所有成員添加set方法,如果沒有lombok,比如對於一個有100個字段的domain類,我們需要寫100個set方法,就算是IDE有自動生成set代碼功能,但是100個set方法的代碼量還是很可觀的,而且一個domain不僅需要有set方法,還需要get方法,以及一些必須的構造方法等等,這樣下來,這個類就會有200多個看起來“沒用”的方法了,這個類無論如何都會很“臃腫”,而使用lombok,僅僅需要幾行代碼,簡單明瞭。

本文主要總結一些在Spring/SpringBoot項目中使用到的常用註解,會對一些註解進行深入分析,包括註解的含義,使用方法,一些使用建議以及一些高端用法探索,如果你正在使用Spring進行項目開發,那麼使用XML無可厚非,但是如果你正在使用SpringBoot來部署你的應用,還是建議拋棄XML的配置方式,使用註解可以讓你的應用看起來更加輕便易懂。

正文

@Import 註解

這個註解是非常厲害的註解,它可以將一些bean加載到IOC容器中來,很多其他的註解比如@EnableAutoConfiguration、@EnableScheduling等都用到了這個註解來實現他們各自的功能。和這個註解類似的註解還有@ImportResource,但是@ImportResource註解是將一個xml資源文件中的bean加載到IOC容器中來,而@Import 則是從註解中解析具體的bean然後加載到IOC容器中來,但是這兩個註解的本質都是一樣的。

@Import可以使用三種方式來加載bean,下面分別介紹一下這三種bean的使用:

(1)直接在@Import的value參數中填寫需要加載進來的實例類,比如有一個類A需要被加載進來,就使用 @Import(value = A.class),如果有多個需要加載的實例類,就使用 @Import(value = {A.class, B.class, C.class …}) 即可。

(2)在@Import中填寫一個自定義的ImportSelector類,然後在selectImports方法中返回所有需要加載的類的全限定名即可。

(3)在@Import中填寫一個自定義的ImportBeanDefinitionRegistrar類,然後在registerBeanDefinitions方法中註冊你需要加載的bean。一般情況下,你只需要做兩個步驟即可:

  // new一個RootBeanDefinition
    RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(${BeanClass});
    // 註冊一個bean
    registry.registerBeanDefinition(${beanName}, rootBeanDefinition);

{BeanClass}替換爲具體的bean的類型,{beanName}則替換爲bean的具體id即可。

@ImportResource

這個註解的功能和註解@Import類似,但是它是用來加載一些xml文件裏面的bean的,用法也是很簡單的,直接在@ImportResource中填寫具體的xml路徑即可,比如:

@ImportResource(locations = “classpath:/spring/applicationContext.xml”)

一般情況下,使用這個註解代表你必須使用xml來配置你的bean,如果在SpringBoot項目中,建議去掉xml文件配置bean的方式,取而代之的是使用註解來配置你的bean,你可以使用@Configuration註解標記一個類是一個配置bean的類,然後在該類裏面的具體方法上使用@Bean配置標記這個方法返回的實例將作爲一個bean加載到IOC容器中去,當然這些註解的使用以及含義將在後文中介紹。

@AutoConfigurationPackage註解
@EnableAutoConfiguration註解
首先來看一下這個註解的定義:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {

    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

    /**
     * Exclude specific auto-configuration classes such that they will never be applied.
     * @return the classes to exclude
     */
    Class<?>[] exclude() default {};

    /**
     * Exclude specific auto-configuration class names such that they will never be
     * applied.
     * @return the class names to exclude
     * @since 1.3.0
     */
    String[] excludeName() default {};
}

這裏面有幾個關鍵的地方需要注意:

(1) 使用了@AutoConfigurationPackage註解
(2) 使用了@Import註解並且加載了AutoConfigurationImportSelector.class

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章