spring容器:spring框架中的一個核心模塊,用於管理對象.
通過反射創建對象.
創建對象的方式:
方式一 使用無參構造器創建對象(常用)
step1:給類添加無參構造器(或缺省構造器)
step2:配置文件中配置bean. id:bean的名稱,唯一 class:類的全限定名 (反射機制,需要找到類的全限定名)
step3:調用容器的getBean("id", class名.class)方法來獲得對象,後面的 類名.class 用於強制轉換.
方式二 使用靜態工廠方法創建對象
通過調用類的靜態方法來創建對象.
<bean id="cal" class="java.util.Calendar" factory-method="getInstance"></bean>
Calender cal = ac.getBean("cal", Calendar.class);
factory-merhod屬性:指定一個靜態方法
spring容器會調用這個靜態方法來創建對象
方式三 使用實例工廠方法創建對象
通過調用對象的實例方法來創建對象.
<bean id="time" factory-bean="cal" factory-method="getTime"></bean>
Date time = ac.getBean("time", Date.class);
factory-bean屬性:指定一個bean的id.
factory-method屬性:指定一個方法.
spring容器會調用這個bean對應的方法來創建對象.
作用域
默認情況下一個bean只會創建一個實例.
scope屬性:用來配置作用域,缺省值是singleton(單例)
如果值爲prototype(多例),一個bean會創建多個實例
生命週期
初始化的作用:分配資源
<bean id="" class="" init-method="init"/>
init-method屬性:指定初始化方法.
spring容器在創建對象之後,會立即調用初始化方法.
銷燬
<bean id="" class="" destroy-method="destroy"/>
destroy-method屬性:指定銷燬方法.
spring在關閉之前會先銷燬對象,在銷燬對象之前,會先調用對象的銷燬方法.
spring容器的延遲加載(瞭解)
spring容器啓動之後,會將所有作用域爲單例的bean創建好.
<bean id="" class="" init-method="" destroy-method="" lazy-init=""/>
使用延遲加載:lazy-init="true" 默認爲false
IOC 控制反轉
對象之間的依賴關係由容器來建立.
DI依賴注入
set方式注入
容器通過調用對象提供的set方法或者構造器來建立依賴關係
IOC是目標,DI是手段.
<bean id="b1" class="ioc.b"/> <bean id="a1" class="ioc.a"> <properties name="b" ref="b1"/> </bean>
properties元素:表示使用set方法來注入依賴關係.其中,name屬性指定屬性名,ref屬性指定屬性值(被注入的bean的id)
構造器方式注入
step1:配置相應的構造器
step2:constructor-arg參數注入
<bean id="b1" class="ioc.B"/> <bean id="a1" class="ioc.A"> <constructor-arg index="0" ref="b1"> 0代表將b1傳給第一個參數 </bean>
constructor-arg用來配置構造器方式注入.
index屬性指定參數的下標(從0開始).
自動裝配(瞭解)
自動裝配,指的是spring容器依據某種規則,自動建立對象之間的某種關係.
注意:
1.默認情況下,容器不會自動裝配.
2.可以通過指定autowire屬性來自動裝配(容器仍然需要通過調用set方式或者構造器來完成依賴關係的建立)
<bean id="" class="" autowire="byName"/>
autowire屬性:表示讓容器自動裝配,該屬性有如下三個值.
byName:容器根據屬性名查找對應的bean,然後調用對應的set方法來完成注入.
注意:
1.如果找不到對應的bean,注入null.
2.不可能找到多個符合條件的bean(id具有唯一性)
byType:
容器依據屬性類型查找對應的bean,然後調用對應的set方法來完成注入.
注意:
1.如果找不到對應的bean,注入null.
2.有可能找到多個符合條件的bean,此時會報錯.
constructor:與byType類似,不同的是調用的是對應的構造器來完成注入.
注入基本類型的值-value
<bean id="" class=""> <property name="name" value="xxx"/> <property name="age" value="20"> </bean>
注入集合類型的值
List Set Map Properties(特殊的散列,鍵值均爲String)
1.List
<bean id="" class=""> <property name="list"> <list> <value>XX</value> <value>yy</value> </list> </property> </bean>
2.Set
<property name="set"> <set> <value>XX</value> <value>yy</value> </set> </property>
3.Map
<property name="map"> <map> <entry key="" value=""/> <entry key="" value=""/> </map> </property>
4.Properties
<property name="pro"> <props> <prop key="username">striner</prop> <prop key="password">XXX</prop> </props> </property>
用引入的方式注入集合類型的值
<util:list id="aBean"> <value>XX</value> <value>YY</value> </util:list> <bean id="" class=""> <property name="a" ref="aBean"/> </bean>
這裏的util就類似於命名空間.
作用:將集合類型的值配成一個bean,用引入的方式注入集合類型的值,可以重用.
讀取.properties爲後綴的文件內容
<util:properties id="const" location="classpath:XXX.properties"/> <bean id="c" class=""> <property name="name" value="#{c.name}"/> <!-- 內部調用c的getName()--> <property name="city" value="#{c.city[0]}"/> <!-- 0是list的下標--> <property name="score" value="#{c.score['英語']}"/> <!-- '英語'是Map的key--> <property name="pageName" value="#{const.pageName}"/> <!-- properties文件中的key--> </bean>
classpath:按照類路徑來搜索.resource/ 或者WEB-INF/
spring容器會依據路徑來找到對應的文件,然後讀取該文件的內容讀取到properties對象中.
使用註解簡化配置
組件掃描 @Component("bean的id")
缺省爲類名首字母小寫的名
<comtext:component-scan base-package="包名">
base-package屬性:指定要掃描的包名,spring會掃描該包及其子包下面所有的類,如果該類前面有特定的註解(如@Component),則spring容器會將其納入容器進行管理(相當於配置了一個bean元素)
指定作用域 @Scope("prototype") 缺省值爲單例singleton
@PostConstruct 初始化方法
@PreDestroy 銷燬方法
@Lazy(true) 延遲加載
依賴注入相關的註解
@Autowired和@Qualifier
支持setter方式注入和構造器方式的注入.
當採用set方式注入式,可以將@Autowired添加到set方法前面,如果不使用@Qualifier,則容器會使用byType的方式來注入,有可能出錯,所以建議使用@Qualifier註解,明確指定bean的id.
也可以將@Autowire@Qualifier都加到屬性前面,此時set方法可要可不要(java反射機制).
當採用構造器方式注入時,可以將該註解添加到對應的構造器前面即可.
@Resource只能處理Setter注入 開發中大部分情況都是Setter注入.
可以將該註解加到set方法前面,使用name屬性指定要注入的bean的id.@Resource(name="")指定bean的id值.如果不指定,會按照byType的方式注入.
也可以直接加到屬性前面.
@Value
<util:properties id="config" location="classpath:config.properties">
"mg") (public class Manager{ "#{config.pagesize}") ( private String pageSize; "Striner") //可以直接注入進本類型的值 ( private String name; }
可以使用@Value來注入基本類型的值
也可以使用@Value註解來使用Spring表達式
也可以添加到屬性前,或者添加到對應的set方法前.