《Spring Recipes》第一章笔记:Auto-Wiring Beans with XM...

Auto-Wiring Beans with XML Configuration

问题:

如果refer太多了,配置太麻烦。如果容器可以自动配置,可以节省大量时间和工作。

XML解决方案:

使用<bean>标签的autowire属性。

常用的autowire类型:byType/byName/Constructor。

byType:对于每个bean property,,使用配置文件中类型相同的bean进行注入。

byName:对于每个bean property,,使用配置文件中name和property name相同的bean进行注入。

constructor:和byType类似。如果bean只有一个构造函数,容器会将合适的类型注入到构造函数中。如果bean有多个构造函数,容器首先会找出参数都能被注入的构造函数,然后再选择参数最多的构造函数实例化bean。

autodetect:容器自动注入。官方不推荐使用。

Auto-Wiring by Type

bean:
public class SequenceGenerator {
	private DatePrefixGenerator prefix;
	private String suffix;
	private int initial;
	private int counter;
... ...


配置文件:
<beans ...>
  <bean id="sequenceGenerator" class="com.apress.springrecipes.sequence.SequenceGenerator"
   autowire="byType">
     <property name="initial" value="100000" />
     <property name="suffix" value="A" />
   </bean>
   <bean id="datePrefixGenerator"
      class="com.apress.springrecipes.sequence.DatePrefixGenerator">
      <property name="pattern" value="yyyyMMdd" />
    </bean>
</beans>

容器会自动将com.apress.springrecipes.sequence.DatePrefixGenerator类型的bean注入到SequenceGenerator的prefix属性中。

注意:如果配置文件中,类型相同bean有多个,类型为byType的autowire会抛出UnsatisfiedDependencyException异常。

Auto-Wiring by Name

配置文件:

<beans ...>
    <bean id="sequenceGenerator" class="com.apress.springrecipes.sequence.SequenceGenerator"
    autowire="byName">
        <property name="initial" value="100000" />
        <property name="suffix" value="A" />
    </bean>
    <bean id="prefixGenerator" class="com.apress.springrecipes.sequence.DatePrefixGenerator">
       <property name="pattern" value="yyyyMMdd" />
    </bean>
</beans>

注意:如果注入的bean的类型和属性不一致,容器会抛出ConversionNotSupportedException异常。

Auto-Wiring by Constructor

bean:

public class SequenceGenerator {
    public SequenceGenerator() {}
    public SequenceGenerator(PrefixGenerator prefixGenerator) {
        this.prefixGenerator = prefixGenerator;
    }
...
}

配置文件:

<beans ...>
	<bean id="sequenceGenerator" class="com.apress.springrecipes.sequence.SequenceGenerator"
	autowire="constructor">
		<property name="initial" value="100000" />
		<property name="suffix" value="A" />
	</bean>
	<bean id="datePrefixGenerator" class="com.apress.springrecipes.sequence.DatePrefixGenerator">
		<property name="pattern" value="yyyyMMdd" />
	</bean>
</beans>

注意:如果多个满足注入条件的构造函数的参数个数一样多,容器会使用最后那一个。


你可能感兴趣的:(spring)