码迷,mamicode.com
首页 > 编程语言 > 详细

第3章 最小化Spring XML配置

时间:2016-07-08 23:14:31      阅读:263      评论:0      收藏:0      [点我收藏+]

标签:

目录:

  1.  自动装配Bean属性
  2.  使用注解装配
  3.  自动检测Bean
  4. 使用Spring基于Java的配置

自动装配Bean属性

四种类型的自动装配:

  1 byName 通过id的名字与属性的名字进行判断,要保证Bean实例中属性名字与该装配的id名字相同。

  2 byType 通过类型确定装配的bean,但是当存在多个类型符合的bean时,会报错。

  3 contructor 在构造注入时,使用该装配方式,效果如同byType。

  4 autodetect 首先尝试使用constructor进行自动装配。如果失败,再次尝试使用byType经行自动装配。(测试过,3.0.5版本不可用了,不知道是不是被移除了。)

 

 

自动装配以-byType为例讲解:

在byType装配方式下,spring首先会反射autowire="byType"的bean,得到bean属性的返回类型,然后去spring容器中按照类

型去匹配,最后把匹配到的bean注入到当前bean中.看个例子就明白了:

1.新建包com.tutorialspoint.autowire.bytype,并在包中新建Zoo.java类,内容如下:

技术分享
package com.tutorialspoint.autowire.bytype;

import com.tutorialspoint.autowire.Cat;
import com.tutorialspoint.autowire.Dog;
import com.tutorialspoint.autowire.Duck;

public class Zoo {

    private Cat cat;
    private Dog dog;
    private Duck duck;
    // 自动装配并不适用于原始类型.这时候我们可以对该属性进行手动装配
    private String zooName;

    public void setZooName(String zooName) {
        this.zooName = zooName;
    }

    public void setCat(Cat cat) {
        this.cat = cat;
    }

    public void setDog(Dog dog) {
        this.dog = dog;
    }

    public void setDuck(Duck duck) {
        this.duck = duck;
    }

    public void print() {

        if (cat == null) {
            System.out.println("cat is null");
        } else {
            cat.sayHi();
        }

        if (dog == null) {
            System.out.println("dog is null");
        } else {
            dog.sayHi();
        }

        if (duck == null) {
            System.out.println("duck is null");
        } else {
            duck.sayHi();
        }

        System.out.println(zooName);
    }

}
View Code

 

2.在src目录下新建配置文件autowire_byType.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-3.0.xsd">
    
   <!-- 名为zoo的bean在按照byType进行装配的时候,可以适配名字为cat1、dog1、duck1
        的bean的类型。所以最终cat1、dog1、duck1会被分别注入进zoo的cat、dog、duck属性。
        在按照类型进行装配的时候,如过有两个bean的类型符合的话,spring就不知道最终该使用哪个,这时候我们
        可以使用primary="true"告诉spring优先使用本bean
   -->
   <bean id="cat1" class="com.tutorialspoint.autowire.Cat" primary="true"></bean>
   <bean id="cat2" class="com.tutorialspoint.autowire.Cat"></bean>
   <bean id="dog1" class="com.tutorialspoint.autowire.Dog"></bean>
   <bean id="duck1" class="com.tutorialspoint.autowire.Duck"></bean>
   
   <bean id="zoo" class="com.tutorialspoint.autowire.bytype.Zoo" autowire="byType">
       <!-- 由于自动装配仅适用于引用类型,普通类型还需要手动进行注入 -->
       <property name="zooName" value="international_zoo"></property>
   </bean>

</beans>

注:

  1. 为自动装配标识一个首选Bean,可以使用<bean>元素的primary属性。如果只有一个自动装配的候选Bean的primary属性设置为true,那么该Bean将比其他候选Bean优先被选择。但是primary属性有一个很怪异的一点,它的默认设置为true。这意味着所有的候选Bean都变成首选Bean(因此,其实就不存在首选Bean了)。所有,为了使用primary属性,我们不得不将所有非首选Bean的primary属性设置为false。
  2. primary属性仅对标识首选Bean有意义。如果在自动装配时。我们希望排除某些Bean,那可以设置这些Bean的autowire-candidate属性为false,示例如下:
<bean id="saxophone" class="com.springinaction.springidol.Saxophone" autowire-candidate="false"/>

默认自动装配

如果需要为Spring应用的上下文中的每一个Bean(或者其中的大多数)配置相同的autowire属性,那么可以通过在根元素<beans>上增加一个default-autowire属性:

<?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-3.0.xsd"
    default-autowire="byType">
</beans>

注意

  1. default-autowire应用于指定Spring配置文件中的所有Bean;并不是应用于Spring应用上下文中的所有Bean。我们可以在一个应用上下文中定义多个配置文件,每个配置文件都可以有自己的默认自动装配策略。
  2. 同样,不能因为我们配置了一个默认的自动装配策略,就意味着所有的Bean都只能使用这个默认的自动装配策略。我们还可以使用<bean>元素的autowire属性来覆盖所配置的默认自动装配策略。
  3. 可以使用自动装配策略和显式装配策略,显式装配会覆盖自动装配。

 

第3章 最小化Spring XML配置

标签:

原文地址:http://www.cnblogs.com/bmbi/p/5654812.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!