Spring
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.
也可以将@[email protected]都加到屬性前面,此時set方法可要可不要(java反射機制).
當采用構造器方式注入時,可以将該注解添加到對應的構造器前面即可.
@Resource隻能處理Setter注入 開發中大部分情況都是Setter注入.
可以将該注解加到set方法前面,使用name屬性指定要注入的bean的[email protected](name="")指定bean的id值.如果不指定,會按照byType的方式注入.
也可以直接加到屬性前面.
@Value
<util:properties id="config" location="classpath:config.properties">
@Component("mg")
public class Manager{
@Value("#{config.pagesize}")
private String pageSize;
@Value("Striner") //可以直接注入進本類型的值
private String name;
}
可以使用@Value來注入基本類型的值
也可以使用@Value注解來使用Spring表達式
也可以添加到屬性前,或者添加到對應的set方法前.