设置属性值的三种基本方式:

  • 在Bean定义文件中使用<value>指定字符串以及基本类型值。
  • 使用<ref>直接指定参考至其他Bean实例。
  • 使用<bean>标签指定value属性。

 

自动装配方式

属性值

说明

byName

容器将查找与属性名相同的Bean,然后自动注入到该属性中,如果没有找到,则该属性将不会被注入。当然,使用自动装配时,也可以显式地注入Bean 的部分属性。

byType

注入过程与byName 类似, 不同的是,容器查找的是与属性的设值方法参数类型兼容的Bean

constructor

容器将试图找出所有与构造方法的参数类型兼容的Bean ,然后确定某个合适的构造方法。如果没有符合调用任何构造方法所需的Bean,则容器将抛出UnsatisfiedDependencyException

autodetect

让容器全面自动判断。

no (默认值)

不采用自动装配。

 

 

by Type

Person与Address类:

public class Person {

    private String name;

    private Address addr;

     // 此处省略各Fieldgettersetter方法

}

public class Address {

    private String city;

    private String province;

    // 此处省略各Fieldgettersetter方法

}

Bean配置:

<bean id="addr" class="cn.itcast.spring.auto_wire.Address">

<property name="province" value="湖南"/>

<property name="city" value="长沙"/>

</bean>

<bean id="person" class="cn.itcast.spring.auto_wire.Person" autowire="byType">

<property name="name" value="张三" />

</bean>

可见,在上面Bean定义文件中并没有为id为person的Bean实例指定其addr属性,由于指定了autowire属性为byType,所以实例化id为person的Person实例时,Spring会自动注入其相应类型的实例。这种方法会导致Bean定义文件中的Address的类型定义只能出现一次

 

byName

Bean配置

<bean id="addr" class="cn.itcast.spring.auto_wire.Address">

<property name="province" value="湖南"/>

<property name="city" value="长沙"/>

</bean>

<bean id="person" class="cn.itcast.spring.auto_wire.Person" autowire="byName">

<property name="name" value="张三" />

</bean>

以指定byName 来绑定,则Spring会判断Bean 定义时id属性上指定的别名与Setter 名称是否一致来进行自动绑定。如果使用"byName"无法完成自动绑定,则对应的Setter 仅维持未绑定状态。

 

Constructor

Person类:

public class Person {

    private String name;

    private Address addr;

    public Person(Address addr) {

this.addr = addr;

    }

    public Address getAddr() {

return addr;

    }

    public String getName() {

return name;

    }

    public void setName(String name) {

this.name = name;

    }

}

Bean配置

<bean id="addr" class="cn.itcast.spring.auto_wire.Address">

<property name="province" value="湖南" />

<property name="city" value="长沙" />

</bean>

<bean id="person" class="cn.itcast.spring.auto_wire.Person"

autowire="constructor">

<property name="name" value="张三" />

</bean>

由于“autowire”设置为"constructor",在建立依赖关系时,Spring容器会试图对比容器中的Bean实例类型,以及相关的构造方法上的参数类型,若在类型上符合,则选用该构造方法来建立Bean实例。

 

自动检测(autodetect)

可以看到,运用一些自动绑定的方式,可以缩短定义文件的编写内容,如果还想再偷懒的话,可以设置为"autodetect',一切交给Spring来判断。判断顺序:constructor——》 byType ——》 byName

<bean id="addr" class="cn.itcast.spring.auto_wire.Address">

<property name="province" value="湖南" />

<property name="city" value="长沙" />

</bean>

<bean id="person" class="cn.itcast.spring.auto_wire.Person"

autowire="autodetect">

<property name="name" value="张三" />

</bean>

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐