1.Bean Definition繼承
(1) Spring中的bean存在層級關系,我們可以定義子bean來繼承或覆寫父bean中的某些屬性,從而節省編碼,在此處Spring運用到了模板設計模式,如下所示
//自定義了2個bean,ExampleA和ExampleB,注意,它們之間不存在繼承關系,我們這里的繼承注意是Bean Definition繼承,也就是一個bean的一些屬性值可能跟另一個bean的某些屬性值相同,然后通過Bean Definition繼承來減少編碼,復用一下屬性值,僅此而已
public class ExampleA {
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "ExampleA{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class ExampleB {
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "ExampleB{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
<!-- xml組態檔 -->
<beans ...>
<bean id="exampleA" >
<property name="name" value="https://www.cnblogs.com/shame11/archive/2023/01/07/exampleA"></property>
<property name="age" value="https://www.cnblogs.com/shame11/archive/2023/01/07/20"></property>
</bean>
<!-- 在子bean標簽中定義parent屬性指向父bean,來繼承父bean中的屬性值 -->
<bean id="exampleB" parent="exampleA">
<property name="name" value="https://www.cnblogs.com/shame11/archive/2023/01/07/exampleB"></property>
</bean>
</beans>
//列印這兩個bean,可以看到子bean exampleB中的age屬性值繼承了父bean exampleA的age屬性值,兩個值都是一樣的,為20,此外exampleB還覆寫了父bean中的name屬性值,為exampleB,而非exampleA
ExampleA{name='exampleA', age=20}
ExampleB{name='exampleB', age=20}
子bean可以繼承并添加父bean中的scope, constructor argument values, property values以及method overrides from the parent,同時子bean也可以覆寫掉父bean中的scope, initialization method, destroy method或者是static factory method settings為自己指定的值,其余的一些屬性如:depends on, autowire mode, dependency check, singleton以及lazy init全部都取決于子bean而與父bean無關
(2) 模板父bean
<beans ...>
<!-- 如果一個父bean沒有指定class屬性,同時設定它的abstract為true,那么它就是一個模板bean,來供其他的bean進行繼承,如同java里的抽象類 -->
<!-- 此時這個bean只能作為一個模板使用,其他的使用方式如使用getBean方法來獲取這個bean,都將回傳錯誤,因為它沒有class屬性,不完整,同時容器在初始化時也會忽略這個bean -->
<bean id="template" abstract="true">
<property name="name" value="https://www.cnblogs.com/shame11/archive/2023/01/07/exampleA"></property>
<property name="age" value="https://www.cnblogs.com/shame11/archive/2023/01/07/20"></property>
</bean>
<!-- exampleB會繼承父bean template中name和age的屬性值 -->
<bean id="exampleB" parent="template"></bean>
</beans>
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/541421.html
標籤:其他
