繼承
這里說的繼承和java的繼承是不一樣的,不是父類子類。但思想很相似,是父bean和子bean
1、父bean是一個實例時。它本身是一個完整的bean
2、父bean是模板,抽象bean,不能被實例化,只是來被繼承。
當遇到一個類要實例化出很多相似的bean對象時,如下,看起來是不是很不簡潔
1 <bean id="address1" class="com.guigu.spring.autowire.Address" 2 p:city="BeiJing" p:street="yihuan"></bean> 3 <bean id="address2" class="com.guigu.spring.autowire.Address" 4 p:city="BeiJing" p:street="erhuan"></bean>
方法① 兩個bean除了p:street不一樣,其他都一樣。可以把一個作為父bean,其它的繼承這個bean
1 <bean id="address1" class="com.guigu.spring.autowire.Address" 2 p:city="BeiJing" p:street="yihuan"></bean> 3 <bean id="address2" p:street="erhuan" parent="address1"></bean> 4 // address2等價於: 5 // <bean id="address2"" class="com.guigu.spring.autowire.Address" 6 // p:city="BeiJing" p:street="erhuan"></bean>
這里,第二個就繼承了第一個bean,用parent屬性,只寫自己獨有的屬性或要覆蓋的屬性即可。
方法②把相同屬性提取出來,做一個抽象bean,專門用來繼承
1 <bean id="address1" class="com.guigu.spring.autowire.Address" 2 p:city="BeiJing" p:street="yihuan" abstract="true"></bean> 3 <bean id="address2" p:street="erhuan" parent="address1"></bean>
這樣,address2也繼承了address1。address1設置了abstract="true",就不能實例化,否則拋異常。
也可以寫成這樣:
1 <bean id="address1" p:city="BeiJing" p:street="yihuan" abstract="true"></bean> 2 <bean id="address2" class="com.guigu.spring.autowire.Address" p:street="erhuan" parent="address1"></bean>
和上面的不同就是把class屬性拿出去了。當很多不是同一個類的bean要繼承父bean時,就要這樣,在子bean寫自己所在的class。
這樣寫還有一點是,這個父bean一定不能實例化,因為它沒有class屬性,實例化會跑異常。那就一定要寫abstract屬性,讓spring不實例化它。
依賴---depends-on
用Person類的例子
1 public class Person { 2 private String name; 3 private Car car; 4 5 public String getName() { 6 return name; 7 } 8 public void setName(String name) { 9 this.name = name; 10 } 11 public Car getCar() { 12 return car; 13 } 14 public void setCar(Car car) { 15 this.car = car; 16 } 17 @Override 18 public String toString() { 19 return "Person [name=" + name + ", car=" + car + "]"; 20 } 21 }
有一個屬性Car沒有配置,那實例化后,它就是null。
1 <bean id="person" class="com.guigu.spring.autowire.Person" 2 p:name="Evan"></bean>
有時,我們需要讓某個屬性必須存在,就像必填項一樣。 用depends-on 依賴
1 <bean id="person" class="com.guigu.spring.autowire.Person" 2 p:name="Evan" depends-on="car"></bean>
這樣表示,實例化person一定要依賴car,沒有配置car會拋異常
1 <bean id="car" class="com.guigu.spring.autowire.Car" p:brand="Audi" p:price="200000"></bean> 2 <bean id="person" class="com.guigu.spring.autowire.Person" 3 p:name="Evan" depends-on="car"></bean>
這樣,依賴的car存在,就可以正常實例化了