亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

如何完成spring的最小化XML配置

 更新時(shí)間:2019年06月20日 11:04:46   作者:fleyX  
這篇文章主要介紹了如何完成spring的最小化XML配置,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下

一、自動(dòng)裝配

1、四種類型的自動(dòng)裝配

類型 解釋 xml 配置
byName 根據(jù) Bean 的 name 或者 id <bean id=”bean” class=”…” autowire=”byName”/>
ByType 根據(jù) Bean 類型自動(dòng)裝配 <bean id=”bean” class=”…” autowire=”byType”/>
contructor 根據(jù) Bean 的構(gòu)造器入?yún)⒕哂邢嗤愋?/td> 同上
Autodetect 首先使用 contructor,失敗再嘗試 byType 同上

byType 在出現(xiàn)多個(gè)匹配項(xiàng)時(shí)不會(huì)自動(dòng)選擇一個(gè)然是報(bào)錯(cuò),為避免報(bào)錯(cuò),有兩種辦法:1.使用<bean>元素的 primary 屬性,設(shè)置為首選 Bean,但所有 bean 的默認(rèn) primary 都是 true,因此我們需要將所有非首選 Bean 設(shè)置為false;2.將 Bean 的autowire-candidate熟悉設(shè)置為false,取消 這個(gè) Bean 的候選資格,這個(gè) Bean 便不會(huì)自動(dòng)注入了。

contructor 自動(dòng)裝配和 byType 有一樣的局限性,當(dāng)發(fā)現(xiàn)多個(gè) Bean 匹配某個(gè)構(gòu)造器入?yún)r(shí),Spring 不會(huì)嘗試選擇其中一個(gè);此外,如果一個(gè)類有多個(gè)構(gòu)造器都滿足自動(dòng)裝配的條件,Spring 也不會(huì)猜測(cè)哪個(gè)更合適使用。

2、默認(rèn)自動(dòng)裝配

如果需要為 Spring 應(yīng)用上下文中的每個(gè) Bean(或者其中的大多數(shù))配置相同的 autowire 屬性,可以在根元素<beans>上增加一個(gè) default-autowire 屬性,默認(rèn)該屬性設(shè)置為 none。該屬性只應(yīng)用于指定配置文件中的所有 Bean,并不是 Spring 上下文中的所有 Bean。

3、混合使用自動(dòng)裝配和顯式裝配

當(dāng)我們對(duì)某個(gè) Bean 使用了自動(dòng)裝配策略,并不代表我們不能對(duì)該 Bean 的某些屬性進(jìn)行顯示裝配,任然可以為任意一個(gè)屬性配置<property>元素,顯式裝配將會(huì)覆蓋自動(dòng)裝配。但是當(dāng)使用 constructor 自動(dòng)裝配策略時(shí),我們必須讓 Spring 自動(dòng)裝配構(gòu)造器所有入?yún)?,不能使?lt;constructor-arg>元素進(jìn)行混合。

二、注解裝配

從 Spring2.5 開始,可以使用注解自動(dòng)裝配 Bean 的屬性,使用注解允許更細(xì)粒度的自動(dòng)裝配,可選擇性的標(biāo)注某一個(gè)屬性來對(duì)其應(yīng)用自動(dòng)裝配。Spring 容器默認(rèn)禁用注解裝配,需要在 Spring 配置中啟用,最簡(jiǎn)單的啟用方式是使用 Spring 的 context 命令空間配置中的<context:annotation-config>,如下所示:

<beans ...>
<context:annotation-config/>
<!-- bean declarations go here -->
</beans>

Spring3 支持幾種不同的用于自動(dòng)裝配的注解:

  • Spring 自帶的@Autowired 注解
  • JSR-330 的@Inject 注解
  • JSR-250 的@Resource 注解

1、使用@Autowired

@Autowired 用于對(duì)被注解對(duì)象啟動(dòng) ByType 的自動(dòng)裝配,可用于以下對(duì)象:

  • 類屬性,即使私有屬性也能注入
  • set 方法
  • 構(gòu)造器
  • 任意需要裝配 Bean 的方法

在使用@Autowired 時(shí)有兩種情況會(huì)出錯(cuò):沒有匹配的 Bean 和存在多個(gè)匹配的 Bean,但是都有對(duì)應(yīng)的解決方法。

當(dāng)沒有匹配 Bean 時(shí),自動(dòng)裝配會(huì)拋出 NoSuchBeanDefinitionException,如果不想拋出可使用 required 屬性,設(shè)置為 false 來配置可選的自動(dòng)裝配,即裝配失敗就不進(jìn)行裝配,不會(huì)報(bào)錯(cuò)。

@Autowired(required=false)

當(dāng)使用構(gòu)造器配置時(shí),只有一個(gè)構(gòu)造器可以將 required 屬性設(shè)置為 true,其他都只能設(shè)置為 false。此外,當(dāng)使用注解標(biāo)注多個(gè)構(gòu)造器時(shí),Spring 會(huì)從所有滿足裝配條件的構(gòu)造器中選擇入?yún)⒆疃嗟哪莻€(gè)。

當(dāng)存在多個(gè) Bean 滿足裝配條件時(shí),Spring 也會(huì)拋出 NoSuchBeanDefinitionException 錯(cuò)誤,為了選擇指定的 Bean,我們可以使用@Qualifier 注解進(jìn)行篩選:

@Autowired
@Qualifier("name1")//篩選名為name1的Bean
private TestClass testClass;

除了通過 Bean 的 ID 來縮小選擇范圍,我們還可以通過直接在 Bean 上使用 qualifier 來縮小范圍,限制 Bean 的類型,xml 如下:

<bean class="com.test.xxx">
<qualifier value="stringed"/>
</bean>

注解如下:

@Qualifier("stringed")
public class xxx{}

還可以創(chuàng)建自定義限定器(Qualifier)

創(chuàng)建自定義限定器只需要使用@Qualifier 注解作為它的源注解即可,如下創(chuàng)建了一個(gè) Stringed 限定器:

@Target({ElementType.FIELD,ElementType.PARAMETER,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface Stringed{}

然后使用它注解一個(gè) Bean:

@Stringed
public class Guitar{}

然后就可以進(jìn)行限定了:

@Autowired
@Stringed
private Guitar guitar;

2、使用@Inject 自動(dòng)注入

為統(tǒng)一各種依賴注入框架的編程模型,JCP(Java Community Process)發(fā)布的 Java 依賴注入規(guī)范,被稱為 JSR-330,從 Spring3 開始,Spring 已經(jīng)開始兼容該依賴注入模型。

和@Autowired 一樣,@Inject 可以用來自動(dòng)裝配屬性、方法和構(gòu)造器。但是@Inject 沒有 required 屬性,因此依賴關(guān)系必須存在,如不存在將拋出異常。

JSR-330 還提供另一種注入技巧,注入一個(gè) Provider。Provider 接口可以實(shí)現(xiàn) Bean 引用的延遲注入以及注入 Bean 的多個(gè)實(shí)例等功能。

例如我們有一個(gè) KnifeJuggler 類需要注入一個(gè)或多個(gè) Knife 實(shí)例,假設(shè) Knife Bean 的作用域聲明為 prototype,下面的 KnifeJuggler 的構(gòu)造器將獲得多個(gè) Knife Bean:

private Set<Knife> knifes;
@Inject
public KnifeJuggler(Provider<Knife> knifeProvider){
knives = new HashSet<Knife>();
for(int i=0;i<5;i++){
knives.add(knifeProvider.get());
}
}

相對(duì)于@Autowired 所對(duì)應(yīng)的@Qualifier,@Inject 對(duì)應(yīng)的是@Named 注解。事實(shí)上 JSR-330 中也有@Qualifier 注解,不過不建議直接使用,建議通過該注解來創(chuàng)建自定義的限定注解,和 Spring 的@Qualifier 創(chuàng)建過程類似。

3、注解中使用表達(dá)式

Spring3 中引入的@Value屬性可用來裝配 String 類型的值和基本類型的值。借助 SpEL 表達(dá)式,@Value 不光可以裝配硬編碼值還可以在運(yùn)行期動(dòng)態(tài)計(jì)算表達(dá)式并裝配,例如下面的:

@Value("#{systemProperties.name}")
private String name;

三、自動(dòng)檢測(cè) Bean

在 Spring 中使用上面說到的<context:annotation-config>,可以做到自動(dòng)裝配,但還是要在 xml 中申明 Bean。Spring 還有另一個(gè)元素<context:component-scan>,元素除了完成自動(dòng)裝配的功能,還允許 Spring 自動(dòng)檢測(cè) Bean 和定義 Bean ,用法如下:

<beans ...>
<context:component-scan base-package="com.springtest">
</context:component-scan>
</beans>

開啟后支持如下注解:

注解 解釋
@Component 通用的構(gòu)造型注解,標(biāo)識(shí)類為 Spring 組件
@Controller 標(biāo)識(shí)該類定義為 Spring MVC controller
@Repository 標(biāo)識(shí)該類定義為數(shù)據(jù)倉(cāng)庫(kù)
@Service 標(biāo)識(shí)該類定義為服務(wù)

使用上述注解是 Bean 的 ID 默認(rèn)為無限定類名。使用@Component("name")指定 ID。

1、過濾組建掃描

通過為\context:component-scan配置<context:include-filter>和<context:exclude-filter>子元素,我們可以隨意調(diào)整掃描行為。下面的配置自動(dòng)注冊(cè)所有的 TestInterface 實(shí)現(xiàn)類:

<context:component-scan base-package="com.fxb.springtest">
<context:include-filter type="assignable"
expression="com.fxb.springTest.TestInterface"/>
</context:component-scan>

其中的 type 和 expression 屬性一起協(xié)作來定義組件掃描策略。type 有以下值可選擇:

過濾器類型 描述
annotation 過濾器掃描使用指定注解所標(biāo)注的類。通過 expression 屬性指定要掃描的注解
assignable 過濾器掃描派生于 expression 屬性所指定類型的那些類
aspectj 過濾器掃描于 expression 屬性所指定的 AspectJ 表達(dá)式所匹配的那些類
custom 使用自定義的 org.springframework.core.type.TypeFilter 實(shí)現(xiàn)類,該類由 expression 屬性指定
regex 過濾器掃描類的名稱與 expression 屬性所指定的正則表達(dá)式所匹配的類

exclude-filter 使用和 include-filter 類似,只是效果相反。

四、使用 Spring 基于 Java 的配置

在 Spring3.0 中幾乎可以不使用 XML 而使用純粹的 Java 代碼來配置 Spring 應(yīng)用。

首先還是需要極少量的 XML 來啟用 Java 配置,就是上面說到的<context:component-scan>,該標(biāo)簽還會(huì)自動(dòng)加載使用@Configuration注解所標(biāo)識(shí)的類

@Configuration 注解相當(dāng)于 XML 配置中的\元素,這個(gè)注解將會(huì)告知 Spring:這個(gè)類包含一個(gè)或多個(gè) Spring Bean 的定義,這些定義是使用@Bean 注解所標(biāo)注的方法

申明一個(gè)簡(jiǎn)單的 Bean 代碼如下:

@Configuration
public class TestConfig{
@Bean
public Animal duck(){
return new Ducker();
}
}

@Bean 告知 Spring 這個(gè)方法將返回一個(gè)對(duì)象,該對(duì)象應(yīng)該被注冊(cè)為 Spring 應(yīng)用上下文中的一個(gè) Bean,方法名作為該 Bean 的 ID 。想要使用另一個(gè) Bean 的引用也很簡(jiǎn)單,如下:

@Bean
public Food duckFood(){
return new DuckFood();
}
@Bean //通過方法名引用一個(gè)Bean,并不會(huì)創(chuàng)建一個(gè)新的實(shí)例
public Animal duck(){
return new Ducker(DuckFood());
}

五、小結(jié)

終于寫完了 spring 的最小化配置,對(duì) spring 的各種注解也有了一些了解,再不是之前看到注解一臉莫名其妙了,雖然現(xiàn)在 Springboot 已經(jīng)幫我們做了零 XML 配置,但覺得還是有必要了解下 XML 配置實(shí)現(xiàn),這樣對(duì) Java 的配置實(shí)現(xiàn)理解也會(huì)更加深刻。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java全能工具類之Hutool的用法詳解

    Java全能工具類之Hutool的用法詳解

    Hutool是一個(gè)Java工具類庫(kù),由國(guó)內(nèi)的程序員loolly開發(fā),目的是提供一些方便、快捷、實(shí)用的工具類和工具方法,本文就來詳細(xì)聊聊它的使用吧
    2023-03-03
  • 詳解Maven JAR包沖突問題排查及解決方案

    詳解Maven JAR包沖突問題排查及解決方案

    這篇文章主要介紹了Maven JAR包沖突問題排查及解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • SpringBoot 靜態(tài)資源導(dǎo)入及首頁(yè)設(shè)置問題

    SpringBoot 靜態(tài)資源導(dǎo)入及首頁(yè)設(shè)置問題

    本節(jié)了解一下 SpringBoot 中 Web 開發(fā)的靜態(tài)資源導(dǎo)入和首頁(yè)設(shè)置,對(duì)應(yīng) SpringBoot-03-Web 項(xiàng)目,本節(jié)主要是從源碼的角度,研究了一下靜態(tài)資源導(dǎo)入和首頁(yè)設(shè)置的問題
    2021-09-09
  • 整理Java編程中常用的基本描述符與運(yùn)算符

    整理Java編程中常用的基本描述符與運(yùn)算符

    這篇文章主要介紹了Java編程中常用的基本描述符與運(yùn)算符整理,包括運(yùn)算符優(yōu)先級(jí)等平時(shí)經(jīng)常查看反復(fù)記憶的知識(shí)點(diǎn),需要的朋友可以參考下
    2016-02-02
  • mybatis如何使用xml中的if-else/choose

    mybatis如何使用xml中的if-else/choose

    最近需要使用xml文件來實(shí)現(xiàn)一些增刪改查,此文對(duì)其中的if-else 加以說明,使用 xml 怎么來使用和接收呢,下面小編給大家講解mybatis如何使用xml中的if-else/choose,感興趣的朋友一起看看吧
    2024-04-04
  • JDK8中新增的Optional工具類基本使用

    JDK8中新增的Optional工具類基本使用

    Optional不是對(duì)null關(guān)鍵字的一種替代,而是對(duì)于null判定提供了一種更加優(yōu)雅的實(shí)現(xiàn),接下來通過本文給大家分享JDK8中新增的Optional工具類基本使用,感興趣的朋友跟隨小編一起看看吧
    2021-06-06
  • java 父類子類有同名方法時(shí)如何調(diào)用的實(shí)現(xiàn)

    java 父類子類有同名方法時(shí)如何調(diào)用的實(shí)現(xiàn)

    這篇文章主要介紹了java 父類子類有同名方法時(shí)如何調(diào)用的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • SpringBoot整合SpringSecurity實(shí)現(xiàn)認(rèn)證攔截的教程

    SpringBoot整合SpringSecurity實(shí)現(xiàn)認(rèn)證攔截的教程

    我們寫的任何一個(gè)項(xiàng)目,都應(yīng)該有安全防護(hù),不應(yīng)該讓這個(gè)項(xiàng)目進(jìn)行“裸奔”,否則很容易被別人進(jìn)行攻擊。而在SpringBoot環(huán)境中,其實(shí)可以很容易實(shí)現(xiàn)安全保護(hù),本文給大家介紹SpringBoot如何整合SpringSecurity實(shí)現(xiàn)認(rèn)證攔截,需要的朋友可以參考下
    2023-05-05
  • 解決IDEA中Maven項(xiàng)目中JSTL標(biāo)簽無效問題

    解決IDEA中Maven項(xiàng)目中JSTL標(biāo)簽無效問題

    這篇文章主要介紹了關(guān)于IDEA中Maven項(xiàng)目中JSTL標(biāo)簽無效問題的解決方法,需要的朋友可以參考下
    2018-09-09
  • 如何使用IDEA查看java文件編譯后的字節(jié)碼內(nèi)容

    如何使用IDEA查看java文件編譯后的字節(jié)碼內(nèi)容

    這篇文章主要介紹了如何使用IDEA查看java文件編譯后的字節(jié)碼內(nèi)容,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03

最新評(píng)論