–bean 之间的关系:继承;依赖
继承 Bean 配置
•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
依赖 Bean 配置
•Spring 允许用户通过 depends-on 属性设定 Bean 前置依赖的Bean,前置依赖的 Bean 会在本 Bean 实例化之前创建好
扫描二维码关注公众号,回复:
4557217 查看本文章
•如果前置依赖于多个 Bean,则可以通过逗号,空格或的方式配置 Bean 的名称
代码示例如下:
1、代码结构:
2、
Address.java
package com.hzyc.spring.bean.autowire;
/**
* @author xuehj2016
* @Title: Address
* @ProjectName spring01
* @Description: TODO
* @date 2018/12/1710:30
*/
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 + '\'' +
'}';
}
}
Car.java
package com.hzyc.spring.bean.autowire;
/**
* @author xuehj2016
* @Title: Car
* @ProjectName spring01
* @Description: TODO
* @date 2018/12/1710:30
*/
public class Car {
private String brand;
private double price;
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "Car{" +
"brand='" + brand + '\'' +
", price=" + price +
'}';
}
}
Person.java
package com.hzyc.spring.bean.autowire;
/**
* @author xuehj2016
* @Title: Person
* @ProjectName spring01
* @Description: TODO
* @date 2018/12/1710:30
*/
public class Person {
private String name;
private Address address;
private Car car;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", address=" + address +
", car=" + car +
'}';
}
}
3、bean-relation.xml
<?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 : bean 的 abstract 属性为 true ,这样的 bean 不能被 IOC 容器实例化,只能被继承
若某一个 bean 的 class 属性没有指定,则该 bean 必须是一个抽象 bean
-->
<bean id="address" p:city="北京^" p:street="五道口" abstract="true"/>
<!--bean 配置的继承 : 使用 bean 的 parent 属性指定继承哪个 bean 的配置-->
<bean id="address2" class="com.hzyc.spring.bean.autowire.Address"
parent="address"/>
<bean id="address3" class="com.hzyc.spring.bean.autowire.Address"
parent="address2" p:street="中关村"/>
<bean id="car" class="com.hzyc.spring.bean.autowire.Car"
p:brand="奥迪" p:price="300000"/>
<!--要求在配置 Person 时,必须有一个关联的 car ,换句话说,这个 bean 依赖于 car 这个 bean-->
<bean id="person" class="com.hzyc.spring.bean.autowire.Person"
p:name="薛恒杰" p:address-ref="address2" depends-on="car"/>
</beans>
4、Main.java
package com.hzyc.spring.bean.relation;
import com.hzyc.spring.bean.autowire.Address;
import com.hzyc.spring.bean.autowire.Person;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @author xuehj2016
* @Title: Main
* @ProjectName spring01
* @Description: TODO
* @date 2018/12/1618:01
*/
public class Main {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean-relation.xml");
Address address = (Address) applicationContext.getBean("address2");
System.out.println(address);
address = (Address) applicationContext.getBean("address3");
System.out.println(address);
Person person = (Person) applicationContext.getBean("person");
System.out.println(person);
}
}