Spring的Xml和JavaConfig 擴(kuò)展哪個(gè)好用
引言
上一篇文章我們有怎么介紹到如何通過(guò)XML的形式來(lái)定義Spring的擴(kuò)展《Spring面試高頻題如何:自定義XML schema 擴(kuò)展》,好多人都在吐槽現(xiàn)在都什么年代了,xml還有人再用嗎?這玩意早就過(guò)時(shí)了吧,還有必要去掌握它嗎?Spring官網(wǎng)都把這種方式放在最后面了,可想而知它的重要性到底怎樣了?既然大家都吐槽了,那我們今天繼續(xù)來(lái)介紹下基于注解的Spring擴(kuò)展。
JavaConfig 配置擴(kuò)展
從Spring3.0開(kāi)始Spring提供了JavaConfig的方式可以用來(lái)代替以前XML的這種方式,原來(lái)在XML配置里的都可以通過(guò)注解來(lái)一一替換實(shí)現(xiàn)。主要通過(guò)@Configuration,@Bean, @Import,和@DependsOn這幾個(gè)注解來(lái)搭配實(shí)現(xiàn)的。這種方式也是SpringBoot所使用的。
@Configuration
@Configuration只能標(biāo)記在類上,表示該類為JavaConfig類,使其可以被Spring IOC容器掃描識(shí)別并創(chuàng)建Bean加入到容器中。@Configuration類就相當(dāng)于以往的一個(gè)xml文件。下面我們看一個(gè)官網(wǎng)提供的例子:
@Configuration public class AppConfig { @Bean public MyService myService() { return new MyServiceImpl(); }
這個(gè)定義的JavaConfig就相當(dāng)于原來(lái)如下XML的配置:
<beans> <bean id="myService" class="cn.javajr.services.MyServiceImpl"/> </beans>
@Bean
@Bean只能被標(biāo)記在方法上,表示該方法返回一個(gè)Spring Bean,可以被IOC容器托管,相當(dāng)于以前在xml文件中寫的
- name:指定一個(gè)或者多個(gè)bean的名字,當(dāng)沒(méi)有設(shè)置name時(shí),Spring容器會(huì)默認(rèn)將@Bean方法名作為bean name,當(dāng)設(shè)置了name后,就不會(huì)再使用方法名,同時(shí)設(shè)置多個(gè)name時(shí),除第一個(gè)name外,其他的都會(huì)作為bean的別名。相當(dāng)于xml配置中的name屬性。
- initMethod:指定容器在初始化完bean后調(diào)用的方法。相當(dāng)于xml配置中的init-method屬性。
- destroyMethod:指定在容器在銷毀bean前調(diào)用的方法。相當(dāng)于xml配置中的 destroy-method。
- autowire:指定bean在自動(dòng)裝配時(shí)依賴注入使用的策略,取值可以參考Enum類Autowire 的三個(gè)常量:Autowire.BY_NAME,Autowire.BY_TYPE,Autowire.NO。
@Import
XML配置中的標(biāo)簽,基于JavaConfig提供了@Import來(lái)組合模塊化的配置類,使用方式如下所示:
@Configuration() @Import({ApplicationContextConfig.class}) public class ApplicationContextConfig {
上面就比較簡(jiǎn)單的介紹了幾種通過(guò)JavaConfig注解來(lái)替換XML形式的注解,使用起來(lái)還是非常簡(jiǎn)單的,如果你有對(duì)以前的XML配置文件都比較了解的話,使用JavaConfig就更加簡(jiǎn)單方便了。
Dubbo的JavaConfig
上篇文章我們介紹了dubbo通過(guò)XML的方式自定義擴(kuò)展,今天我們就接著看看dubbo是如何通過(guò)JavaConfig來(lái)替代XML形式的擴(kuò)展的。
我們看看dubbo的服務(wù)提供者是如何通過(guò)注解來(lái)實(shí)現(xiàn)的
@Configuration @EnableDubbo(scanBasePackages = "org.apache.dubbo.samples.annotation.impl") @PropertySource("classpath:/spring/dubbo-provider.properties") static class ProviderConfiguration { }
@Configuration這個(gè)注解我們上面已經(jīng)介紹過(guò)了,我們重點(diǎn)看下@EnableDubbo這個(gè)注解
@EnableDubbo 其實(shí)又是@EnableDubboConfig @DubboComponentScan是通過(guò)這兩個(gè)組合注解來(lái)實(shí)現(xiàn)的,
@EnableDubboConfig注解實(shí)現(xiàn)如下:
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented @Import(DubboConfigConfigurationRegistrar.class) public @interface EnableDubboConfig {
這個(gè)注解使用了@Import(DubboConfigConfigurationRegistrar.class) 所以Spring 在處理
@EnableDubboConfig 注解 的時(shí)候就會(huì)去實(shí)例化DubboConfigConfigurationRegistrar
并且調(diào)用它的registerBeanDefinitions方法,這個(gè)方法主要是對(duì)propties文件進(jìn)行解析并根據(jù)不同的配置
項(xiàng)生成對(duì)應(yīng)類型的Bean對(duì)象。
總結(jié)
- 通過(guò)基于XML和基于Java的配置擴(kuò)展,可以使用戶通過(guò)Spring使用我們研發(fā)的組件,提供很好的易用性。
- 雖然現(xiàn)在大多數(shù)都是采用JavaConfig這種方式了,但是還是有人會(huì)比較喜歡xml這種方式
- xml可以讓配置集中化,所有的組件并不是分散的,因此使你對(duì)beans有一個(gè)很好的概覽,比如mybais配置文件、SpingMvc配置文件,都放在一起,如果你需要分割文件,Spring可以幫你實(shí)現(xiàn)。然后(Spring)會(huì)通過(guò)內(nèi)部標(biāo)簽進(jìn)行重新組合或者外部上下文文件進(jìn)行聚合。
- xml和JavaConfig 當(dāng)然也是可以混合使用的,至于使用哪種方式還是看個(gè)人的編程習(xí)慣,沒(méi)有哪種方式是絕對(duì)的好,各有千秋。
- 看完這兩篇關(guān)于不同方式Spring的 擴(kuò)展我們是不是可以自己動(dòng)手去實(shí)現(xiàn)一個(gè)了。
以上就是Spring的Xml和JavaConfig 擴(kuò)展哪個(gè)好的詳細(xì)內(nèi)容,更多關(guān)于Spring的Xml和JavaConfig 擴(kuò)展的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Mybatis?Plus?QueryWrapper復(fù)合用法詳解
這篇文章主要介紹了Mybatis?Plus?QueryWrapper復(fù)合用法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。2022-01-01SpringBoot返回結(jié)果統(tǒng)一處理實(shí)例詳解
這篇文章主要為大家介紹了SpringBoot返回結(jié)果統(tǒng)一處理實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12Java并發(fā)編程:volatile關(guān)鍵字詳細(xì)解析
這篇文章主要介紹了Java并發(fā)編程:volatile關(guān)鍵字詳細(xì)解析,對(duì)學(xué)習(xí)volatile關(guān)鍵字有一定的認(rèn)識(shí),有需要的可以了解一下。2016-11-11SpringBoot引入Redis報(bào)org.springframework.data.redis.core.RedisT
這篇文章主要介紹了SpringBoot引入Redis報(bào)org.springframework.data.redis.core.RedisTemplate類找不到錯(cuò)誤問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-09-09Linux下Hadoop?2.7.3?安裝搭建過(guò)程
Hadoop實(shí)現(xiàn)了一個(gè)分布式文件系統(tǒng)(Hadoop?Distributed?File?System),簡(jiǎn)稱HDFS,這篇文章給大家介紹Linux下Hadoop?2.7.3?安裝搭建過(guò)程,感興趣的朋友跟隨小編一起看看吧2021-11-11登陸驗(yàn)證碼kaptcha結(jié)合spring boot的用法詳解
在一個(gè)web應(yīng)用中驗(yàn)證碼是一個(gè)常見(jiàn)的元素。不管是防止機(jī)器人還是爬蟲都有一定的作用,下面這篇文章主要給大家介紹了登陸驗(yàn)證碼kaptcha結(jié)合spring boot用法的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-06-06Java微信授權(quán)登陸的實(shí)現(xiàn)示例
微信授權(quán)登錄,官方文檔寫的比較簡(jiǎn)潔。所以對(duì)于會(huì)的人一目了然,而對(duì)于新手剛?cè)腴T的人來(lái)說(shuō)是舉步維艱。本文詳細(xì)的介紹了Java微信授權(quán)登陸的實(shí)現(xiàn)示例,感興趣的朋友可以了解一下2021-06-06Spring Boot集成starrocks快速入門Demo(適用場(chǎng)景)
StarRocks 是新一代極速全場(chǎng)景 MPP (Massively Parallel Processing) 數(shù)據(jù)庫(kù),StarRocks 的愿景是能夠讓用戶的數(shù)據(jù)分析變得更加簡(jiǎn)單和敏捷,這篇文章主要介紹了Spring Boot集成starrocks快速入門Demo,需要的朋友可以參考下2024-08-08