1. 程式人生 > >Spring 之Bean的裝配

Spring 之Bean的裝配

med post java set pac () 構造參數 單元 引用

Spring Bean的裝配分為3中:

1、隱式發現和自動裝配

  @Component:將一個Java類聲明為Bean(組件類),等待Spring掃描發現。

  @ComponentScan:啟用組件掃描將帶有@Component的類實例化為Bean,一般用在配置類上,可指定掃描基礎包,默認與配置類相同的包。

  @Configuration:聲明一個Java類是配置類,它與@Component作用相當,只是更為直觀,一般@Bean與其連用。

  <context:component-scan base-package="...">:通過XML方式啟用組件掃描。

  @Autowired:為bean中的屬性自動註入,前提是該類必須聲明為一個bean,如添加@Component

  @Bean:將方法的返回對象作為bean,前提是該類必須是一個bean,如添加@Configuration

2、通過Java代碼裝配

  該部分就是@Configuration和@Bean的運用,通過手動創建對象,然後在配置成Bean。

3、通過XML配置

  xml配置規範:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:c="http://www.springframework.org/schema/c"
       xmlns:p
="http://www.springframework.org/schema/p" 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"> </beans>

  在<beans></beans>中聲明需要的bean,<bean id="xxx" class="全類名" &others.../>,或<bean ...>some configuration</bean>的形式。

  借助構造器註入初始化bean:使用<constructor-arg> or c命名空間(需要引入c命名空間,如上述xml頭部的xmlns:c=...)。

    使用<constructor-arg>:

    

<bean id="xxx" class="com.example.xxx">
    <constructor-arg ref="bean-id"/>
    <constructor-arg value="value"/>
    <constructor-arg><null/></constructor-arg>
</bean>

    使用c命名空間:

<bean id="xxx" class="com.example.xxx"
          c:xxx-ref = "bean-id"
          c:_xxx = "constant value"
/>
<!-- 還可以根據參數順序命名-->
<bean id="xxx" class="com.example.xxx"
          c:_0-ref = "bean-id"
          c:_1 = "constant value"
/>
<!-- 當只有一個參數時,直接用c:_-ref或c:_=即可-->

    但c命名空間有限制,當構造參數傳入一個集合時,只能使用<constructor-arg>:

  

<bean id="xxx" class="com.example.xxx">
    <constructor-arg ref="bean-id"/>
    <constructor-arg value="value"/>
    <constructor-arg><null/></constructor-arg>
    <constructor-arg>
        <list>
            <ref bean="b1"/>
            <ref bean="b2"/>
            <ref bean="b3"/>
        </list>                
    </constructor-arg>
    <constructor-arg><!--set and constant-->
        <set>
            <value>one</value>
            <value>two</value>
            <value>three</value>
        </set>                
    </constructor-arg>
</bean>

  設置屬性

<bean id="xxx" class="com.example.xxx">
    <property name="property-name" ref="bean-id"/>
    <property name="property-name" value="constant-value"/>
    <property name="property-name">
        <list>
           ...
        </list>
    </property>
</bean>    

    或者用p命名空間(在xml頭部用xmlns:p引入)

<bean id="xxx" class="com.example.xxx"
          p:p1-ref = "bean-id"
          p:p2 = "constant-value"   
/> 

<!--p命名空間不可用順序來確定屬性,同樣無法處理集合類-->

  Spring util命名空間簡化集合類:將集合變成一個bean

<!--使用util:list創建一個list的bean-->
<util:list id = "bean-id">
    <ref bean = "bean-id"/>
    <!-- or <value> tag -->
</util:list>

4、導入和混合配置

  JavaConfig引用xml配置:在配置類上使用@ImportResource註解導入xml,如@ImportResource("classpath:beans.xml")

JavaConfig互相引用:在配置類上使用@Import註解,如@Import(class-name.class)

XML引用XML:<import resource="beans.xml"/>

5、JUnit單元測試

maven引入JUnit和spring-test:

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.0.4.RELEASE</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>RELEASE</version>
        </dependency>

  編寫測試類:

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import soundsystem.CDPlayerConfig;
import soundsystem.CompactDisc;
import soundsystem.MediaPlayer;

/**
 * Author:
 * Date:2018/3/14 15:21
 * Email:
 * Comment:
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CDPlayerConfig.class)
public class CDPlayerTest {

    @Autowired
    private MediaPlayer player;

    @Autowired
    private CompactDisc cd;

    @Test
    public void cdShouldNotBeNull() {
        Assert.assertNotNull(cd);
    }

    @Test
    public void playTest() {
        player.play();
    }
}

持續更新...

Spring 之Bean的裝配