spring梳理(一)bean裝配方式介紹

spring 裝配bean有三種基本方式:

  • xml配置方式
  • java config方式
  • 自動裝配方式

1. xml配置方式

示例bean:


public class UserInfo {

    private String username;

    public UserInfo() {}
    public UserInfo(List<String> ns) {
        //假裝有這個list
    }

    public UserInfo(String name) {
        this.username = name;
    }

    public void setUsername(String name) {
        this.username = username;
    }
}

application.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
                           http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="userInfo" class="cn.wyn.ssm.pojo.UserInfo"/>
</beans>

一些bean會依賴其他bean,spring 會根據(jù)上下文裝入所需依賴豆胸。注入依賴的方式主要有構(gòu)造器注入屬性注入兩種悔据。

1.1 構(gòu)造器注入依賴

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
                           http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="userInfo" class="cn.wyn.ssm.pojo.UserInfo">
        <!--構(gòu)造器注入name屬性的值為Lily-->
        <constructor-arg name="name" value="Lily"/>
    </bean>
</beans>

也可以在constructor-arg 元素中以ref屬性注入其他配置的bean。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
                           http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="str" class="java.lang.String">
        <!--構(gòu)造器注入值為Lily-->
        <constructor-arg value="Lily"/>
    </bean>
    <bean id="userInfo" class="cn.wyn.ssm.pojo.UserInfo">
        <!--構(gòu)造器注入的依賴引用自id 為str的bean-->
        <constructor-arg name="name" ref="str"/>
    </bean>
</beans>

如果裝入的依賴是集合List類型(其他map類型類似):

<bean class="cn.wyn.ssm.pojo.UserInfo">
        <constructor-arg name="ns">
            <list>
                <ref bean="beanId1"/>
                <ref bean="beanId2"/>
            </list>
        </constructor-arg>
</bean>

constructor-arg元素的name屬性的值對應(yīng)的是構(gòu)造函數(shù)的參數(shù)名伟叛。

1.2 屬性setter方法注入

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
                           http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="userInfo" class="cn.wyn.ssm.pojo.UserInfo">
        <!--通過UserInfo的setUsername()方法注入-->
        <property name="username" value="Lily"/>
    </bean>
    
</beans>

property元素的name的值對應(yīng)的就是setXxx方法的xxx成員變量勃教。

2. java config 配置方式

java config配置方式是通過注解來配置bean淤击。

示例:

@Configuration
class DemoConfig{
    @Bean
    public A setA() {
        return new A();
    }

    // 方式1:執(zhí)行setA函數(shù)
    @Bean
    public B setB() {
        return new B(setA());
    }

    // 方式2:Spring自動注入
    @Bean
    public B setB(A a) {
        return new B(a);
    }
}

使用@Configuration注解注釋的類會被標(biāo)識為一個配置類,相當(dāng)于把該類作為spring的xml配置文件中的<beans>,該類會作為一個單獨的spring容器故源。

在掃描該配置bean的時候會將其中的帶有@Bean注解的方法依次執(zhí)行配置bean污抬,返回的bean默認(rèn)使用方法名作為bean的name。依賴注入使用方式2的spring自動注入方式相比方式1更優(yōu)雅绳军。

獲取該容器中的bean:


AnnotationConfigApplicationContext context2 = new AnnotationConfigApplicationContext(
                DemoConfig.class);
    context2.getBean("A");//獲取name為A的bean印机。

3. 自動裝配方式

@Configuration
@ComponentScan
public class DemoConfig {
}

使用了ComponentScan注解自動掃描,@ComponentScan注解如果不設(shè)置掃描的包的屬性矢腻,則默認(rèn)是掃描DemoConfig類所在包下的帶有@Component注解的Bean,并將帶有@Autowire和@Resource等注解的成員變量或者方法所需的依賴自動注入耳贬。

獲取該IOC容器中的Bean的方法同java config配置的方式踏堡。

ps:@Configuration注解標(biāo)注的類其實也是一個Component猎唁,因為該注解的定義上標(biāo)注了@Component注解咒劲,所以掃描的時候@Configuration注解也會被包括進(jìn)去,并自動執(zhí)行該類中所有@Bean注解的方法來配置Bean诫隅。

/**
* Configuration注解源碼
*/
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
    String value() default "";
}


4. 整合使用java config容器中的bean和xml配置容器中的bean

4.1 在java config中整合進(jìn)另一個java config容器

通過@Import注解來實現(xiàn)

@Configuration
@Import(BConfig.class)
@ComponentScan
public class AConfig {
    //此處省略一些@Bean方法
}

4.2 在java config 容器中整合進(jìn)另一個xml 的IOC容器中的bean

通過@ImportResource注解來實現(xiàn)腐魂。

@Configuration
@ImportResource("classpath:xxx.xml")
@ComponentScan
public class AConfig {
    //此處省略一些@Bean方法。
}

4.3 在xml 中整合另一個xml 中配置的bean逐纬。

通過<import>元素來實現(xiàn)蛔屹。

<?xml version="1.0" encoding="UTF-8"?>
<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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <import resource="classpath:xxx.xml"/>
</beans>

4.4 在xml 容器中整合java config中的bean

首先,我們想到的是直接將java config 類以bean的形式配置到xml中:

<bean class="cn.wyn.XxxConfig"/>

但是豁生,很明顯這種方法是不對的兔毒,因為注解方式是由spring中某些類來實現(xiàn)裝配的,使用java config方式會自動配置這些類到容器甸箱,但是xml方式不會自動配置這些類育叁,因此,我們需要手動配置這些類芍殖。

  • 如果你想使用@Autowired注解豪嗽,那么就必須事先在xml中聲明 AutowiredAnnotationBeanPostProcessor這個Bean
  • 如果想使用@ Resource@ PostConstruct豌骏、@ PreDestroy等注解就必須在xml中聲明CommonAnnotationBeanPostProcessor這個Bean
  • 如果想使用@PersistenceContext注解龟梦,就必須在xml中聲明PersistenceAnnotationBeanPostProcessor的Bean。
  • 如果想使用 @Required的注解窃躲,就必須在xml中聲明RequiredAnnotationBeanPostProcessor這個Bean计贰。

不過這些配置都可以直接用一條配置來替代:

<context:annotation-config/>

這條配置會顯示的向spring容器添加上面四個bean。

配置如下:

<context:anotation-config/>
<bean class="cn.wyn.XxxConfig"/>

但是蒂窒,還能更簡潔躁倒!

使用<component:scan>可以直接省去在xml中聲明java config 的Bean。

<componet:scan basePackage="cn.wyn"/>

一條配置解決刘绣,還能定義掃描的包樱溉。

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市纬凤,隨后出現(xiàn)的幾起案子福贞,更是在濱河造成了極大的恐慌,老刑警劉巖停士,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挖帘,死亡現(xiàn)場離奇詭異完丽,居然都是意外死亡,警方通過查閱死者的電腦和手機拇舀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門逻族,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人骄崩,你說我怎么就攤上這事聘鳞。” “怎么了要拂?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵抠璃,是天一觀的道長。 經(jīng)常有香客問我脱惰,道長搏嗡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任拉一,我火速辦了婚禮采盒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蔚润。我一直安慰自己磅氨,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布抽碌。 她就那樣靜靜地躺著悍赢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪货徙。 梳的紋絲不亂的頭發(fā)上左权,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機與錄音痴颊,去河邊找鬼赏迟。 笑死,一個胖子當(dāng)著我的面吹牛蠢棱,可吹牛的內(nèi)容都是我干的锌杀。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼泻仙,長吁一口氣:“原來是場噩夢啊……” “哼糕再!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起玉转,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤突想,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體猾担,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡袭灯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了绑嘹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片稽荧。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖工腋,靈堂內(nèi)的尸體忽然破棺而出姨丈,到底是詐尸還是另有隱情,我是刑警寧澤夷蚊,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布构挤,位于F島的核電站髓介,受9級特大地震影響惕鼓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜唐础,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一箱歧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧一膨,春花似錦呀邢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瞒津,卻和暖如春蝉衣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背巷蚪。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工病毡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人屁柏。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓啦膜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親淌喻。 傳聞我的和親對象是個殘疾皇子僧家,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)裸删,斷路器八拱,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,811評論 6 342
  • 本章內(nèi)容: 聲明Bean 構(gòu)造器注入和Setter方法注入 裝配Bean 控制bean的創(chuàng)建和銷毀 任何一個成功的...
    謝隨安閱讀 1,644評論 0 9
  • 文章作者:Tyan博客:noahsnail.com 3.4 Dependencies A typical ente...
    SnailTyan閱讀 4,159評論 2 7
  • 今天早上四點鐘開始失眠,這樣的日子有一段時間了,輾轉(zhuǎn)反側(cè)乘粒,思考人生豌注。夜,讓人無限聯(lián)想灯萍。黎明前的黑暗好長好長轧铁。...
    小宇君的口袋閱讀 247評論 0 0