引言

上一篇文章我們有怎麼介紹到如何通過XML的形式來定義Spring的擴充套件《Spring面試高頻題如何:自定義XML schema 擴充套件》,好多人都在吐槽現在都什麼年代了,xml還有人再用嗎?這玩意早就過時了吧,還有必要去掌握它嗎?Spring官網都把這種方式放在最後面了,可想而知它的重要性到底怎樣了?既然大家都吐槽了,那我們今天繼續來介紹下基於註解的Spring擴充套件。

JavaConfig 配置擴充套件

從Spring3.0開始Spring提供了JavaConfig的方式可以用來代替以前XML的這種方式,原來在XML配置裡的都可以通過註解來一一替換實現。主要通過@Configuration,@Bean, @Import,和@DependsOn這幾個註解來搭配實現的。這種方式也是SpringBoot所使用的。

@Configuration

@Configuration只能標記在類上,表示該類為JavaConfig類,使其可以被Spring IOC容器掃描識別並建立Bean加入到容器中。@Configuration類就相當於以往的一個xml檔案。下面我們看一個官網提供的例子:

@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyServiceImpl();
}

這個定義的JavaConfig就相當於原來如下XML的配置:

<beans>
<bean id="myService" class="cn.javajr.services.MyServiceImpl"/>
</beans>

@Bean

@Bean只能被標記在方法上,表示該方法返回一個Spring Bean,可以被IOC容器託管,相當於以前在xml檔案中寫的元素。

  • name:指定一個或者多個bean的名字,當沒有設定name時,Spring容器會預設將@Bean方法名作為bean name,當設定了name後,就不會再使用方法名,同時設定多個name時,除第一個name外,其他的都會作為bean的別名。相當於xml配置中的name屬性。
  • initMethod:指定容器在初始化完bean後呼叫的方法。相當於xml配置中的init-method屬性。
  • destroyMethod:指定在容器在銷燬bean前呼叫的方法。相當於xml配置中的 destroy-method。
  • autowire:指定bean在自動裝配時依賴注入使用的策略,取值可以參考Enum類Autowire 的三個常量:Autowire.BY_NAME,Autowire.BY_TYPE,Autowire.NO。

@Import

XML配置中的標籤,基於JavaConfig提供了@Import來組合模組化的配置類,使用方式如下所示:

@Configuration()
@Import({ApplicationContextConfig.class})
public class ApplicationContextConfig {

上面就比較簡單的介紹了幾種通過JavaConfig註解來替換XML形式的註解,使用起來還是非常簡單的,如果你有對以前的XML配置檔案都比較瞭解的話,使用JavaConfig就更加簡單方便了。

Dubbo的JavaConfig

上篇文章我們介紹了dubbo通過XML的方式自定義擴充套件,今天我們就接著看看dubbo是如何通過JavaConfig來替代XML形式的擴充套件的。

我們看看dubbo的服務提供者是如何通過註解來實現的

@Configuration
@EnableDubbo(scanBasePackages = "org.apache.dubbo.samples.annotation.impl")
@PropertySource("classpath:/spring/dubbo-provider.properties")
static class ProviderConfiguration {
}

@Configuration這個註解我們上面已經介紹過了,我們重點看下@EnableDubbo這個註解

@EnableDubbo 其實又是@EnableDubboConfig @DubboComponentScan是通過這兩個組合註解來實現的,

@EnableDubboConfig註解實現如下:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Import(DubboConfigConfigurationRegistrar.class)
public @interface EnableDubboConfig {

這個註解使用了@Import(DubboConfigConfigurationRegistrar.class) 所以Spring 在處理

@EnableDubboConfig 註解 的時候就會去例項化DubboConfigConfigurationRegistrar

並且呼叫它的registerBeanDefinitions方法,這個方法主要是對propties檔案進行解析並根據不同的配置

項生成對應型別的Bean物件。

總結

  • 通過基於XML和基於Java的配置擴充套件,可以使使用者通過Spring使用我們研發的元件,提供很好的易用性。
  • 雖然現在大多數都是採用JavaConfig這種方式了,但是還是有人會比較喜歡xml這種方式

    xml可以讓配置集中化,所有的元件並不是分散的,因此使你對beans有一個很好的概覽,比如mybais配置檔案、SpingMvc配置檔案,都放在一起,如果你需要分割檔案,Spring可以幫你實現。然後(Spring)會通過內部標籤進行重新組合或者外部上下文檔案進行聚合。
  • xml和JavaConfig 當然也是可以混合使用的,至於使用哪種方式還是看個人的程式設計習慣,沒有哪種方式是絕對的好,各有千秋。
  • 看完這兩篇關於不同方式Spring的 擴充套件我們是不是可以自己動手去實現一個了。

結束

  • 由於自己才疏學淺,難免會有紕漏,假如你發現了錯誤的地方,還望留言給我指出來,我會對其加以修正。
  • 如果你覺得文章還不錯,你的轉發、分享、讚賞、點贊、留言就是對我最大的鼓勵。
  • 感謝您的閱讀,十分歡迎並感謝您的關注。

    巨人的肩膀摘蘋果:

    https://javajr.cn