前言:最近整理Spring相關的知識點(面試必問) ,在我整理的過程中,我發(fā)現自己對Spring的理解有點朦朧,因為在平時我們接受的是Spring單個的知識點或者知道但沒有代碼的支持所有有點朦朧,所以我就把Spring知識點從整體然后往局部,到最后一個一個知識點拎出來,我想有很多的朋友或者是初學的朋友和我一樣對Spring有點朦朧,所以我分享出來,寫的不完全和不好的歡迎指出 什么是springspring是一個開源框架,spring為簡化企業(yè)級開發(fā)而生,使用spring可以使簡單的java bean 實現以前只有EJG才能實現的功能。 Spring是一個輕量級的控制反轉(IoC)和面向切面(AOP)的容器框架。 spring的特點◆ 輕量——從大小與開銷兩方面而言Spring都是輕量的。完整的Spring框架可以在一個大小只有1MB多的JAR文件里發(fā)布。并 且Spring所需的處理開銷也是微不足道的。此外,Spring是非侵入式的:典型地,Spring應用中的對象不依賴于Spring的特定類。 ◆ 控制反轉——Spring通過一種稱作控制反轉(IoC)的技術促進了松耦 合。當應用了IoC,一個對象依賴的其它對象會通過被動的方式傳遞進來,而不是這個對象自己創(chuàng)建或者查找依賴對象。你可以認為IoC與JNDI相反——不 是對象從容器中查找依賴,而是容器在對象初始化時不等對象請求就主動將依賴傳遞給它。 ◆ 面向切面——Spring提供了面向切面編程的豐富支持,允許通過分離應用的 業(yè)務邏輯與系統(tǒng)級服務(例如審計(auditing)和事務()管理)進行內聚性的開發(fā)。應用對象只實現它們應該做的——完成業(yè)務邏輯——僅此而已。它們 并不負責(甚至是意識)其它的系統(tǒng)級關注點,例如日志或事務支持。 ◆ 容器——Spring包含并管理應用對象的配置和生命周期,在這個意義上它是 一種容器,你可以配置你的每個bean如何被創(chuàng)建——基于一個可配置原型(prototype),你的bean可以創(chuàng)建一個單獨的實例或者每次需要時都生 成一個新的實例——以及它們是如何相互關聯(lián)的。然而,Spring不應該被混同于傳統(tǒng)的重量級的EJB容器,它們經常是龐大與笨重的,難以使用。 ◆ 框架——Spring可以將簡單的組件配置、組合成為復雜的應用。在Spring中,應用對象被聲明式地組合,典型地是在一個XML文件里。 Spring也提供了很多基礎功能(事務管理、持久化框架集成等等),將應用邏輯的開發(fā)留給了你。 Spring包括哪些內容核心技術 IoC 和 AOP 數據訪問 (持久層解決方案) Web層解決方案 SpringMVC 集成 (整合其他開源框架) 使用Spring有什么好處◆Spring能有效地組織你的中間層對象,無論你是否選擇使用了EJB。如果你僅僅使用了Struts或其他的包含了J2EE特有APIs的 framework,你會發(fā)現Spring關注了遺留下的問題,。 ◆Spring能消除在許多工程上對Singleton的過多使用。根據我的經驗,這是一個主要的問題,它減少了系統(tǒng)的可測試性和面向對象特性。 ◆Spring能消除使用各種各樣格式的屬性定制文件的需要,在整個應用和工程中,可通過一種 一致的方法來進行配置。曾經感到迷惑,一個特定類要查找迷幻般的屬性關鍵字或系統(tǒng)屬性,為此不得不讀Javadoc乃至源編碼嗎?有了Spring,你可 很簡單地看到類的JavaBean屬性。倒置控制的使用(在下面討論)幫助完成這種簡化。 ◆Spring能通過接口而不是類促進好的編程習慣,減少編程代價到幾乎為零。 ◆Spring被設計為讓使用它創(chuàng)建的應用盡可能少的依賴于他的APIs。在Spring應用中的大多數業(yè)務對象沒有依賴于Spring。 ◆使用Spring構建的應用程序易于單元測試。 ◆Spring能使EJB的使用成為一個實現選擇,而不是應用架構的必然選擇。你能選擇用POJOs或local EJBs來實現業(yè)務接口,卻不會影響調用代碼。 ◆Spring幫助你解決許多問題而無需使用EJB。Spring能提供一種EJB的替換物,它們適于許多web應用。例如,Spring能使用 AOP提供聲明性事務而不通過使用EJB容器,如果你僅僅需要與單個的數據庫打交道,甚至不需要JTA實現。 ■Spring為數據存取提供了一致的框架,不論是使用JDBC或O/R mapping產品(如Hibernate)。 Spring確實使你能通過最簡單可行的解決辦法解決你的問題。這些特性是有很大價值的。 總結起來,Spring有如下優(yōu)點: ◆低侵入式設計,代碼污染極低 ◆ 獨立于各種應用服務器,可以真正實現Write Once,Run Anywhere的承諾 ◆Spring的DI機制降低了業(yè)務對象替換的復雜性 ◆Spring并不完全依賴于Spring,開發(fā)者可自由選用Spring框架的部分或全部 在此我向大家推薦一個架構學習交流群。交流學習群號:575745314 里面會分享一些資深架構師錄制的視頻錄像:有Spring,MyBatis,Netty源碼分析,高并發(fā)、高性能、分布式、微服務架構的原理,JVM性能優(yōu)化、分布式架構等這些成為架構師必備的知識體系。還能領取免費的學習資源,目前受益良多 spring中的核心類有那些,各有什么作用 BeanFactory:產生一個新的實例,可以實現單例模式 BeanWrapper:提供統(tǒng)一的get及set方法 ApplicationContext:提供框架的實現,包括BeanFactory的所有功能 spring常用的類和接口有哪些A:ApplicationContextAware接口 當一個類需要獲取ApplicationContext實例時,可以讓該類實現ApplicationContextAware接口。 B:ApplicationEvent抽象類 當需要創(chuàng)建自定義事件時,可以新建一個繼承自ApplicationEvent抽象類的類。 C:ApplicationListener接口 當需要監(jiān)聽自定義事件時,可以新建一個實現ApplicationListener接口的類,并將該類配置到Spring容器中。 D:BeanNameAware接口 當bean需要獲取自身在容器中的id/name時,可以實現BeanNameAware接口。 E:InitializingBean接口 當需要在bean的全部屬性設置成功后做些特殊的處理,可以讓該bean實現InitializingBean接口。 效果等同于bean的init-method屬性的使用或者@PostContsuct注解的使用。 三種方式的執(zhí)行順序:先注解,然后執(zhí)行InitializingBean接口中定義的方法,最后執(zhí)行init-method屬性指定的方法。 F:DisposableBean接口 當需要在bean銷毀之前做些特殊的處理,可以讓該bean實現DisposableBean接口。 效果等同于bean的destroy-method屬性的使用或者@PreDestory注解的使用。 三種方式的執(zhí)行順序:先注解,然后執(zhí)行DisposableBean接口中定義的方法,最后執(zhí)行destroy-method屬性指定的方法。 G:BeanPostProcessor接口 當需要對受管bean進行預處理時,可以新建一個實現BeanPostProcessor接口的類,并將該類配置到Spring容器中。 H:BeanFactoryPostProcessor接口 當需要對Bean工廠進行預處理時,可以新建一個實現BeanFactoryPostProcessor接口的類,并將該類配置到Spring容器中。 spring事務的原理 事務管理的方式:編程型和聲明型,spring推薦使用后一種方式 聲明型事務管理的優(yōu)勢非常明顯:代碼中無需關于關注事務邏輯,讓Spring聲明式事務管理負責事務邏輯,聲明式事務管理無需與具體的事務邏輯耦 合,可以方便地在不同事務邏輯之間切換。 什么是IOC,什么又是DI,他們有什么區(qū)別依賴注入DI是一個程序設計模式和架構模型, 一些時候也稱作控制反轉,盡管在技術上來講,依賴注入是一個IOC的特殊實現,依賴注入是指一個對象應用另外一個對象來提供一個特殊的能力,例如:把一個 數據庫連接已參數的形式傳到一個對象的結構方法里面而不是在那個對象內部自行創(chuàng)建一個連接。控制反轉和依賴注入的基本思想就是把類的依賴從類內部轉化到外 部以減少依賴 應用控制反轉,對象在被創(chuàng)建的時候,由一個調控系統(tǒng)內所有對象的外界實體,將其所依賴的對象的引用,傳遞給它。也可以說,依賴被注入到對象中。所 以,控制反轉是,關于一個對象如何獲取他所依賴的對象的引用,這個責任的反轉。 Bean注入屬性的幾種方式 什么是aop,aop的作用是什么面向切面編程(AOP)提供另外一種角度來思考程序結構,通過這種方式彌補了面向對象編程(OOP)的不足,除了類(classes)以外,AOP提供了切面。切面對關注點進行模塊化,例如橫切多個類型和對象的事務管理 Spring的一個關鍵的組件就是AOP框架,可以自由選擇是否使用AOP 提供聲明式企業(yè)服務,特別是為了替代EJB聲明式服務。最重要的服務是聲明性事務管理,這個服務建立在Spring的抽象事物管理之上。允許用戶實現自定義切面,用AOP來完善OOP的使用,可以把Spring AOP看作是對Spring的一種增強 AOP里面重要的幾個名詞概念解釋切面(Aspect): 一個關注點的模塊化,這個關注點可能會橫切多個對象。事務管理是J2EE應用中一個關于橫切關注點的很好的例子。 在Spring AOP中,切面可以使用通用類(基于模式的風格) 或者在普通類中以@Aspect注解(@AspectJ風格)來實現。 連接點(Joinpoint): 在程序執(zhí)行過程中某個特定的點,比如某方法調用的時候或者處理異常的時候。 在Spring AOP中,一個連接點 總是 代表一個方法的執(zhí)行。 通過聲明一個org.aspectj.lang.JoinPoint類型的參數可以使通知(Advice)的主體部分獲得連接點信息。 通知(Advice): 在切面的某個特定的連接點(Joinpoint)上執(zhí)行的動作。通知有各種類型,其中包括“around”、“before”和“after”等通知。 通知的類型將在后面部分進行討論。許多AOP框架,包括Spring,都是以攔截器做通知模型, 并維護一個以連接點為中心的攔截器鏈。 切入點(Pointcut): 匹配連接點(Joinpoint)的斷言。通知和一個切入點表達式關聯(lián),并在滿足這個切入點的連接點上運行(例如,當執(zhí)行某個特定名稱的方法時)。 切入點表達式如何和連接點匹配是AOP的核心:Spring缺省使用AspectJ切入點語法。 引入(Introduction): (也被稱為內部類型聲明(inter-type declaration))。聲明額外的方法或者某個類型的字段。 Spring允許引入新的接口(以及一個對應的實現)到任何被代理的對象。 例如,你可以使用一個引入來使bean實現 IsModified 接口,以便簡化緩存機制。 目標對象(Target Object): 被一個或者多個切面(aspect)所通知(advise)的對象。也有人把它叫做 被通知(advised) 對象。 既然Spring AOP是通過運行時代理實現的,這個對象永遠是一個 被代理(proxied) 對象。 AOP代理(AOP Proxy): AOP框架創(chuàng)建的對象,用來實現切面契約(aspect contract)(包括通知方法執(zhí)行等功能)。 在Spring中,AOP代理可以是JDK動態(tài)代理或者CGLIB代理。 注意:Spring 2.0最新引入的基于模式(schema-based)風格和@AspectJ注解風格的切面聲明,對于使用這些風格的用戶來說,代理的創(chuàng)建是透明的。 織入(Weaving): 把切面(aspect)連接到其它的應用程序類型或者對象上,并創(chuàng)建一個被通知(advised)的對象。 這些可以在編譯時(例如使用AspectJ編譯器),類加載時和運行時完成。 Spring和其他純Java AOP框架一樣,在運行時完成織入。 通知的類型: 前置通知(Before advice): 在某連接點(join point)之前執(zhí)行的通知,但這個通知不能阻止連接點前的執(zhí)行(除非它拋出一個異常)。 返回后通知(After returning advice): 在某連接點(join point)正常完成后執(zhí)行的通知:例如,一個方法沒有拋出任何異常,正常返回。 拋出異常后通知(After throwing advice): 在方法拋出異常退出時執(zhí)行的通知。 后通知(After (finally) advice): 當某連接點退出的時候執(zhí)行的通知(不論是正常返回還是異常退出)。 環(huán)繞通知(Around Advice): 包圍一個連接點(join point)的通知,如方法調用。這是最強大的一種通知類型。 環(huán)繞通知可以在方法調用前后完成自定義的行為。它也會選擇是否繼續(xù)執(zhí)行連接點或直接返回它們自己的返回值或拋出異常來結束執(zhí)行。 環(huán)繞通知是最常用的一種通知類型。大部分基于攔截的AOP框架,例如Nanning和JBoss4,都只提供環(huán)繞通知。 切入點(pointcut)和連接點(join point)匹配的概念是AOP的關鍵,這使得AOP不同于其它僅僅提供攔截功能的舊技術。 切入點使得定位通知(advice)可獨立于OO層次。 例如,一個提供聲明式事務管理的around通知可以被應用到一組橫跨多個對象中的方法上(例如服務層的所有業(yè)務操作)。 請介紹一下Spring框架中Bean的生命周期和作用域(1) 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() 方法)時都會創(chuàng)建一個新的bean實例。根據經驗,對所有有狀態(tài)的bean應該使用prototype作用域,而對無狀態(tài)的bean則應該使用 singleton作用域 request 在一次HTTP請求中,一個bean定義對應一個實例;即每次HTTP請求將會有各自的bean實例, 它們依據某個bean定義創(chuàng)建而成。該作用 域僅在基于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屬性: 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的事務管理事務就是對一系列的數據庫操作(比如插入多條數據)進行統(tǒng)一的提交或回滾操作,如果插入成功,那么一起成功,如果中間有一條出現異常,那么回滾之 前的所有操作。 這樣可以防止出現臟數據,防止數據庫數據出現問題。 開發(fā)中為了避免這種情況一般都會進行事務管理。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的動態(tài)代理 能夠自動的提交和回滾事務 org.springframework.transaction.interceptor.TransactionProxyFactoryBean PROPAGATION_REQUIRED–支持當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。 PROPAGATION_SUPPORTS–支持當前事務,如果當前沒有事務,就以非事務方式執(zhí)行。 PROPAGATION_MANDATORY–支持當前事務,如果當前沒有事務,就拋出異常。 PROPAGATION_REQUIRES_NEW–新建事務,如果當前存在事務,把當前事務掛起。 PROPAGATION_NOT_SUPPORTED–以非事務方式執(zhí)行操作,如果當前存在事務,就把當前事務掛起。 PROPAGATION_NEVER–以非事務方式執(zhí)行,如果當前存在事務,則拋出異常。 PROPAGATION_NESTED–如果當前存在事務,則在嵌套事務內執(zhí)行。如果當前沒有事務,則進行與 PROPAGATION_REQUIRED類似的操作。 在此我向大家推薦一個架構學習交流群。交流學習群號:575745314 里面會分享一些資深架構師錄制的視頻錄像:有Spring,MyBatis,Netty源碼分析,高并發(fā)、高性能、分布式、微服務架構的原理,JVM性能優(yōu)化、分布式架構等這些成為架構師必備的知識體系。還能領取免費的學習資源,目前受益良多 為什么要有事務傳播行為Spring里面如何配置數據庫驅動使用”org.springframework.jdbc.datasource.DriverManagerDataSource”數據源來配置數據庫驅動。示例如下:
Spring里面applicationContext.xml文件能不能改成其他文件名ContextLoaderListener是一個ServletContextListener, 它在你的web應用啟動的時候初始化。缺省情況下, 它會在WEB-INF/applicationContext.xml文件找Spring的配置。 你可以通過定義一個元素名字為”contextConfigLocation”來改變Spring配置文件的 位置。示例如下:
如何在web應用里面配置spring在web.xml中加入如下同容,在啟動web服務器時加載/WEB-INF/applicationContext.xml中的內容。 通過如下類得到ApplicationContext實例 WebApplicationContextUtils.getWebApplicationContext Spring里面如何定義hibernate mapping添加hibernate mapping 文件到web/WEB-INF目錄下的applicationContext.xml文件里面。示例如下:
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接口 3. 常用的獲取ApplicationContext的方法: FileSystemXmlApplicationContext:從文件系統(tǒng)或者url指定的xml配置文件創(chuàng)建,參數為配置文件名或文件名數 組 ClassPathXmlApplicationContext:從classpath的xml配置文件創(chuàng)建,可以從jar包中讀取配置文件 WebApplicationContextUtils:從web應用的根目錄讀取配置文件,需要先在web.xml中配置,可以配置監(jiān)聽器或者 servlet來實現 這兩種方式都默認配置文件為web-inf/applicationContext.xml,也可使用context-param指定配置文件 BeanFactory 接口 和 ApplicationContext 接口區(qū)別* ApplicationContext 接口繼承 BeanFactory 接口 ,Spring核心工廠是BeanFactory ,BeanFactory 采取延遲加載,第一次getBean時才會初始化Bean , ApplicationContext 是會在加載配置文件時初始化Bean * ApplicationContext是對BeanFactory擴展 國際化處理 事件傳遞 Bean自動裝配 各種不同應用層的Context實現 開發(fā)中基本都在使用ApplicationContext, web項目使用WebApplicationContext ,很少用到BeanFactory BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource('applicationContext.xml')); IHelloService helloService = (IHelloService) beanFactory.getBean('helloService'); helloService.sayHello(); 如何在web環(huán)境中配置applicationContext.xml文件
如何在spring中實現國際化在applicationContext.xml加載一個bean ? 在src目錄下建多個properties文件 ? 對于非英文的要用native2ascii -encoding gb2312 源 目轉化文件相關內容 ? 其命名格式是message_語言_國家。 ? 頁面中的中顯示提示信息,鍵名取鍵值。 ? 當給定國家,系統(tǒng)會自動加載對應的國家的properties信息。 ? 通過applictionContext.getMessage(“鍵名”,”參數”,”區(qū)域”)取出相關的信息。 Spring如何處理線程并發(fā)問題Spring使用ThreadLocal解決線程安全問題 我們知道在一般情況下,只有無狀態(tài)的Bean才可以在多線程環(huán)境下共享,在Spring中,絕大部分Bean都可以聲明為singleton作用域。就是因為Spring對一些Bean(如RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder等)中非線程安全狀態(tài)采用ThreadLocal進行處理,讓它們也成為線程安全的狀態(tài),因為有狀態(tài)的Bean就可以在多線程中共享了。 ThreadLocal和線程同步機制都是為了解決多線程中相同變量的訪問沖突問題。 在同步機制中,通過對象的鎖機制保證同一時間只有一個線程訪問變量。這時該變量是多個線程共享的,使用同步機制要求程序慎密地分析什么時候對變量進行讀寫,什么時候需要鎖定某個對象,什么時候釋放對象鎖等繁雜的問題,程序設計和編寫難度相對較大。 而ThreadLocal則從另一個角度來解決多線程的并發(fā)訪問。ThreadLocal會為每一個線程提供一個獨立的變量副本,從而隔離了多個線程對數據的訪問沖突。因為每一個線程都擁有自己的變量副本,從而也就沒有必要對該變量進行同步了。ThreadLocal提供了線程安全的共享對象,在編寫多線程代碼時,可以把不安全的變量封裝進ThreadLocal。 由于ThreadLocal中可以持有任何類型的對象,低版本JDK所提供的get()返回的是Object對象,需要強制類型轉換。但JDK5.0通過泛型很好的解決了這個問題,在一定程度地簡化ThreadLocal的使用。 概括起來說,對于多線程資源共享的問題,同步機制采用了“以時間換空間”的方式,而ThreadLocal采用了“以空間換時間”的方式。前者僅提供一份變量,讓不同的線程排隊訪問,而后者為每一個線程都提供了一份變量,因此可以同時訪問而互不影響。 在此我向大家推薦一個架構學習交流群。交流學習群號:575745314 里面會分享一些資深架構師錄制的視頻錄像:有Spring,MyBatis,Netty源碼分析,高并發(fā)、高性能、分布式、微服務架構的原理,JVM性能優(yōu)化、分布式架構等這些成為架構師必備的知識體系。還能領取免費的學習資源,目前受益良多 簡單敘述一下Spring 中BeanFactory與ApplicationContext的差別使用 BeanFactory 從 xml配置文件加載bean: 簡而言之,BeanFactory 提供了配置框架和基本的功能, 而ApplicationContext 為它增加了更強的功能,這些功能中的一些或許更加接近J2EE 并且圍繞企業(yè)級應用。一般來說,ApplicationContext是 BeanFactory 的完全超集, 任何 BeanFactory 功能和行為的描述也同樣被認為適用于ApplicationContext 相對于 BeanFactory 而言,ApplicationContext 提供了以下擴展功能. (a) 國際化支持 (b) 資源訪問 (c) 事件傳播 (d) 多實例加載 |
|