[align=center][size=large][b]注入依赖[/b][/size][/align][align=center][size=large][b]Setter注入[/b][/size][/align]
下面的例子将展示使用setter注入依赖。注意,这个类并没有什么特别之处,它就是普通的Java类。
处理bean依赖关系通常按以下步骤进行:
根据定义bean的配置(文件)创建并初始化BeanFactory实例(大部份的Spring用户使用支持XML格式配置文件的BeanFactory或ApplicationContext实现)。
每个bean的依赖将以属性、构造器参数、或静态工厂方法参数的形式出现。当这些bean被实际创建时,这些依赖也将会提供给该bean。
每个属性或构造器参数既可以是一个实际的值,也可以是对该容器中另一个bean的引用。
每个指定的属性或构造器参数值必须能够被转换成属性或构造参数所需的类型。默认情况下,Spring会能够以String类型提供值转换成各种内置类型,比如int、long、String、boolean等。
需要强调的一点就是,Spring会在容器被创建时验证容器中每个bean的配置,包括验证那些bean所引用的属性是否指向一个有效的bean(即被引用的bean也在容器中被定义)。
[color=red]在bean被实际创建之前,bean的属性并不会被设置。[/color]也就是说,在构造器中千万不要引用("[color=green]将[/color]")被注入的Bean,本人有深刻教训
[size=large][align=center][b]构造器注入[/b][/align][/size]
基于构造器的DI通过调用带参数的构造器来实现,每个参数代表着一个协作者。此外,还可通过给静态工厂方法传参数来构造bean。给构造器传参与给静态工厂方法传参是类似的。
下面的例子将展示使用setter注入依赖。注意,这个类并没有什么特别之处,它就是普通的Java类。
<bean id="simpleMovieLister" class="examples.SimpleMovieLister">
<!-- setter 注入所依赖的MovieFinder实例-->
<property name="movieFinder">
<ref bean="movieFinder"/>
</property>
</bean>
<!-- MovieFinder的实例在这被Spring Ioc托管-->
<bean id="movieFinder" class="examples.MovieFinder"/>
public class SimpleMovieLister {
// SimpleMovieLister类 依赖 MovieFinder类
private MovieFinder movieFinder;
// 给定 setter 方法用来让Spring 容器注入 MovieFinder类的实例
public void setMoveFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
// 略过业务逻辑...
}
正如你所看到的,bean类中的setter方法与xml文件中配置的属性是一一对应的。处理bean依赖关系通常按以下步骤进行:
根据定义bean的配置(文件)创建并初始化BeanFactory实例(大部份的Spring用户使用支持XML格式配置文件的BeanFactory或ApplicationContext实现)。
每个bean的依赖将以属性、构造器参数、或静态工厂方法参数的形式出现。当这些bean被实际创建时,这些依赖也将会提供给该bean。
每个属性或构造器参数既可以是一个实际的值,也可以是对该容器中另一个bean的引用。
每个指定的属性或构造器参数值必须能够被转换成属性或构造参数所需的类型。默认情况下,Spring会能够以String类型提供值转换成各种内置类型,比如int、long、String、boolean等。
需要强调的一点就是,Spring会在容器被创建时验证容器中每个bean的配置,包括验证那些bean所引用的属性是否指向一个有效的bean(即被引用的bean也在容器中被定义)。
[color=red]在bean被实际创建之前,bean的属性并不会被设置。[/color]也就是说,在构造器中千万不要引用("[color=green]将[/color]")被注入的Bean,本人有深刻教训
[size=large][align=center][b]构造器注入[/b][/align][/size]
基于构造器的DI通过调用带参数的构造器来实现,每个参数代表着一个协作者。此外,还可通过给静态工厂方法传参数来构造bean。给构造器传参与给静态工厂方法传参是类似的。
public class SimpleMovieLister {
// SimpleMovieLister类 依赖 MovieFinder类
private MovieFinder movieFinder;
// 通过构造器传参 Spring 容器将把MovieFinder类的实例作为参数传给构造器
public SimpleMovieLister(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
// 略过业务逻辑...
}
<bean id="simpleMovieLister" class="examples.SimpleMovieLister">
<!-- 把MovieFinder实例作为参数传给构造器-->
<constructor-arg name="movieFinder">
<ref bean="movieFinder"/>
</constructor-arg>
</bean>
<!-- MovieFinder的实例在这被Spring Ioc托管-->
<bean id="movieFinder" class="examples.MovieFinder"/>
传给静态工厂[b][size=medium]方法的参数由constructor-arg元素提供,这与使用构造器注入时完全一样[/size][/b]<bean id="exampleBean" class="examples.ExampleBean"
factory-method="createInstance">
<constructor-arg ref="anotherExampleBean"/>
<constructor-arg ref="yetAnotherBean"/>
<constructor-arg value="1"/>
</bean>
<bean id="anotherExampleBean" class="examples.AnotherBean"/>
<bean id="yetAnotherBean" class="examples.YetAnotherBean"/>
public class ExampleBean {
// a private constructor
private ExampleBean(...) {
...
}
// a static factory method; the arguments to this method can be
// considered the dependencies of the bean that is returned,
// regardless of how those arguments are actually used.
public static ExampleBean createInstance (
AnotherBean anotherBean, YetAnotherBean yetAnotherBean, int i) {
ExampleBean eb = new ExampleBean (...);
// some other operations
...
return eb;
}
}