XML配置里的Bean自动装配
Spring IOC容器可以自动装配Bean。需要做的仅仅是在<bean>的autowrite属性里指定自动装配的模式。
byType:根据类型装配。当IOC容器中有多个与目标Bean类一致的Bean,这种情况下,Spring将无法判断哪个Bean适合该属性。所以不能执行自动装配。
byName:根据目标类的属性名装配。必须将目标Bean的属性名和名称设置的完全相同。
constructor:通过构造器自动装配。当Bean中存在多个构造器时,此种自动装配方式很复杂,不推荐使用。
Spring bean之间的关系
继承
这里的继承指的是配置上的继承。bean配置的继承使用bean的parent属性指定继承bean的那个配置。
Spring允许继承bean的配置。被继承的bean称为父bean。继承自这个父bean的bean被称为子bean。子bean从父bean中继承了配置。包括bean的属性配置。子bean也可以覆盖从父bean继承过来的配置。
父bean可以作为配置的模板也可以作为bean的实例。如果只想把父bean作为模板可以将<bean>的abstract属性设为true。这样Spring将不会实例化这个bean。
并不是bean中的所有属性都会被继承。比如autowrite,abstract等。
可以忽略父bean的class属性。让子bean指定自己的类。而共享相同的属性配置。但此时abstract必须设置为true。
bean继承的实例:
<bean id="address" class="com.spring.beans.Address"
p:city="Beijing" p:street="Wudaokou">
</bean>
<bean id="address2" parent="address" p:street="Changan">
</bean>
依赖
此时我们在Person类中加入地址的属性
public class Person {
private String name;
private int age;
private Address address;
...
public void setAddress(Address address) {
this.address = address;
}
...
配置文件
<bean id="address" class="com.spring.beans.Address"
p:city="Beijing" p:street="Wudaokou">
</bean>
<bean id="person" class="com.spring.beans.Person" p:name="Tom" p:address-ref="address">
</bean>
此时有了一个新的需求,要求配置Person时必须有一个关联的Car。换句话说Person这个bean依赖于Car这个bean。
<bean id="car" class="com.spring.beans.Car" p:price="300000">
</bean>
<bean id="address2" parent="address" p:street="Changan">
</bean>
<bean id="person" class="com.spring.beans.Person" p:name="Tom" p:address-ref="address" depends-on="car">
</bean>
Spring允许用户通过depends-on属性设置bean的前置依赖的bean。前置依赖的bean会在本bean实例化之前创建好。
如果前置依赖于多个bean,则可以通过逗号,空格的方式配置bean的名称。
Spring bean的作用域
singleton:容器初始化时创建bean的实例。在整个容器的生命周期只创建这样的一个bean。
prototype:容器初始化时不创建bean的实例,而在每次请求时都创建一个新的bean实例并返回。
Spring Bean当中的作用域默认为singleton。
Spring使用外部属性文件
在配置文件里配置bean时,有时需要在bean的配置里混入系统部署等细节信息(例如文件路径,数据源配置信息等)。而这些部署细节实际上要和bean配置相分离。
Spring提供了一个PropertyPlaceholderConfigurer的BeanFactory后置处理器。这个处理器允许用户将bean配置的部分内容外移到属性文件中。可以在bean配置文件里使用形式为${var}的变量。PropertyPlaceholderConfigurer从属性文件里加载属性,并使用这些属性来替换变量。
Spring还允许在属性文件中使用${propName},以实现属性间的相互引用。
如何引入外部资源文件
<beans>中添加contextSchema定义。
在配置文件中添加如下配置
<context:property-placeholder location="classpath:db.properties"/>
网友评论