Spring詳解3.Bean的裝配

一年又一年铅忿,字節(jié)跳動(dòng) Lark(飛書) 研發(fā)團(tuán)隊(duì)又雙叒叕開始招新生啦觉啊!
【內(nèi)推碼】:GTPUVBA
【內(nèi)推鏈接】:https://job.toutiao.com/s/JRupWVj
【招生對(duì)象】:20年9月后~21年8月前 畢業(yè)的同學(xué)
【報(bào)名時(shí)間】:6.16-7.16(提前批簡(jiǎn)歷投遞只有一個(gè)月抓住機(jī)會(huì)哦!)
【畫重點(diǎn)】:提前批和正式秋招不矛盾跋选!面試成功颓屑,提前鎖定Offer仗岸;若有失利,額外獲得一次面試機(jī)會(huì)奕删,正式秋招開啟后還可再次投遞俺泣。

點(diǎn)擊進(jìn)入我的博客

更多章節(jié)

Spring詳解1.概述
Spring詳解2.理解IoC容器
Spring詳解3.Bean的裝配
Spring詳解4.容器內(nèi)幕
Spring詳解5.AOP
Spring詳解6.基于AspectJ的AOP
Spring詳解7.Spring MVC
Spring詳解8.Spring DAO

1 Spring容器與Bean配置信息

Bean配置信息

Bean配置信息是Bean的元數(shù)據(jù)信息,它由一下4個(gè)方面組成:

  • Bean的實(shí)現(xiàn)類
  • Bean的屬性信息完残,如數(shù)據(jù)庫的連接數(shù)伏钠、用戶名、密碼谨设。
  • Bean的依賴關(guān)系熟掂,Spring根據(jù)依賴關(guān)系配置完成Bean之間的裝配。
  • Bean的行為信息铝宵,如生命周期范圍及生命周期各過程的回調(diào)函數(shù)打掘。
Bean元數(shù)據(jù)信息

Bean元數(shù)據(jù)信息在Spring容器中的內(nèi)部對(duì)應(yīng)物是一個(gè)個(gè)BeanDefinition形成的Bean注冊(cè)表,Spring實(shí)現(xiàn)了Bean元數(shù)據(jù)信息內(nèi)部表示和外部定義之間的解耦鹏秋。

Spring支持的配置方式

Spring1.0僅支持基于XML的配置尊蚁,Spring2.0新增基于注解配置的支持,Spring3.0新增基于Java類配置的支持侣夷,Spring4.0則新增給予Groovy動(dòng)態(tài)語言配置的支持横朋。


Spring容器內(nèi)部協(xié)作解構(gòu)

2 基于XML的配置

2.1 理解XML與Schema

<?xml version="1.0" encoding="utf-8" ?>
<beans (1)xmlns="http://www.springframework.org/schema/beans"
       (2)xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:(3)context=(4)"http://www.springframework.org/schema/context"
       xsi:(5)schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context.xsd">
</beans>
  • (1)處是默認(rèn)命名空間,無命名空間前綴的元素屬于默認(rèn)命名空間百拓。
  • (2)xsi標(biāo)準(zhǔn)命名空間琴锭,用于指定自定義命名空間的Schema文件
  • (3)自定義命名空間的簡(jiǎn)稱晰甚,可以任意命名
  • (4)自定義命名空間的全稱,必須在xsi命名空間為其指定空間對(duì)應(yīng)的Schema文件决帖,可以任意命名厕九,習(xí)慣上用文檔發(fā)布機(jī)構(gòu)的相關(guān)網(wǎng)站目錄。
  • (5)為每個(gè)命名空間指定Schema文件位置地回,
詳解xmlns
  • 定義:xml namespace的縮寫扁远,可譯為“XML命名空間”。
  • 作用:防止XML文檔含有相同的元素命名沖突刻像,如<table>既可以表示表格畅买,又可以表示桌子。如果增加了命名空間如<table>和<t:table>就可以使兩者區(qū)分開來细睡。
  • 使用:xmlns:namespace-prefix="namespaceURI"谷羞,其中namespace-prefix為自定義前綴,只要在這個(gè)XML文檔中保證前綴不重復(fù)即可溜徙;namespaceURI是這個(gè)前綴對(duì)應(yīng)的XML Namespace的定義湃缎。
理解xsi:schemaLocation

xsi:schemaLocation定義了XML Namespace和對(duì)應(yīng)的 XSD(Xml Schema Definition)文檔的位置的關(guān)系。它的值由一個(gè)或多個(gè)URI引用對(duì)組成萌京,兩個(gè)URI之間以空白符分隔(空格和換行均可)雁歌。第一個(gè)URI是定義的 XML Namespace的值,第二個(gè)URI給出Schema文檔的位置知残,Schema處理器將從這個(gè)位置讀取Schema文檔靠瞎,該文檔的targetNamespace必須與第一個(gè)URI相匹配。例如:

<beans 
       xsi:schemaLocation="http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context.xsd">
</beans>

這里表示Namespace為http://www.springframework.org/schema/context的Schema的位置為http://www.springframework.org/schema/context/spring-context.xsd求妹。

2.2 使用XML裝配Bean

直接裝配Bean
<!--id不可以配置多個(gè): context.getBean("myBean1, myBean2")-->
<bean class="com.ankeetc.spring.MyBean" id="myBean1, myBean2"/>
    
<!--context.getBean("myBean1") == context.getBean("myBean2")-->
<bean class="com.ankeetc.spring.MyBean" name="myBean1, myBean2"/>
  • id:用于表示一個(gè)Bean的名稱乏盐,在容器內(nèi)不能重復(fù);不可以配置多個(gè)id制恍。
  • name:用于表示一個(gè)Bean的名稱父能,在容器內(nèi)不能重復(fù);可以配置多個(gè)名稱净神,用,分割何吝;id和name可以都為空,此時(shí)則可以通過獲取全限定類名來獲取Bean鹃唯。
  • class:全限定類名
靜態(tài)工廠方法裝配
  • 靜態(tài)工廠無需創(chuàng)建工廠類示例就可以調(diào)用工廠類方法爱榕。
  • factory-method:工廠方法
public class MyBeanFactory {
    public static MyBean createMyBean() {
        return new MyBean();
    }
}
<bean id="myBean" class="com.ankeetc.spring.MyBeanFactory" factory-method="createMyBean"/>
非靜態(tài)工廠方法裝配
  • 非靜態(tài)工廠方法必須首先定義一個(gè)工廠類的Bean,然后通過factory-bean引用工廠類實(shí)例坡慌。
  • factory-bean:指向定義好的工廠Bean
public class MyBeanFactory {
    public MyBean createMyBean() {
        return new MyBean();
    }
}
<bean id="myBeanFactory" class="com.ankeetc.spring.MyBeanFactory"/>
<bean id="myBean" factory-bean="myBeanFactory" factory-method="createMyBean"/>
Bean的繼承和依賴
  • parent:通過設(shè)置<bean>標(biāo)簽的parent屬性黔酥,子<bean>將自動(dòng)繼承父<bean>的配置信息。
  • depends-on:通過設(shè)置<bean>標(biāo)簽的depends-on屬性,Spring允許顯示的設(shè)置當(dāng)前Bean前置依賴的Bean跪者,確保前置依賴的Bean在當(dāng)前Bean實(shí)例化之前已經(jīng)創(chuàng)建好棵帽。
自動(dòng)裝配autowire

<beans>元素提供了一個(gè)default-autowire屬性可以全局自動(dòng)匹配全封,默認(rèn)為no翘瓮。<bean>元素提供了一個(gè)指定自動(dòng)裝配類型的autowire屬性,可以覆蓋<beans>元素的default-autowire屬性箕宙,該屬性有如下選項(xiàng):

自動(dòng)裝配類型 說明
no 顯式指定不使用自動(dòng)裝配忘衍。
byName 如果存在一個(gè)和當(dāng)前屬性名字一致的 Bean仗谆,則使用該 Bean 進(jìn)行注入。如果名稱匹配但是類型不匹配淑履,則拋出異常。如果沒有匹配的類型藻雪,則什么也不做秘噪。
byType 如果存在一個(gè)和當(dāng)前屬性類型一致的 Bean ( 相同類型或者子類型 ),則使用該 Bean 進(jìn)行注入勉耀。byType 能夠識(shí)別工廠方法指煎,即能夠識(shí)別 factory-method 的返回類型。如果存在多個(gè)類型一致的 Bean便斥,則拋出異常至壤。如果沒有匹配的類型,則什么也不做枢纠。
constructor 與 byType 類似像街,只不過它是針對(duì)構(gòu)造函數(shù)注入而言的。如果當(dāng)前沒有與構(gòu)造函數(shù)的參數(shù)類型匹配的 Bean晋渺,則拋出異常镰绎。使用該種裝配模式時(shí),優(yōu)先匹配參數(shù)最多的構(gòu)造函數(shù)木西。
default 根據(jù) Bean 的自省機(jī)制決定采用 byType 還是 constructor 進(jìn)行自動(dòng)裝配畴栖。如果 Bean 提供了默認(rèn)的構(gòu)造函數(shù),則采用 byType八千;否則采用 constructor 進(jìn)行自動(dòng)裝配吗讶。
通過util命名空間配置集合類型的Bean
<util:list></util:list>
<util:set></util:set>
<util:map></util:map>

2.3 使用XML依賴注入

屬性配置
  • Bean有一個(gè)無參數(shù)的構(gòu)造器
  • 屬性有對(duì)應(yīng)的Setter函數(shù)
  • 屬性命名滿足JavaBean的屬性命名規(guī)范
<bean class="com.ankeetc.spring.MyBean" id="myBean">
    <property name="prop" value="prop"/>
</bean>
構(gòu)造方法
  • constructor-arg中的type和index可以沒有,只要能保證可以唯一的確定對(duì)應(yīng)的構(gòu)造方法即可
  • type中基本數(shù)據(jù)類型和對(duì)應(yīng)的包裝類不能通用
  • 循環(huán)依賴:如果兩個(gè)Bean都采用構(gòu)造方法注入恋捆,而且都通過構(gòu)造方法入?yún)⒁脤?duì)方照皆,就會(huì)造成循環(huán)依賴導(dǎo)致死鎖。
<bean class="com.ankeetc.spring.MyBean" id="myBean">
    <constructor-arg type="java.lang.String" index="0" value="abc"/>
    <constructor-arg type="int" index="1" value="10"/>
</bean>

2.4 注入?yún)?shù)

字面值
  • 基本數(shù)據(jù)類型及其封裝類鸠信、String都可以采取字面值注入纵寝。
  • 特殊字符可以使用<![CDATA[]]>節(jié)或者轉(zhuǎn)義序列
引用其他Bean

<ref>元素可以通過以下三個(gè)屬性引用容器中的其他Bean:

  • bean:通過該屬性可以引用同一容器或父容器的Bean,這是最常見的形式。
  • local:通過該屬性只能引用同一配置文件中定義的Bean爽茴,它可以利用XML解析器自動(dòng)檢驗(yàn)引用的合法性葬凳,以便在開發(fā)編寫配置時(shí)能夠及時(shí)發(fā)現(xiàn)并糾正配置的錯(cuò)誤。
  • parent:引用父容器中的Bean室奏,如<ref parent="car">的配置說明car的Bean是父容器中的Bean火焰。
內(nèi)部Bean
  • 內(nèi)部Bean只會(huì)被當(dāng)前Bean引用,不會(huì)被容器中其他的Bean引用
  • 內(nèi)部Bean即使提供了id胧沫、name昌简、scope也會(huì)被忽略,Scope默認(rèn)為prototype類型绒怨。
    <bean id="prop" class="com.ankeetc.spring.Prop">
        <property name="value" value="1314"/>
    </bean>

    <bean id="myBean" class="com.ankeetc.spring.MyBean">
        <property name="prop">
            <!--內(nèi)部Bean即使提供了id纯赎、name、scope也會(huì)被忽略-->
            <bean id="prop" class="com.ankeetc.spring.Prop">
                <property name="value" value="520"/>
            </bean>
        </property>
    </bean>
null值
  • 使用<null/>代表null值
級(jí)聯(lián)屬性
  • Spring支持級(jí)聯(lián)屬性如prop.value南蹂,而且支持多層級(jí)聯(lián)屬性
  • 級(jí)聯(lián)屬性必須有初始值犬金,否則會(huì)拋出NullValueInNestedPathException
public class MyBean {
    // 必須初始化
    private Prop prop = new Prop();

    public Prop getProp() {
        return prop;
    }

    public void setProp(Prop prop) {
        this.prop = prop;
    }
}
    <bean id="myBean" class="com.ankeetc.spring.MyBean">
        <property name="prop.value" value="1314"/>
    </bean>
集合類型屬性
  • List、Set六剥、Map:通過<list><set><map><entry>等標(biāo)簽可以設(shè)置List晚顷、Set、Map的屬性
  • Properties:可以通過<props><prop>等標(biāo)簽設(shè)置Properties的屬性疗疟,Properties屬性的鍵值都只能是字符串该默。
  • 集合合并:子Bean可以繼承父Bean的同名屬性集合元素,并且使用merge屬性選擇是否合并策彤,默認(rèn)不合并栓袖。
    <bean id="parentBean" class="com.ankeetc.spring.MyBean">
        <property name="list">
            <list>
                <value>1314</value>
            </list>
        </property>
    </bean>

    <bean id="myBean" class="com.ankeetc.spring.MyBean" parent="parentBean">
        <property name="list">
            <list merge="true">
                <value>520</value>
            </list>
        </property>
    </bean>

2.5 多配置文件整合

  1. 可以通過ApplicationContext加載多個(gè)配置文件,此時(shí)多個(gè)配置文件中的<bean>是可以互相訪問的锅锨。
  2. 可以通過XML中的<import>將多個(gè)配置文件引入到一個(gè)文件中叽赊,這樣只需要加載一個(gè)配置文件即可。

2.6 Bean的作用域

類型 說明
singleton 在Spring IoC容器中僅存在一個(gè)Bean實(shí)例必搞,Bean以單實(shí)例的方式存在
prototype 每次從容器中調(diào)用Bean時(shí)必指,都返回一個(gè)新的實(shí)例
request 每次HTTP請(qǐng)求都會(huì)創(chuàng)建一個(gè)新的Bean,該作用域僅適用于WebApplicationContext環(huán)境
session 同一個(gè)HTTP session共享一個(gè)Bean恕洲,不同的HTTP session使用不同的Bean塔橡,該作用域僅適用于WebApplicationContext環(huán)境
globalSession 同一個(gè)全局Session共享一個(gè)Bean,一般用于Portlet環(huán)境霜第,該作用域僅適用于WebApplicationContext環(huán)境
singleton作用域
  • 無狀態(tài)或者狀態(tài)不可變的類適合使用單例模式
  • 如果用戶不希望在容器啟動(dòng)時(shí)提前實(shí)例化singleton的Bean葛家,可以使用lazy-init屬性進(jìn)行控制
  • 如果該Bean被其他需要提前實(shí)例化的Bean所引用,那么Spring將會(huì)忽略lazy-init的設(shè)置
prototype作用域
  • 設(shè)置為scope="prototype"之后泌类,每次調(diào)用getBean()都會(huì)返回一個(gè)新的實(shí)例
  • 默認(rèn)情況下癞谒,容器在啟動(dòng)時(shí)不會(huì)實(shí)例化prototype的Bean
  • Spring容器將prototype的Bean交給調(diào)用者后就不再管理它的生命周期
Web應(yīng)用環(huán)境相關(guān)的Bean作用域

見后續(xù)章節(jié)

作用域依賴的問題

見后續(xù)章節(jié)

3 FactoryBean

由于實(shí)例化Bean的過程比較負(fù)責(zé),可能需要大量的配置,這是采用編碼的方式可能是更好的選擇弹砚。Spring提供了FactoryBean工廠類接口双仍,用戶可以實(shí)現(xiàn)該接口定制實(shí)例化Bean的邏輯。當(dāng)配置文件中<bean>的class屬性配置的是FactoryBean的子類時(shí)桌吃,通過getBean()返回的不是FactoryBean本身朱沃,而是getObject()方法所返回的對(duì)象,相當(dāng)于是FactoryBean#getObject()代理了getBean()方法茅诱。

  • T getObject() throws Exception;:返回由FactoryBean創(chuàng)建的Bean實(shí)例逗物,如果isSingleton()返回的是true,該實(shí)例會(huì)放到Spring容器的實(shí)例緩存池中瑟俭。
  • Class<?> getObjectType();:返回該FactoryBean創(chuàng)建的Bean的類型
  • boolean isSingleton();:創(chuàng)建的Bean是singleton的還是prototype
/**
 * 實(shí)現(xiàn),分割的方式配置 KFCCombo 屬性
 */
public class KFCFactoryBean implements FactoryBean<KFCCombo> {
    private String prop;

    public String getProp() {
        return prop;
    }

    // 接受,分割的屬性設(shè)置信息
    public void setProp(String prop) {
        this.prop = prop;
    }

    // 實(shí)例化KFCCombo
    public KFCCombo getObject() throws Exception {
        KFCCombo combo = new KFCCombo();
        String[] props = prop.split(",");
        combo.setBurger(props[0]);
        combo.setDrink(props[1]);
        return combo;
    }

    public Class<?> getObjectType() {
        return KFCCombo.class;
    }

    // true則放進(jìn)容器緩存池翎卓,false則每次都調(diào)用getObject()方法返回新的對(duì)象
    public boolean isSingleton() {
        return false;
    }
}
    <bean id="combo" class="com.ankeetc.spring.KFCFactoryBean">
        <property name="prop" value="ZingerBurger, PepsiCola"/>
    </bean>

4 基于注解的配置

4.1 支持的注解

@Component:在Bean的實(shí)現(xiàn)類上直接標(biāo)注,可以被Spring容器識(shí)別
@Repository:用于對(duì)DAO實(shí)現(xiàn)類進(jìn)行標(biāo)柱
@Service:用于對(duì)Service實(shí)現(xiàn)類進(jìn)行標(biāo)注
@Controller:用于對(duì)Controller實(shí)現(xiàn)類進(jìn)行標(biāo)注

4.2 掃描注解定義對(duì)Bean

Spring提供了一個(gè)context命名空間摆寄,用于掃描以注解定義Bean的類莲祸。

<!--生命c(diǎn)ontext命名空間-->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
       http://www.springframework.org/schema/context 
       http://www.springframework.org/schema/context/spring-context-4.0.xsd">

    <context:component-scan base-package="com.ankeetc.spring"/>
</beans>
base-package屬性
  • 指定一個(gè)需要掃描的基類包,Spring容器會(huì)掃描這個(gè)包下的所有類椭迎,并提取標(biāo)注了相關(guān)注解的Bean。
resource-pattern屬性
  • 如果不希望掃描base-package下的所有類田盈,可以使用該屬性提供過濾
  • 該屬性默認(rèn)是**/*.class畜号,即基包下的所有類
<context:exclude-filter>與<context:include-filter>
  • <context:exclude-filter>:表示要排除的目標(biāo)類
  • <context:include-filter>:表示要包含的目標(biāo)類
  • <context:component-scan>可以有多個(gè)上述兩個(gè)子元素;首先根據(jù)exclude-filter列出需要排除的黑名單允瞧,然后再根據(jù)include-filter流出需要包含的白名單简软。
類別 示例 說明
annotation com.ankeetc.XxxAnnotation 所有標(biāo)注了XxxAnnotation的類。該類型采用目標(biāo)類是否標(biāo)志了某個(gè)注解進(jìn)行過濾述暂。
assignable com.ankeetc.XxService 所有繼承或擴(kuò)展XXXService的類痹升。該類型采用目標(biāo)類是否繼承或者擴(kuò)展了某個(gè)特定類進(jìn)行過濾
aspectj com.ankeetc..*Service+ 所有類名以Service結(jié)束的類及繼承或者擴(kuò)展他們的類。該類型采用AspectJ表達(dá)式進(jìn)行過濾
regex com.ankeetc.auto..* 所有com.ankeetc.auto類包下的類畦韭。該類型采用正則表達(dá)式根據(jù)目標(biāo)類的類名進(jìn)行過濾
custom com.ankeetc.XxxTypeFilter 采用XxxTypeFilter代碼方式實(shí)現(xiàn)過濾規(guī)則疼蛾,該類必須實(shí)現(xiàn)org.springframework.core.type.TypeFilter接口
use-default-filters屬性
  • use-default-filters屬性默認(rèn)值為true,表示會(huì)對(duì)標(biāo)注@Component艺配、@Controller察郁、@Service、@Reposity的Bean進(jìn)行掃描转唉。
  • 如果想僅掃描一部分的注解皮钠,需要將該屬性設(shè)置為false。
<!-- 僅掃描標(biāo)注了@Controller注解的類-->
<context:component-scan base-package="com.ankeetc.spring" use-default-filters="false">
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

4.3 自動(dòng)裝配

@Component
public class KFCCombo {
    @Autowired
    private PepsiCola cola;

    @Autowired
    private Map<String, Cola> colaMap;

    @Autowired
    private List<ZingerBurger> burgerList;

    private ZingerBurger burger;
    @Autowired
    public void setBurger(@Qualifier(value = "zingerBurger") ZingerBurger burger) {
        this.burger = burger;
    }

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"classpath:/beans.xml"});

        KFCCombo combo = context.getBean(KFCCombo.class);
    }
}

interface Cola {}

@Order(value = 1)
@Component
class CocaCola implements Cola {}

@Order(value = 2)
@Component
class PepsiCola implements Cola {}

@Component(value = "zingerBurger")
class ZingerBurger {
}
@Autowired注解
  • 使用該注解可以按類型自動(dòng)裝配對(duì)應(yīng)的Bean
  • 沒有找到對(duì)應(yīng)的Bean則會(huì)拋出NoSuchBeanDefinitionException異常
  • 使用required=false屬性可以設(shè)置即使找不到對(duì)應(yīng)的Bean(即為null)也不會(huì)拋出異常
  • @Autowired可以對(duì)類成員變量及方法入?yún)⑦M(jìn)行標(biāo)注
@Quaifiler
  • 如果容器中有一個(gè)以上匹配的Bean時(shí)赠法,可以按照Bean名字查找對(duì)應(yīng)的Bean
  • @Quaifiler需要與@Autowired配合使用
對(duì)集合類進(jìn)行標(biāo)注
  • 可以使用@Autowired對(duì)集合類進(jìn)行標(biāo)注麦轰,Spring會(huì)講容器中按類型匹配對(duì)所有Bean注入進(jìn)來
  • 可以使用@Order指定加載順序,值越小的越先加載
@Lazy延遲加載
  • 可以使用@Lazy實(shí)現(xiàn)延遲加載,不會(huì)立即注入屬性值款侵,而是延遲到調(diào)用此屬性對(duì)時(shí)候才會(huì)注入屬性值末荐。
@Resource和@Inject
  • Spring支持JSR-250中@Resource注解和JSR-330的@Inject注解
  • @Resource采用的是按照名稱加載的方式,它要求提供一個(gè)Bean名稱的屬性喳坠,如果屬性為空鞠评,則自動(dòng)采用標(biāo)注處的變量名或方法名作為Bean的名稱。
  • @Inject是按照類型匹配注入Bean的壕鹉。
  • 由于這兩個(gè)注解功能沒有@Autowired功能強(qiáng)大剃幌,一般不需要使用。

4.4 Bean作用范圍及生命周期

  • 注解配置的Bean默認(rèn)作用范圍為singleton晾浴,可以使用@Scope顯示指定作用范圍
  • 可以使用@PostConstruct和@PreDestroy注解來達(dá)到init-method和destroy-method屬性的功能负乡。
  • @PostConstruct和@PreDestroy注解可以有多個(gè)

5 基于Java類的配置

5.1 @Configuration注解

  • JavaConfig是Spring的一個(gè)子項(xiàng)目,旨在通過Java類的方式提供Bean的定義信息脊凰。
  • 普通的POJO標(biāo)注了@Configuration注解抖棘,就可以被Spring容器提供Bean定義信息。
  • @Configuration注解本身已經(jīng)標(biāo)注了@Component注解狸涌,所以任何標(biāo)注了@Configuration的類都可以作為普通的Bean切省。

5.2 @Bean注解

  • @Bean標(biāo)注在方法上,用于產(chǎn)生一個(gè)Bean
  • Bean的類型由方法的返回值的類型確定帕胆,Bean名稱默認(rèn)與方法名相同朝捆,也可以顯示指定Bean的名稱。
  • 可以使用@Scope來控制Bean的作用范圍懒豹。

5.3 啟動(dòng)Spring容器

通過@Configuration類啟動(dòng)Spring容器
  1. 可以直接設(shè)置容器啟動(dòng)要注冊(cè)的類
  2. 可以向容器中注冊(cè)新的類芙盘,注冊(cè)了新的類要記得refresh
  3. 可以通過@Import將多個(gè)配置類組裝稱一個(gè)配置類
public class Main {
    public static void main(String[] args) {
        // (1)可以直接設(shè)置容器啟動(dòng)要加載的類
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(DaoConfig.class);
        // (2)可以向容器中注冊(cè)新的類
        ((AnnotationConfigApplicationContext) applicationContext).register(ServiceConfig.class);
        // (3)注冊(cè)了新的類要記得refresh
        ((AnnotationConfigApplicationContext) applicationContext).refresh();
    }
}

@Configuration
class DaoConfig {
    @Bean
    public String getStr() {
        return "1314";
    }
}

@Configuration
@Import(DaoConfig.class)
// (4)可以通過@Import將多個(gè)配置類組裝稱一個(gè)配置類
class ServiceConfig {
}
通過XML配置文件引用@Configuration的配置

標(biāo)注了@Configureation的配置類本身也是一個(gè)bean,它可以被Spring的<context:component-scan>掃描到脸秽。如果希望將此配置類組裝到XML配置文件中儒老,通過XML配置文件啟動(dòng)Spring容器,僅在XML文件中通過<context:component-scan>掃描到相應(yīng)的配置類即可记餐。

<context:component-scan base-package="com.ankeetc.spring" resource-pattern="Config.class"/>
通過@Configuration配置類引用XML配置信息

在標(biāo)注了@Configuration的配置類中驮樊,可以通過@ImportResource引入XML配置文件。

@Configuration
@ImportResource("classpath:beans.xml")
public class Config {
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末片酝,一起剝皮案震驚了整個(gè)濱河市巩剖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌钠怯,老刑警劉巖佳魔,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異晦炊,居然都是意外死亡鞠鲜,警方通過查閱死者的電腦和手機(jī)宁脊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贤姆,“玉大人榆苞,你說我怎么就攤上這事∠技瘢” “怎么了坐漏?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)碧信。 經(jīng)常有香客問我赊琳,道長(zhǎng),這世上最難降的妖魔是什么砰碴? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任躏筏,我火速辦了婚禮,結(jié)果婚禮上呈枉,老公的妹妹穿的比我還像新娘趁尼。我一直安慰自己,他們只是感情好猖辫,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布酥泞。 她就那樣靜靜地躺著,像睡著了一般啃憎。 火紅的嫁衣襯著肌膚如雪婶博。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天荧飞,我揣著相機(jī)與錄音,去河邊找鬼名党。 笑死叹阔,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的传睹。 我是一名探鬼主播耳幢,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼欧啤!你這毒婦竟也來了睛藻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤邢隧,失蹤者是張志新(化名)和其女友劉穎店印,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體倒慧,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡按摘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年包券,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炫贤。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡溅固,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出兰珍,到底是詐尸還是另有隱情侍郭,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布掠河,位于F島的核電站亮元,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏口柳。R本人自食惡果不足惜苹粟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望跃闹。 院中可真熱鬧嵌削,春花似錦、人聲如沸望艺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽找默。三九已至艇劫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間惩激,已是汗流浹背店煞。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留风钻,地道東北人顷蟀。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像骡技,于是被迫代替她去往敵國(guó)和親鸣个。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359