【Spring4.0】Bean之间的关系

##一、Bean之间的关系

Bean之间的关系有两种:

  • 继承
  • 依赖



    ##二、继承

继承其实和面向对象编程的继承差不多,子类继承父类的属性,还能够复写和增加其他属性。
###继承示例代码:
####1.关于地址的JavaBean:Address.java
假设该类位于包top.cheungchingyin.beans.autowire

package top.cheungchingyin.beans.autowire;

public class Address {

	private String city;
	private String street;

	public String getCity() {
		return city;
	}

	public void setCity(String city) {
		this.city = city;
	}

	public String getStreet() {
		return street;
	}

	public void setStreet(String street) {
		this.street = street;
	}

	@Override
	public String toString() {
		return "Address [city=" + city + ", street=" + street + "]";
	}

}

####2.一个名叫beans-relation.xml的JavaBean配置文件(使用了p命名空间)
里面有一个bean配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="address" class="top.cheungchingyin.beans.autowire.Address"
		p:city="BeiJing" p:street="HuiLongGuan"></bean>
</beans>

现在我想新建一个名叫address2的bean配置,并且继承address的bean配置,我们可以添加以下代码:

<bean id="address2" class="top.cheungchingyin.beans.autowire.Address"
		parent="address" p:street="WuDaoKou"></bean>

bean的配置继承:使用bean的parent属性指定继承那个bean的配置即可。
####3.测试主类Main.java

public class main {

	public static void main(String[] args) {
		ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-relation.xml");
		Address address = (Address) ctx.getBean("address");
		System.out.println(address);
		System.out.println("--------------------------------------");
		Address address2 = (Address) ctx.getBean("address2");
		System.out.println(address2);
		System.out.println("--------------------------------------");
		}
}

测试结果:

这里写图片描述

###抽象属性
**Q:**有的时候不希望某个bean可以实例化,我们把它配置成模版,其他bean从它继承,比如上面的address,那么怎么设置呢?
**A:**只要在想配置的模板bean里面加入abstract="true",那么这个bean就不可以被实例化,但是其他bean可以继承,并且在模板bean中不需要写class属性。



##三、依赖

###1.什么是依赖?
依赖其实就是如有一个人和车的bean,在现实中,如果一个人拥有一辆车,那肯定需要先拥有一辆车。所以就会有一个前置条件:必须先有车,这个条件才能够成立。

###2.示例代码
配置文件

<bean id="car" class="top.cheungchingyin.beans.autowire.Car"
		p:brand="AuDi" p:price="300000"></bean>
	<!-- 要求在配置Person的时候,必须有一个关联的car,换句话说person这个bean依赖于car这个bean -->
	<bean id="person" class="top.cheungchingyin.beans.autowire.Person"
		p:name="Tom" p:address-ref="address" depends-on="car"></bean>

只需要使用depends-on属性指定需要依赖的bean即可

###3.一些疑问
p:car-ref="car"depends-on="car"的作用是否一样?
其实这两个属性有很大不同

属性 不同之处
p:car-ref="car" 说明我不仅想在实例化一个bean的时候先初始化 car 这个bean,而且此bean还是我的一部分,car这个bean能够装配到我的属性中。
depends-on="car 仅说明我在实例化一个bean的时候只是想先初始化 car 这个bean,但是我并不是想要这个car bean成为我的一部分,所以不能够装配到自身属性。

测试代码:
Main.java添加以下两句代码:

Person person = (Person) ctx.getBean("person");
		System.out.println(person);

使用p:car-ref="car"属性时:

<bean id="car" class="top.cheungchingyin.beans.autowire.Car"
		p:brand="AuDi" p:price="300000"></bean>
	<!-- 要求在配置Person的时候,必须有一个关联的car,换句话说person这个bean依赖于car这个bean -->
	<bean id="person" class="top.cheungchingyin.beans.autowire.Person"
		p:name="Tom" p:address-ref="address" p:car-ref="car"></bean>

结果:
car不为null
这里写图片描述

使用depends-on="car属性时:

<bean id="car" class="top.cheungchingyin.beans.autowire.Car"
		p:brand="AuDi" p:price="300000"></bean>
	<!-- 要求在配置Person的时候,必须有一个关联的car,换句话说person这个bean依赖于car这个bean -->
	<bean id="person" class="top.cheungchingyin.beans.autowire.Person"
		p:name="Tom" p:address-ref="address" depends-on="car"></bean>

结果:
car为null
这里写图片描述



##四、总结

###1.继承

  • Spring 允许继承 bean 的配置, 被继承的 bean 称为父 bean. 继承这个父 Bean 的 Bean 称为子 Bean。
  • 子 Bean 从父 Bean 中继承配置, 包括 Bean 的属性配置。
  • 子 Bean 也可以覆盖从父 Bean 继承过来的配置。
  • 父 Bean 可以作为配置模板, 也可以作为 Bean 实例. 若只想把父 Bean 作为模板, 可以设置 <bean> 的abstract 属性为 true, 这样 Spring 将不会实例化这个 Bean。
  • 并不是 <bean>元素里的所有属性都会被继承. 比如: autowire, abstract 等。
  • 也可以忽略父 Bean 的 class 属性, 让子 Bean 指定自己的类, 而共享相同的属性配置. 但此时abstract必须设为true

###2.依赖

  • Spring 允许用户通过 depends-on 属性设定 Bean 前置依赖的Bean,前置依赖的 Bean 会在本 Bean 实例化之前创建好。
  • 如果前置依赖于多个 Bean,则可以通过逗号,空格或的方式配置 Bean 的名称。

猜你喜欢

转载自blog.csdn.net/qq_33596978/article/details/81160320