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


指定作用域 @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">

@Component("mg")
public class Manager{
    @Value("#{config.pagesize}")
    private String pageSize;
    @Value("Striner")   //可以直接注入進本類型的值
    private String name;
}

可以使用@Value來注入基本類型的值

也可以使用@Value註解來使用Spring表達式

也可以添加到屬性前,或者添加到對應的set方法前.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章