自動裝配
自動裝配的意思是我們無需指定由哪一個bean來裝配,spring會按照我們指定的規則去尋找相應的bean,自動裝配有4種類型:
byName:如果某個bean的ID與property的名字一樣,則這個bean就會自動裝配;
byType:如果某個bean的類型與property的類型一致,則這個bean會被自動裝配;
constructor:假設通過構造器注入來裝配bean,我們讓spring在應用上下文中自動選擇與入參類型相同的Bean注入到構造器參數中
autodetect:Spring首先嚐試constructor自動裝配,如果沒有發現與構造器相匹配的Bean,Spring會嘗試使用byType自動裝配。
注意,前兩者是針對要裝配的bean的所有property而言的,當然我們也可以爲某個property提供獨特的裝配方案,而constructor則不行,我們不能爲某個構造器入參提供獨特的裝配方案,假設我們有一個類Teacher引用了Student類:
2、懶加載
延遲初始化也叫做惰性初始化,指不提前初始化Bean,而是只有在真正使用時才創建及初始化Bean。
配置方式很簡單隻需在<bean>標籤上指定 “lazy-init” 屬性值爲“true”即可延遲初始化Bean。
Spring容器會在創建容器時提前初始化“singleton”作用域的Bean,“singleton”就是單例的意思即整個容器每個Bean只有一個實例,後邊會詳細介紹。Spring容器預先初始化Bean通常能幫助我們提前發現配置錯誤,所以如果沒有什麼情況建議開啓,除非有某個Bean可能需要加載很大資源,而且很可能在整個應用程序生命週期中很可能使用不到,可以設置爲延遲初始化。
3、依賴注入
在此配置中,resourceBean初始化在dependentBean之前被初始化,resourceBean銷燬會在dependentBean銷燬之後執行。
銷燬之前 關閉鉤子
但,如果你正在一個非web應用的環境下使用Spring的IoC容器,如dubbo服務,你想讓容器優雅的關閉,並調用singleton的bean相應destory回調方法,你需要在JVM裏註冊一個“關閉鉤子”(shutdown hook)。這一點非常容易做到,並且將會確保你的Spring IoC容器被恰當關閉,以及所有由單例持有的資源都會被釋放。
4、
<!-- 通過構造器參數索引方式依賴注入 -->
<bean id="byIndex" class="cn.javass.spring.chapter3.HelloImpl3">
<constructor-arg index="0" value="Hello World!"/>
<constructor-arg index="1" value="1"/>
</bean>
@java.beans.ConstructorProperties({"message", "index1"})
public HelloImpl3(String message, int index1) {
this.message = message;
this.index1 = index1;
}
@Override
public void sayHello() {
System.out.println(index1 + ":" + message);
}
靜態工廠類
<!-- 通過靜態工廠參數索引方式依賴注入 -->
<bean id="byIndex" class="cn.javass.spring.chapter3.DependencyInjectByStaticFactory" factory-method="newInstance">
<constructor-arg index="0" value="Hello World!"/>
<constructor-arg index="1" value="1"/>
</bean>
實例工廠類
<bean id="instanceFactory" class="cn.javass.spring.chapter3.DependencyInjectByInstanceFactory"/>
<!-- 通過實例工廠參數索引方式依賴注入 -->
<bean id="byIndex" factory-bean="instanceFactory" factory-method="newInstance">
<constructor-arg index="0" value="Hello World!"/>
<constructor-arg index="1" value="1"/>
</bean>