天天看點

有關Spring的知識點總結Spring

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元素)

有關Spring的知識點總結Spring

指定作用域 @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方法前.