1. 程式人生 > 其它 >Spring速查手冊——Bean裝配

Spring速查手冊——Bean裝配

Spring提供三種Bean的裝配方式,分別是: 1. 自動裝配Bean 2. 在Java中裝配Bean 3. 在XML中裝配Bean

1. 自動裝配Bean(註解)

Spring從兩個角度完成Bean的自動化裝配: - 元件掃描:掃描上下文中所有的Bean(由@Component、@Named註解完成) - 自動裝配:將指定的Bean注入到指定的Bean中(由@Autowired、@Injected註解完成)

1.1. 開啟元件掃描

  1. Java的配置方式 @Configuration // 把當前類作為配置類 @ComponentScan // 開啟元件掃描 public class XXXConfig(){}
    • 預設情況下掃描與當前配置類共同包下的元件;
    • 指定掃描的基礎包:
      1. @ComponentScan(“com.njupt.xxx”)
      2. @ComponentScan(basePackages=”com.njupt.xxx”)
      3. @ComponentScan(basePackages={“com.njupt.xxx”,”com.nju.xxx”})
      4. @ComponentScan(basePackageClasses={“XXXService.class”,”YYYService.class”})
  2. XML的配置方式
<context:component-scan base-package="xxx.xxx.xxx">

1.2. 標識元件

@Component
class xxx{}
  • 預設的Bean ID為第一個字母小寫的類名。
  • 指定Bean ID:@Component(“xxx”)
  • 第二種標識方式:@Named,和@Component用法一樣,只不過它是Java Dependency Injection規範中提供的。

1.3. 自動裝配

  1. 自動注入構造器引數 @Autowired public XXX( Y y ){ this.y = y; }
  2. 自動注入setter方法引數 @Autowired public void setXXX( X x ){ this.x = x; }

PS:也可使用@Inject註解,和@Named一樣,都是Java依賴注入規範的註解,Spring實現了這些註解。

2. 在Java中裝配Bean

2.1. 宣告Bean

@Configuration
class XXXConfig{
    // 建立一個Bean
    @Bean
    public A setA(){
        return new A();
    }
}
  • 方法名:bean的名字 也可以通過@Bean(name=”xxx”)指定bean的名字。
  • 函式體:通過new建立物件
  • 返回值:為該建立的bean物件

2.2. 注入

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

    // 注入方式一:執行setA函式(low比)
    @Bean
    public B setB(){
        return new B( setA() );
    }

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

3. 在XML中裝配Bean

3.1. 宣告一個bean

<bean id="xxx" class="com.xxx.xxx" />

3.2. 構造器注入

  1. 使用constructor-arg
<!-- 注入引用 -->
<bean id="xxx" class="com.xxx.xxx">
    <constructor-arg ref="yyy" />
</bean>
<!-- 注入字面值 -->
<bean id="xxx" class="com.xxx.xxx">
    <constructor-arg value="我是字面值" />
</bean>
<!-- 注入集合 -->
<bean id="xxx" class="com.xxx.xxx">
    <constructor-arg>
        <list>
            <value>啦啦啦1</value>
            <value>啦啦啦2</value>
            <value>啦啦啦3</value>
        </list>
    </constructor-arg>
</bean>

<bean id="xxx" class="com.xxx.xxx">
    <constructor-arg>
        <list>
            <ref bean="xxx1" />
            <ref bean="xxx2" />
            <ref bean="xxx3" />
        </list>
    </constructor-arg>
</bean>
  1. 使用c-名稱空間 首先需要在beans標籤中加入xmlns:c名稱空間。
<!-- 注入引用(若建構函式有多個引數) -->
<bean id="xxx" class="com.xxx.xxx" c:引數名-ref="yyy"/>

<!-- 注入引用(指定注入到第幾個引數中) -->
<bean id="xxx" class="com.xxx.xxx" c:0-ref="yyy"/>

<!-- 注入引用(若建構函式只有一個引數) -->
<bean id="xxx" class="com.xxx.xxx" c:_-ref="yyy"/>

<!-- 注入字面值 -->
<bean id="xxx" class="com.xxx.xxx" c:_引數名="啦啦啦"/>
<bean id="xxx" class="com.xxx.xxx" c:_0="啦啦啦"/>

<!-- 注入字面值(若建構函式只有一個引數) -->
<bean id="xxx" class="com.xxx.xxx" c:_="啦啦啦"/>

PS:c名稱空間不支援集合裝配!

3.3. 屬性注入

  1. 使用property屬性
<bean id="xxx" class="com.xxx.xxx">
    <property name="屬性名" ref="yyy" />
</bean>
  1. 使用P名稱空間 首先需要在beans標籤中引入p名稱空間。
<bean id="xxx" class="com.xxx.xxx" p:屬性名-ref="yyy" />

4. 混合使用JavaConfig中的bean和XML中的bean

4.1. 在JavaConfig中引用另一個javaConfig中的bean

@Configuration
@Import({XXXConfig.class,YYYConfig.class})
class XXXConfig{
    @Bean
    public A setA(){
        return new A();
    }
}

4.2. 在JavaConfig中引用XML中的bean

@Configuration
@ImportResource("classpath:xxx.xml")
class XXXConfig{
    @Bean
    public A setA(){
        return new A();
    }
}

4.3. 在XML中引入另一個XML

<beans>
    <import resource="xxx.xml" />
    <bean />
</beans>

4.4. 在XML中引入JavaConfig

直接宣告一個bean即可:

<bean class="com.xxx.XXXConfig" />