1. 程式人生 > >Spring學習筆記(二)

Spring學習筆記(二)

Bean作用域

首先解釋下作用域,java、js都有作用域,它們表示的是變數的可見範圍,例如函式中定義的變數只能在這個函式裡使用。而Spring容器的作用域是指建立的Bean相對於其他Bean的請求可見範圍。

(1)singleton作用域
在每個IOC容器中只建立一個例項,整個生命週期由Spring容器管理。也就是,對於所有獲取該bean(singleton)的操作,容器只返回同一個Bean。

單例的實現,我們可以在類上定義靜態屬性去持有這個例項或者通過登錄檔的方式去實現。
Spring容器實現是通過登錄檔的方式,因為第一種是侵入式方式,對於每一個物件,都要實現一個類,很麻煩。

通過實現SingletonBeanRegistry介面,將所要建立的bean放入一個Map物件中,通過beanName來獲取對用的bean物件。(大致方法有:是否包含這個bean、獲取bean的數量、獲取bean的name、獲取bean、註冊bean)

public interface SingletonBeanRegistry {
    void registerSingleton(String var1, Object var2);

    Object getSingleton(String var1);

    boolean containsSingleton(String var1);

    String[] getSingletonNames();

    int getSingletonCount();

    Object getSingletonMutex();
}

Spring會快取singleton的bean例項和bean定義,而prototype(往下看)只會快取bean定義。

(2)prototype
每次向容器獲取bean時,都會建立一個新的物件。

GOF原型設計模式:用原型例項指定建立物件的種類,並通過拷貝這些原型建立的物件。
在java裡頭,原型例項-》class類,原型物件-》例項,可通過clone方法進行拷貝。(侵入式)
而spring中,用bean定義指定建立物件的種類,根據bean定義建立新物件。(非侵入式,可配置)

Web應用中的作用域
(1)request作用域:表示每個請求需要容器建立一個全新Bean。例如表單提交,每次請求新建一個bean來保持這些資料。
(2)session作用域:表示每個會話容器都會建立一個全新Bean。
(3)globalSession:類似session作用域。

自定義Scope

public interface Scope {
    //從作用域中獲取bean,取不到factory建立新bean
    Object get(String var1, ObjectFactory<?> var2);
    
    Object remove(String var1);
    //註冊銷燬毀掉
    void registerDestructionCallback(String var1, Runnable var2);
    //解析相應上下文資料
    Object resolveContextualObject(String var1);
    //作用域的會話標識
    String getConversationId();
}

通過實現該介面,將具體物件註冊到Spring容器

<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer”>
    <!-- 注入scopes屬性 -->
    <property name="scopes">
        <map>
            <entry>
                <!-- 指定scope關鍵字 -->
                <key>
                    <value>thread</value>
                </key>
                <!-- scope實現 -->
                <bean class="spring.chapter3.ThreadScope"/>
            </entry>
        </map>
    </property>
</bean>

然後bean的作用域可以更改啦。

public interface Resource extends InputStreamSource {
    
    //返回java.io.InputStream位元組流
    InputStream getInputStream() throws IOException;
    //當前資源是否存在
    boolean exists();
    //底層資源是否可讀
    boolean isReadable();
    //true只能被讀取一次後關閉以避免資源洩漏,常見resource返回為false
    boolean isOpen();
    //如果當前Resource代表java.util.URL,則返回URL,否則拋錯
    URL getURL() throws IOException;
    //如果當前Resource代表java.util.URI,則返回URi,否則拋錯
    URI getURI() throws IOException;
    //如果當前Resource代表java.io.File,則返回File,否則拋錯
    File getFile() throws IOException;
    //返回當前Resource代表檔案資源的長度
    long contentLength() throws IOException;
    //底層資源最後修改時間
    long lastModified() throws IOException;
    //用於建立當前資源的資源, 例如 resource代表檔案資源,/user/ ,那麼建立的text.txt 在 /user/text.txt
    Resource createRelative(String var1) throws IOException;
    //獲取檔案資源的檔案路徑
    String getFilename();
    //返回資源的描述符,也就是全路徑(實際檔名/實際URL地址)
    String getDescription();
}

ResourceLoader介面用於返回Resource物件,可以將其看作一個生產Resource的工廠類。
Spring提供一個適用於所有環境的DefaultResourceLoader實現,可以返回ClassPathResource、UrlResource。ServletContentResourceLoader還提供額外的ServletContentResource。

ResourceLoader載入資源需要使用字首來指定需要載入的內容:
classpath:path返回ClasspathResource。
http://path和file:path表示返回UrlResource資源,不加字首,需要根據當前上下文決定。

ClassPathXmlApplicationContext:不指定字首預設返回ClassPathResource
FileSystemXmlApplicationContext:不指定字首返回FileSystemResource
WebApplicationContext:不指定字首預設返回ServletContextResource

public interface ResourceLoaderAware extends Aware {
    void setResourceLoader(ResourceLoader var1);
}

ResourceLoaderAware介面,是一個回撥標記介面,當有bean實現它時,ApplicationContext會將ResourceLoader(自己)注入到這個bean中。Application已經實現了ResourceLoader。

classpath: 表示支援載入一個Resource。
classpath*:支援載入所有匹配的類路徑Resource。
Spring是通過ResourcePatternResolver介面來載入多個Resource的,該介面繼承ResourceLoader並新增新的獲取一組Resource的方法。

public interface ResourcePatternResolver extends ResourceLoader {
    String CLASSPATH_ALL_URL_PREFIX = "classpath*:";

    Resource[] getResources(String var1) throws IOException;
}

ResourceArrayPropertyEditor是用來將路徑字串轉為Resource的,PathMatchingResourcePatternResolver解析資原始檔的策略介面

FileSystemXmlApplicationContext,在linux不管是否帶/,都是相對路徑,windows是絕對路徑,要想在linux上絕對請使用File:/root/www/……

AOP
橫切關注點:一個元件無法完成需要的功能,需要其他元件協助(在元件執行前協助還是執行後協助)
連線點(jointPoint):表示橫切關注點的位置在哪(在元件那個地方協助)(Spring只支援方法為連線點)AOP表示在哪裡幹
切入點(Pointcut):連線點的集合。AOP表示在哪乾的集合
通知(Advice):對連線點處進行拓展,前置通知,後置通知,環繞通知。AOP表示增強的功能也就是在連線點幹什麼
方面/切面(Aspect):通知、引入和切入點的組合。AOP表示在哪乾和幹什麼的集合
引入:為已有的類新增額外新的欄位或方法。
目標物件:切入點選擇的物件。AOP表示對誰幹
AOP代理:通過代理,實現連線點處插入通知。通過代理來增強。AOP中代理可使用CGLIB和JDK動態代理實現。
織入:將切面應用到目標物件,從而創建出AOP代理物件的過程。可以發生在編譯器、類裝載期、執行期。

相關推薦

Spring 學習筆記IOC之簡單工廠模擬IOC

IOC不是一種技術,是一種思想。 依賴注入是一種設計模式。 IOC不等於依賴注入。 是把例項化物件的操作交給IOC容器, 程式碼中用到物件的時候就去IOC容器中取。使得物件與物件之間鬆散耦合。 簡單工廠模擬IOC 1. 建立People介面 package or

Spring 學習筆記- Bean 的配置

# 概要 IOC & DI 概述 配置 bean 配置形式:基於 XML 檔案的方式;基於註解的方式 Bean 的配置方式:通過全類名(反射)、通過工廠方法(靜態工廠方法 & 例項工廠方法)、FactoryBean IOC 容器 Bean

Spring學習筆記

Bean作用域 首先解釋下作用域,java、js都有作用域,它們表示的是變數的可見範圍,例如函式中定義的變數只能在這個函式裡使用。而Spring容器的作用域是指建立的Bean相對於其他Bean的請求可見範圍。 (1)singleton作用域 在每個IOC容器中只

Spring學習筆記後處理器與AOP

1.後處理器 後處理器是對IOC容器功能的擴充套件。按我的理解,擴充套件的原理是在某動作結束後再次呼叫指定的方法進行擴充套件處理。有點類似於AOP。 後處理器分兩種:Bean後處理器和容器後處理器。 1.1 Bean後處理器 Bean後處理器會在Be

Spring學習筆記——註解建立物件和注入屬性

一、Bean相關的註解 與SpringBean相關的註解有以下四大類: @Component:標註一個普通的Spring Bean類 @Controller:標註一個控制器元件類 @Service:標註一個業務邏輯元件類 @Repository:標註一個D

Spring Boot 學習筆記

imp family framework ima pri spa cal bin ges 新建Srping Boot 項目 以下是項目結構 由於Srping Boot內置Tomcat,所以不需要配置Tomcat就可以直接運行。 HelloWorldAppli

Spring框架學習筆記

約束 存在 基礎 核心 但是 註解 文件的 分享 strong 上接Spring框架學習筆記(一) IOC和DI區別 (1)IOC: 控制反轉,把對象創建交給spring進行配置 (2)DI: 依賴註入,向類裏面的屬性中設置值 (3)關系:依賴註入不能單獨存在,需要在i

Spring Boot 學習筆記—— WEB相關配置

一、前言 上次我們快速搭建了一個Spring Boot專案,我們只需新增業務邏輯就能直接執行訪問了,說明Spring Boot已經自動為我們做完了配置工作,這次我們就來看看具體是哪些工作,如果我們想接管配置又該怎麼做。 二、WEB相關配置 檢視WebMvcAutoConfigur

Spring MVC 學習筆記:@RequestMapping用法詳解

一、@RequestMapping 簡介 在Spring MVC 中使用 @RequestMapping 來對映請求,也就是通過它來指定控制器可以處理哪些URL請求,相當於Servlet中在web.xml中配置 <servlet>  

spring 原始碼學習筆記事務管理

spring 事務管理會幫我們自動管理資料庫的事務,沒讀原始碼前覺得很神祕,讀了原始碼發現原理還是很簡單的。 本質上還是用的 jdbc 的事務管理。spring 在呼叫某個方法前,判斷是否需要事務,如果需要,則呼叫 con.setAutoCommit(false);//開

微服務學習筆記Spring Cloud

2. Spring Cloud Spring Cloud作為Java語言的微服務框架,依賴於Spring Boot,具有快速開發、持續交付、易於部署等特點。 2.1 微服務應該具備的功能 微服務的特點: 按照業務劃分服務。每個微服務執行在獨立的程序中,有獨立的

Spring Boot學習筆記使用Servlet、Filter、Listener

Servlet 還是得整合HttpServlet,然後重寫父類方法。 類的上方增加了@WebServlet註解,其實就是代替了xml的配置,可以被spring boot掃描、註冊到。 package org.test.Controll; import javax.servlet.Servl

Spring-data-jpa:學習筆記

       通過上一篇筆記的,我們掌握了SpringData的相關概念及簡單的用法。但上一篇筆記主要講的是Dao層介面直接繼承Repository介面,然後再自己定義方法。主要闡述了自定義方法時的一些規則及SpringData是如何

Spring基礎學習筆記

  原始碼根目錄(spring-framework-4.1.2.RELEASE) 最少新增jar檔案 applicationContext.xml標準命名 <?xml version="1.0" encoding="UTF-8"?> <bean

Spring Boot學習筆記——整合MySQL及dubbo

目錄 L 3.Spring Boot整合MySQL 一、使用JDBCTemplate引入MySQL 1.新增spring boot jdbc資料來源配置 2.引入maven依賴(jdbc、connector、druid) 二、整合mybatis 1.單資料來源mybati

Spring Boot 學習筆記第一個 Spring boot 程式

  SpringBoot程式建立方式  1、建立一個Spring boot專案      1) 可以採用方式一: 使用 eclipse 的 Spring Tool Suite (STS) 外掛/或者 IDEA 自帶的外掛建立;    

Spring-Cloud學習筆記RestTemplate和Feign的使用方式以及部分註解的使用

通常,我們在搭建springcloud微服務架構時,會把我們的服務註冊到高可用eureka服務註冊發現中心上面,各個服務之間的通訊就是無可避免的,此時我們就需要用到RestTemplate 或者Feign去進行各個服務之間的通訊呼叫。                    

Spring-Cloud-Ribbon學習筆記:自定義負載均衡規則

lan cse 重新啟動 ping for obi .config 流行 prope Ribbon自定義負載均衡策略有兩種方式,一是JavaConfig,一是通過配置文件(yml或properties文件)。 需求 假設我有包含A和B服務在內的多個微服務,它們均註冊在一個E

php laravel框架學習筆記 數據庫操作

true 數據 mar sql show top 一行 ati del 原博客鏈接:http://www.cnblogs.com/bitch1319453/p/6810492.html mysql基本配置 你可用通過配置環境變量,使用cmd進入mysql,當然還有一種東

java學習筆記圖形用戶接口

star strong per getwidth cep runnable graphics s2d gb2 這個學期主要放在ACM比賽上去了,比賽結束了。不知不覺就15周了,這周就要java考試了,復習一下java吧。java的學習的目的還是讓我們學以致用,讓我們可以