Spring 學習(六)——Bean 之間的關係
阿新 • • 發佈:2018-12-18
–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 例項化之前建立好
•如果前置依賴於多個 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);
}
}