深入理解微服務架構spring的各個知識點(面試必問知識點)

weixin_33807284發表於2018-05-08

前言:

最近整理Spring相關的知識點(面試必問) ,在我整理的過程中,我發現自己對Spring的理解有點朦朧,因為在平時我們接受的是Spring單個的知識點或者知道但沒有程式碼的支援所有有點朦朧,所以我就把Spring知識點從整體然後往區域性,到最後一個一個知識點拎出來,我想有很多的朋友或者是初學的朋友和我一樣對Spring有點朦朧,所以我分享出來,寫的不完全和不好的歡迎指出

什麼是spring

spring是一個開源框架,spring為簡化企業級開發而生,使用spring可以使簡單的java bean 實現以前只有EJG才能實現的功能。

Spring是一個輕量級的控制反轉(IoC)和麵向切面(AOP)的容器框架。

spring的特點

◆ 輕量——從大小與開銷兩方面而言Spring都是輕量的。完整的Spring框架可以在一個大小隻有1MB多的JAR檔案裡釋出。並 且Spring所需的處理開銷也是微不足道的。此外,Spring是非侵入式的:典型地,Spring應用中的物件不依賴於Spring的特定類。

◆ 控制反轉——Spring通過一種稱作控制反轉(IoC)的技術促進了鬆耦 合。當應用了IoC,一個物件依賴的其它物件會通過被動的方式傳遞進來,而不是這個物件自己建立或者查詢依賴物件。你可以認為IoC與JNDI相反——不 是物件從容器中查詢依賴,而是容器在物件初始化時不等物件請求就主動將依賴傳遞給它。

◆ 面向切面——Spring提供了面向切面程式設計的豐富支援,允許通過分離應用的 業務邏輯與系統級服務(例如審計(auditing)和事務()管理)進行內聚性的開發。應用物件只實現它們應該做的——完成業務邏輯——僅此而已。它們 並不負責(甚至是意識)其它的系統級關注點,例如日誌或事務支援。

◆ 容器——Spring包含並管理應用物件的配置和生命週期,在這個意義上它是 一種容器,你可以配置你的每個bean如何被建立——基於一個可配置原型(prototype),你的bean可以建立一個單獨的例項或者每次需要時都生 成一個新的例項——以及它們是如何相互關聯的。然而,Spring不應該被混同於傳統的重量級的EJB容器,它們經常是龐大與笨重的,難以使用。

◆ 框架——Spring可以將簡單的元件配置、組合成為複雜的應用。在Spring中,應用物件被宣告式地組合,典型地是在一個XML檔案裡。 Spring也提供了很多基礎功能(事務管理、持久化框架整合等等),將應用邏輯的開發留給了你。

Spring包括哪些內容

  • 核心技術 IoC 和 AOP
  • 資料訪問 (持久層解決方案)
  • Web層解決方案 SpringMVC
  • 整合 (整合其他開源框架)

使用Spring有什麼好處

◆Spring能有效地組織你的中間層物件,無論你是否選擇使用了EJB。如果你僅僅使用了Struts或其他的包含了J2EE特有APIs的 framework,你會發現Spring關注了遺留下的問題,。

◆Spring能消除在許多工程上對Singleton的過多使用。根據我的經驗,這是一個主要的問題,它減少了系統的可測試性和麵向物件特性。

◆Spring能消除使用各種各樣格式的屬性定製檔案的需要,在整個應用和工程中,可通過一種 一致的方法來進行配置。曾經感到迷惑,一個特定類要查詢迷幻般的屬性關鍵字或系統屬性,為此不得不讀Javadoc乃至源編碼嗎?有了Spring,你可 很簡單地看到類的JavaBean屬性。倒置控制的使用(在下面討論)幫助完成這種簡化。

◆Spring能通過介面而不是類促進好的程式設計習慣,減少程式設計代價到幾乎為零。

◆Spring被設計為讓使用它建立的應用盡可能少的依賴於他的APIs。在Spring應用中的大多數業務物件沒有依賴於Spring。

◆使用Spring構建的應用程式易於單元測試。

◆Spring能使EJB的使用成為一個實現選擇,而不是應用架構的必然選擇。你能選擇用POJOs或local EJBs來實現業務介面,卻不會影響呼叫程式碼。

◆Spring幫助你解決許多問題而無需使用EJB。Spring能提供一種EJB的替換物,它們適於許多web應用。例如,Spring能使用 AOP提供宣告性事務而不通過使用EJB容器,如果你僅僅需要與單個的資料庫打交道,甚至不需要JTA實現。

■Spring為資料存取提供了一致的框架,不論是使用JDBC或O/R mapping產品(如Hibernate)。

Spring確實使你能通過最簡單可行的解決辦法解決你的問題。這些特性是有很大價值的。

總結起來,Spring有如下優點:

◆低侵入式設計,程式碼汙染極低

◆ 獨立於各種應用伺服器,可以真正實現Write Once,Run Anywhere的承諾

◆Spring的DI機制降低了業務物件替換的複雜性

◆Spring並不完全依賴於Spring,開發者可自由選用Spring框架的部分或全部

在此我向大家推薦一個架構學習交流群。交流學習群號:575745314 裡面會分享一些資深架構師錄製的視訊錄影:有Spring,MyBatis,Netty原始碼分析,高併發、高效能、分散式、微服務架構的原理,JVM效能優化、分散式架構等這些成為架構師必備的知識體系。還能領取免費的學習資源,目前受益良多

spring中的核心類有那些,各有什麼作用

BeanFactory:產生一個新的例項,可以實現單例模式

BeanWrapper:提供統一的get及set方法

ApplicationContext:提供框架的實現,包括BeanFactory的所有功能

spring常用的類和介面有哪些

A:ApplicationContextAware介面

當一個類需要獲取ApplicationContext例項時,可以讓該類實現ApplicationContextAware介面。

B:ApplicationEvent抽象類

當需要建立自定義事件時,可以新建一個繼承自ApplicationEvent抽象類的類。

C:ApplicationListener介面

當需要監聽自定義事件時,可以新建一個實現ApplicationListener介面的類,並將該類配置到Spring容器中。

D:BeanNameAware介面

當bean需要獲取自身在容器中的id/name時,可以實現BeanNameAware介面。

E:InitializingBean介面

當需要在bean的全部屬性設定成功後做些特殊的處理,可以讓該bean實現InitializingBean介面。

效果等同於bean的init-method屬性的使用或者@PostContsuct註解的使用。

三種方式的執行順序:先註解,然後執行InitializingBean介面中定義的方法,最後執行init-method屬性指定的方法。

F:DisposableBean介面

當需要在bean銷燬之前做些特殊的處理,可以讓該bean實現DisposableBean介面。

效果等同於bean的destroy-method屬性的使用或者@PreDestory註解的使用。

三種方式的執行順序:先註解,然後執行DisposableBean介面中定義的方法,最後執行destroy-method屬性指定的方法。

G:BeanPostProcessor介面

當需要對受管bean進行預處理時,可以新建一個實現BeanPostProcessor介面的類,並將該類配置到Spring容器中。

H:BeanFactoryPostProcessor介面

當需要對Bean工廠進行預處理時,可以新建一個實現BeanFactoryPostProcessor介面的類,並將該類配置到Spring容器中。

spring事務的原理

事務管理的方式:程式設計型和宣告型,spring推薦使用後一種方式

宣告型事務管理的優勢非常明顯:程式碼中無需關於關注事務邏輯,讓Spring宣告式事務管理負責事務邏輯,宣告式事務管理無需與具體的事務邏輯耦 合,可以方便地在不同事務邏輯之間切換。

什麼是IOC,什麼又是DI,他們有什麼區別

依賴注入DI是一個程式設計模式和架構模型, 一些時候也稱作控制反轉,儘管在技術上來講,依賴注入是一個IOC的特殊實現,依賴注入是指一個物件應用另外一個物件來提供一個特殊的能力,例如:把一個 資料庫連線已引數的形式傳到一個物件的結構方法裡面而不是在那個物件內部自行建立一個連線。控制反轉和依賴注入的基本思想就是把類的依賴從類內部轉化到外 部以減少依賴

應用控制反轉,物件在被建立的時候,由一個調控系統內所有物件的外界實體,將其所依賴的物件的引用,傳遞給它。也可以說,依賴被注入到物件中。所 以,控制反轉是,關於一個物件如何獲取他所依賴的物件的引用,這個責任的反轉。

clipboard.png

Bean注入屬性的幾種方式

clipboard.png

什麼是aop,aop的作用是什麼

面向切面程式設計(AOP)提供另外一種角度來思考程式結構,通過這種方式彌補了物件導向程式設計(OOP)的不足,除了類(classes)以外,AOP提供了切面。切面對關注點進行模組化,例如橫切多個型別和物件的事務管理

Spring的一個關鍵的元件就是AOP框架,可以自由選擇是否使用AOP 提供宣告式企業服務,特別是為了替代EJB宣告式服務。最重要的服務是宣告性事務管理,這個服務建立在Spring的抽象事物管理之上。允許使用者實現自定義切面,用AOP來完善OOP的使用,可以把Spring AOP看作是對Spring的一種增強

clipboard.png

AOP裡面重要的幾個名詞概念解釋

切面(Aspect): 一個關注點的模組化,這個關注點可能會橫切多個物件。事務管理是J2EE應用中一個關於橫切關注點的很好的例子。 在Spring AOP中,切面可以使用通用類(基於模式的風格) 或者在普通類中以 @Aspect 註解(@AspectJ風格)來實現。

連線點(Joinpoint): 在程式執行過程中某個特定的點,比如某方法呼叫的時候或者處理異常的時候。 在Spring AOP中,一個連線點 總是 代表一個方法的執行。 通過宣告一個org.aspectj.lang.JoinPoint型別的引數可以使通知(Advice)的主體部分獲得連線點資訊。

通知(Advice): 在切面的某個特定的連線點(Joinpoint)上執行的動作。通知有各種型別,其中包括“around”、“before”和“after”等通知。 通知的型別將在後面部分進行討論。許多AOP框架,包括Spring,都是以攔截器做通知模型, 並維護一個以連線點為中心的攔截器鏈。

切入點(Pointcut): 匹配連線點(Joinpoint)的斷言。通知和一個切入點表示式關聯,並在滿足這個切入點的連線點上執行(例如,當執行某個特定名稱的方法時)。 切入點表示式如何和連線點匹配是AOP的核心:Spring預設使用AspectJ切入點語法。

引入(Introduction): (也被稱為內部型別宣告(inter-type declaration))。宣告額外的方法或者某個型別的欄位。 Spring允許引入新的介面(以及一個對應的實現)到任何被代理的物件。 例如,你可以使用一個引入來使bean實現 IsModified 介面,以便簡化快取機制。

目標物件(Target Object): 被一個或者多個切面(aspect)所通知(advise)的物件。也有人把它叫做 被通知(advised) 物件。 既然Spring AOP是通過執行時代理實現的,這個物件永遠是一個 被代理(proxied) 物件。

AOP代理(AOP Proxy): AOP框架建立的物件,用來實現切面契約(aspect contract)(包括通知方法執行等功能)。 在Spring中,AOP代理可以是JDK動態代理或者CGLIB代理。 注意:Spring 2.0最新引入的基於模式(schema-based)風格和@AspectJ註解風格的切面宣告,對於使用這些風格的使用者來說,代理的建立是透明的。

織入(Weaving): 把切面(aspect)連線到其它的應用程式型別或者物件上,並建立一個被通知(advised)的物件。 這些可以在編譯時(例如使用AspectJ編譯器),類載入時和執行時完成。 Spring和其他純Java AOP框架一樣,在執行時完成織入。

通知的型別:

前置通知(Before advice): 在某連線點(join point)之前執行的通知,但這個通知不能阻止連線點前的執行(除非它丟擲一個異常)。

返回後通知(After returning advice): 在某連線點(join point)正常完成後執行的通知:例如,一個方法沒有丟擲任何異常,正常返回。

丟擲異常後通知(After throwing advice): 在方法丟擲異常退出時執行的通知。

後通知(After (finally) advice): 當某連線點退出的時候執行的通知(不論是正常返回還是異常退出)。

環繞通知(Around Advice): 包圍一個連線點(join point)的通知,如方法呼叫。這是最強大的一種通知型別。 環繞通知可以在方法呼叫前後完成自定義的行為。它也會選擇是否繼續執行連線點或直接返回它們自己的返回值或丟擲異常來結束執行。

環繞通知是最常用的一種通知型別。大部分基於攔截的AOP框架,例如Nanning和JBoss4,都只提供環繞通知。

切入點(pointcut)和連線點(join point)匹配的概念是AOP的關鍵,這使得AOP不同於其它僅僅提供攔截功能的舊技術。 切入點使得定位通知(advice)可獨立於OO層次。 例如,一個提供宣告式事務管理的around通知可以被應用到一組橫跨多個物件中的方法上(例如服務層的所有業務操作)。

clipboard.png

請介紹一下Spring框架中Bean的生命週期和作用域

(1) bean定義

在配置檔案裡面用<bean></bean>來進行定義。

(2) bean初始化

有兩種方式初始化:

A.在配置檔案中通過指定init-method屬性來完成

B.實現org.springframwork.beans.factory.InitializingBean介面

(3) bean呼叫

有三種方式可以得到bean例項,並進行呼叫

(4) bean銷燬

銷燬有兩種方式

A.使用配置檔案指定的destroy-method屬性

B.實現org.springframwork.bean.factory.DisposeableBean介面

作用域

singleton

當一個bean的作用域為singleton, 那麼Spring IoC容器中只會存在一個共享的bean例項,並且所有對bean的請求,只要id與該bean定義相匹配,則只會返回bean的同一例項。

prototype

Prototype作用域的bean會導致在每次對該bean請求(將其注入到另一個bean中,或者以程式的方式呼叫容器的getBean() 方法)時都會建立一個新的bean例項。根據經驗,對所有有狀態的bean應該使用prototype作用域,而對無狀態的bean則應該使用 singleton作用域

request

在一次HTTP請求中,一個bean定義對應一個例項;即每次HTTP請求將會有各自的bean例項, 它們依據某個bean定義建立而成。該作用 域僅在基於web的Spring ApplicationContext情形下有效。

session

在一個HTTP Session中,一個bean定義對應一個例項。該作用域僅在基於web的Spring

ApplicationContext情形下有效。

global session

在一個全域性的HTTP Session中,一個bean定義對應一個例項。典型情況下,僅在使用portlet

context的時候有效。該作用域僅在基於 web的Spring ApplicationContext情形下有效。

Bean的初始化方式有哪些

有兩種方式初始化Bean。
1、在配置文件中通過指定init-method 屬性來完成
在Bean的類中實現一個初始化Bean屬性的方法,如init(),如:
public class HelloWorld{
public String msg=null;
public Date date=null;
public void init() {
msg=”HelloWorld”;
date=new Date();
}
……
}
然後,在配置檔案中設定init-mothod屬性:
<bean id=”HelloWorld” class=”com.pqf.beans.HelloWorld” init-mothod=”init” >
</bean>

2、實現 org.springframwork.beans.factory.InitializingBean介面
Bean實現InitializingBean介面,並且增加 afterPropertiesSet() 方法:
public class HelloWorld implement InitializingBean {
public String msg=null;
public Date date=null;
public void afterPropertiesSet() {
msg=”向全世界問好!”;
date=new Date();
}
……
}
那麼,當這個Bean的所有屬性被Spring的BeanFactory設定完後,會自動呼叫afterPropertiesSet()方法對 Bean進行初始化,於是,配置檔案就不用指定 init-method屬性了。

Bean的呼叫方式有哪些

有三種方式可以得到Bean並進行呼叫:
1、使用BeanWrapper
HelloWorld hw=new HelloWorld();
BeanWrapper bw=new BeanWrapperImpl(hw);
bw.setPropertyvalue(”msg”,”HelloWorld”);
system.out.println(bw.getPropertyCalue(”msg”));
2、使用BeanFactory
InputStream is=new FileInputStream(”config.xml”);
XmlBeanFactory factory=new XmlBeanFactory(is);
HelloWorld hw=(HelloWorld) factory.getBean(”HelloWorld”);
system.out.println(hw.getMsg());
3、使用ApplicationConttext
ApplicationContext actx=new FleSystemXmlApplicationContext(”config.xml”);
HelloWorld hw=(HelloWorld) actx.getBean(”HelloWorld”);
System.out.println(hw.getMsg());

Bean的銷燬方式有哪些

1、使用配置檔案中的 destory-method 屬性
與初始化屬性 init-methods類似,在Bean的類中實現一個撤銷Bean的方法,然後在配置檔案中通過 **destory-method指定,那麼當bean銷燬時,Spring將自動呼叫指定的銷燬方法。
2、實現 org.springframwork.bean.factory.DisposebleBean介面**
如果實現了DisposebleBean介面,那麼Spring將自動呼叫bean中的Destory方法進行銷燬,所以,Bean中必須提供 Destory方法。

介紹一下Spring的事務管理

事務就是對一系列的資料庫操作(比如插入多條資料)進行統一的提交或回滾操作,如果插入成功,那麼一起成功,如果中間有一條出現異常,那麼回滾之 前的所有操作。

這樣可以防止出現髒資料,防止資料庫資料出現問題。

開發中為了避免這種情況一般都會進行事務管理。Spring中也有自己的事務管理機制,一般是使用TransactionMananger進行管 理,可以通過Spring的注入來完成此功能。

spring提供了幾個關於事務處理的類:

TransactionDefinition //事務屬性定義

TranscationStatus //代表了當前的事務,可以提交,回滾。

PlatformTransactionManager這個是spring提供的用於管理事務的基礎介面,其下有一個實現的抽象類 AbstractPlatformTransactionManager,我們使用的事務管理類例如 DataSourceTransactionManager等都是這個類的子類。

一般事務定義步驟:

TransactionDefinition td = new TransactionDefinition();

TransactionStatus ts = transactionManager.getTransaction(td);

try

{ //do sth

transactionManager.commit(ts);

}

catch(Exception e){transactionManager.rollback(ts);}

spring提供的事務管理可以分為兩類:程式設計式的和宣告式的。程式設計式的,比較靈活,但是程式碼量大,存在重複的程式碼比較多;宣告式的比程式設計式的更 靈活。

程式設計式主要使用transactionTemplate。省略了部分的提交,回滾,一系列的事務物件定義,需注入事務管理物件.

void add(){

transactionTemplate.execute( new TransactionCallback(){

pulic Object doInTransaction(TransactionStatus ts)

{ //do sth}

}

}

宣告式:

使用TransactionProxyFactoryBean:

PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_REQUIRED,readOnly

圍繞Poxy的動態代理 能夠自動的提交和回滾事務

org.springframework.transaction.interceptor.TransactionProxyFactoryBean

PROPAGATION_REQUIRED–支援當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。

PROPAGATION_SUPPORTS–支援當前事務,如果當前沒有事務,就以非事務方式執行。

PROPAGATION_MANDATORY–支援當前事務,如果當前沒有事務,就丟擲異常。

PROPAGATION_REQUIRES_NEW–新建事務,如果當前存在事務,把當前事務掛起。

PROPAGATION_NOT_SUPPORTED–以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。

PROPAGATION_NEVER–以非事務方式執行,如果當前存在事務,則丟擲異常。

PROPAGATION_NESTED–如果當前存在事務,則在巢狀事務內執行。如果當前沒有事務,則進行與 PROPAGATION_REQUIRED類似的操作。

在此我向大家推薦一個架構學習交流群。交流學習群號:575745314 裡面會分享一些資深架構師錄製的視訊錄影:有Spring,MyBatis,Netty原始碼分析,高併發、高效能、分散式、微服務架構的原理,JVM效能優化、分散式架構等這些成為架構師必備的知識體系。還能領取免費的學習資源,目前受益良多
圖片描述

為什麼要有事務傳播行為

clipboard.png

Spring裡面如何配置資料庫驅動

使用”org.springframework.jdbc.datasource.DriverManagerDataSource”資料來源來配置資料庫驅動。示例如下:

<bean id=”dataSource”>

 <property name=”driverClassName”> 

    <value>org.hsqldb.jdbcDriver</value> </property> 

<property name=”url”> 

     <value>jdbc:hsqldb:db/appfuse</value> 

 </property> 

 <property name=”username”><value>sa</value></property> 

 <property name=”password”><value></value></property> 

</bean>

Spring裡面applicationContext.xml檔案能不能改成其他檔名

ContextLoaderListener是一個ServletContextListener, 它在你的web應用啟動的時候初始化。預設情況下, 它會在WEB-INF/applicationContext.xml檔案找Spring的配置。 你可以通過定義一個<context-param>元素名字為”contextConfigLocation”來改變Spring配置檔案的 位置。示例如下:

<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>/WEB-INF/xyz.xml</param-value>

</context-param>

</listener-class>

</listener>

如何在web應用裡面配置spring

在web.xml中加入如下同容,在啟動web伺服器時載入/WEB-INF/applicationContext.xml中的內容。

<servlet>

<servlet-name>context</servlet-name>

<servlet-class>

org.springframework.web.context.ContextLoaderServlet

</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>

通過如下類得到ApplicationContext例項

WebApplicationContextUtils.getWebApplicationContext

Spring裡面如何定義hibernate mapping

新增hibernate mapping 檔案到web/WEB-INF目錄下的applicationContext.xml檔案裡面。示例如下:

<property name=”mappingResources”>

<list>

<value>org/appfuse/model/User.hbm.xml</value>

</list>

</property>

spring中的BeanFactory與ApplicationContext的作用有哪些

  1. BeanFactory負責讀取bean配置文件,管理bean的載入,例項化,維護bean之間的依賴關係,負責bean的宣告週期。
  2. ApplicationContext除了提供上述BeanFactory所能提供的功能之外,還提供了更完整的框架功能:

a. 國際化支援

b. 資源訪問:Resource rs = ctx. getResource(”classpath:config.properties”), “file:c:/config.properties”

c. 事件傳遞:通過實現ApplicationContextAware介面

  1. 常用的獲取ApplicationContext的方法:

FileSystemXmlApplicationContext:從檔案系統或者url指定的xml配置檔案建立,引數為配置檔名或檔名數 組

ClassPathXmlApplicationContext:從classpath的xml配置檔案建立,可以從jar包中讀取配置檔案

WebApplicationContextUtils:從web應用的根目錄讀取配置檔案,需要先在web.xml中配置,可以配置監聽器或者 servlet來實現

<listener>

<listener-class>

org.springframework.web.context.ContextLoaderListener

</listener-class>

</listener>

<servlet>

<servlet-name>context</servlet-name>

<servlet-class>

org.springframework.web.context.ContextLoaderServlet

</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>

這兩種方式都預設配置檔案為web-inf/applicationContext.xml,也可使用context-param指定配置檔案

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>/WEB-INF/myApplicationContext.xml</param-value>

</context-param>

BeanFactory 介面 和 ApplicationContext 介面區別

  • ApplicationContext 介面繼承 BeanFactory 介面 ,Spring核心工廠是BeanFactory ,BeanFactory 採取延遲載入,第一次getBean時才會初始化Bean , ApplicationContext 是會在載入配置檔案時初始化Bean
  • ApplicationContext是對BeanFactory擴充套件

國際化處理

事件傳遞

Bean自動裝配

各種不同應用層的Context實現

開發中基本都在使用ApplicationContext, web專案使用WebApplicationContext ,很少用到BeanFactory

BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));

IHelloService helloService = (IHelloService) beanFactory.getBean("helloService");

helloService.sayHello();

如何在web環境中配置applicationContext.xml檔案

<listener>

<listener-class>

org.springframework.web.context.ContextLoaderListener

</listener-class>

</listener>

或:

<servlet>

<servlet-name>context</servlet-name>

<servlet-class>

org.springframework.web.context.ContextLoaderServlet

</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>

通過如下方法取出applicationContext例項:

ApplicationContext ac=WebApplicationContextUtils.

getWebApplicationContext(this.getServletContext);

如何在spring中實現國際化

在applicationContext.xml載入一個bean

<bean id=”messageSource”

class=”org.springframework.context.support.ResourceBundleMessageSource”>

<property name=”basename”>

<value>message</value>

</property>

</bean>

? 在src目錄下建多個properties檔案

? 對於非英文的要用native2ascii -encoding gb2312 源 目轉化檔案相關內容

? 其命名格式是message_語言_國家。

? 頁面中的中顯示提示資訊,鍵名取鍵值。

? 當給定國家,系統會自動載入對應的國家的properties資訊。

? 通過applictionContext.getMessage(“鍵名”,”引數”,”區域”)取出相關的資訊。

Spring如何處理執行緒併發問題

Spring使用ThreadLocal解決執行緒安全問題

我們知道在一般情況下,只有無狀態的Bean才可以在多執行緒環境下共享,在Spring中,絕大部分Bean都可以宣告為singleton作用域。就是因為Spring對一些Bean(如RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder等)中非執行緒安全狀態採用ThreadLocal進行處理,讓它們也成為執行緒安全的狀態,因為有狀態的Bean就可以在多執行緒中共享了。

ThreadLocal和執行緒同步機制都是為了解決多執行緒中相同變數的訪問衝突問題。

在同步機制中,通過物件的鎖機制保證同一時間只有一個執行緒訪問變數。這時該變數是多個執行緒共享的,使用同步機制要求程式慎密地分析什麼時候對變數進行讀寫,什麼時候需要鎖定某個物件,什麼時候釋放物件鎖等繁雜的問題,程式設計和編寫難度相對較大。

而ThreadLocal則從另一個角度來解決多執行緒的併發訪問。ThreadLocal會為每一個執行緒提供一個獨立的變數副本,從而隔離了多個執行緒對資料的訪問衝突。因為每一個執行緒都擁有自己的變數副本,從而也就沒有必要對該變數進行同步了。ThreadLocal提供了執行緒安全的共享物件,在編寫多執行緒程式碼時,可以把不安全的變數封裝進ThreadLocal。

由於ThreadLocal中可以持有任何型別的物件,低版本JDK所提供的get()返回的是Object物件,需要強制型別轉換。但JDK5.0通過泛型很好的解決了這個問題,在一定程度地簡化ThreadLocal的使用。

概括起來說,對於多執行緒資源共享的問題,同步機制採用了“以時間換空間”的方式,而ThreadLocal採用了“以空間換時間”的方式。前者僅提供一份變數,讓不同的執行緒排隊訪問,而後者為每一個執行緒都提供了一份變數,因此可以同時訪問而互不影響。

在此我向大家推薦一個架構學習交流群。交流學習群號:575745314 裡面會分享一些資深架構師錄製的視訊錄影:有Spring,MyBatis,Netty原始碼分析,高併發、高效能、分散式、微服務架構的原理,JVM效能優化、分散式架構等這些成為架構師必備的知識體系。還能領取免費的學習資源,目前受益良多

簡單敘述一下Spring 中BeanFactory與ApplicationContext的差別

使用 BeanFactory 從 xml配置檔案載入bean:

import org.springframework.beans.factory.xml.XmlBeanFactory;

import org.springframework.core.io.FileSystemResource;

public class XmlConfigWithBeanFactory {

public static void main(String[] args) {

XmlBeanFactory factory = new XmlBeanFactory(new FileSystemRe

"build/beans.xml"));

}

}

使用 ApplicationConText 從xml 配置檔案載入 bean:

public class XmlConfigWithApplication{

public static void main(String[] args){

ApplicationContext application =

new ClassPathXmlApplicationContext(beans.xml"));

application.getBean("BeanName");

}

}

簡而言之,BeanFactory 提供了配置框架和基本的功能, 而ApplicationContext 為它增加了更強的功能,這些功能中的一些或許更加接近J2EE 並且圍繞企業級應用。一般來說,ApplicationContext是 BeanFactory 的完全超集, 任何 BeanFactory 功能和行為的描述也同樣被認為適用於ApplicationContext

相對於 BeanFactory 而言,ApplicationContext 提供了以下擴充套件功能.

(a) 國際化支援

(b) 資源訪問

(c) 事件傳播

(d) 多例項載入

相關文章