Spring知識點總結
1. 簡介一下Spring框架。
答:Spring框架是一個開源的容器性質的輕量級框架。主要有三大特色:容器、IOC(控制反轉)、AOP(面向切面編程)。前端
2. Spring框架有哪些優勢?談談你的見解。
答:Spring框架主要有三大優勢:java
(1) 容器。Spring框架是一個容器,可以管理項目中的全部對象。程序員
(2) IOC(控制反轉)。Spring將建立對象的方式反轉了,從程序員本身建立反轉給了程序。web
(3) AOP(面向切面)。面向切面編程,簡而言之,就是將縱向重複的代碼橫向抽取出來。Spring框架應用了面向切面的思想,主要體如今爲容器中管理的對象生成動態代理對象。面試
3. 什麼是IOC?
答:IOC:控制反轉,指得是將對象的建立權反轉給Spring。做用是實現了程序的解耦合。spring
4. 什麼是DI?
答:DI:依賴注入,須要有IOC環境,在Spring建立Bean對象時,動態的將依賴對象注入到Bean對象中去。依賴注入最大的好處就是解耦合。數據庫
5. 你對Spring框架中的BeanFactory接口和ApplicationContext接口有什麼理解?兩者有什麼區別?
答:BeanFactory接口是Spring框架的頂層接口,是最原始的接口,經過new (BeanFactory的實現類)來啓動Spring容器時,並不會建立Spring容器裏面的對象,只有在每次經過getBean()得到對象時纔會建立。編程
ApplicationContext接口是用來替代BeanFactory接口的,經過new (ApplicationContext接口的實現類)ClassPathXmlApplicationContext來啓動Spring容器時,就會建立容器中配置的全部對象。數組
6. Spring中的工廠容器有哪兩個,它們的區別是什麼?
答:BeanFactory和ApplicationContext。session
BeanFactory接口是Spring框架的頂層接口,是最原始的接口,ApplicationContext是對BeanFactory擴展,BeanFactory在第一次getBean時纔會初始化Bean, ApplicationContext是會在加載配置文件時初始化Bean。
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml")); IHelloService helloService = (IHelloService) beanFactory.getBean("helloService"); helloService.sayHello();
咱們剛開始學習用spring建立Bean對象的時候,最早學的是經過配置<Bean>標籤的形式,這一塊有不少的知識點須要咱們掌握。
7. 談談你對Spring容器中Bean標籤的理解。
答:Bean標籤用來描述Spring容器管理的對象。
假若有一個User對象,須要交給Spring容器來管理,這樣就須要在Spring容器的主配置文件中經過Bean標籤來描述該對象。Bean標籤常見的屬性有如下幾個:
name屬性:給被管理的對象起個名稱,得到對象時要根據該名稱來得到。
class屬性:被管理對象的完整類名。
scope屬性:scope屬性常見的有兩個屬性值,singleton和prototype,這兩個屬性值用 來指定建立對象時是單例仍是多例,默認爲singleton(單例),但在整合整合struts2 時,ActionBean必須配置爲多例的.
8. Spring經過配置<bean>標籤來生成Bean對象有哪三種方式?
答:空參構造方式、靜態工廠方式和實例工廠方式。通常都只會用空參構造方式。
以下:
<bean id="bean1" class="cn.itcast.spring.b_instance.Bean1"></bean>
9. Spring框架中屬性注入有哪幾種方式:
答:Spring中的輸入注入方式包括set方法注入、構造函數注入、p名稱空間注入、spel注入,除此以外,還包括複雜方式注入,如數組、List、Map、Properties等屬性的注入。
10. 簡述一下bean的生命週期?
答:bean的生命週期包括bean的定義、bean的初始化、bean的調用和bean的銷燬。
在配置文件裏面經過<bean></bean>來完成bean的定義,經過配置init-method屬性來完成bean的初始化,經過獲得bean的實例對象來完成bean的調用,經過配置destory-method屬性來完成bean的銷燬。
11. 簡述一下bean的做用域?
答:bean有5種做用域,分別是singleton(單例,默認)、prototype(默認)、request、session、globalSession。
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情形下有效。
以上講了Spring容器的常見配置,好比向Spring容器中註冊一個對象,須要在Spring的主配置文件中用Bean標籤來描述該對象,在實際開發中,一個項目中會有特別多的對象,若是都用Bean標籤來配置,未免太過麻煩了。基於此,Spring容器爲咱們提供了註解的概念,用註解來代替配置。
12. 如何使用Spring中的註解?
答:在使用註解以前,要先在spring的主配置文件中經過Context:component-scan標籤來開啓使用註解的開關。
13. 用註解將對象註冊到Spring容器當中,有幾種註解方式?它們有什麼區別嗎?
答:4種。
分別是:@Component()、@Service()、@Controller()、@Respository()。Spring框架最先出現的只有@Component()註解,但若是全部的對象都使用同一個註解,很難區分對象究竟屬於哪一層架構。基於此,Spring又推出了@Service()、@Controller()、@Respository()三種註解,用於區分對象屬於哪一層架構。但4種註解方式從功能上來講沒有任何區別。
14. Spring框架中,什麼註解能夠用來指定對象的做用範圍?
答:@Scope(scopeName=」singleton」)。
15. 如何用註解的方式來完成屬性注入?
答:按類型分能夠分爲值類型注入和引用類型注入。
值類型注入能夠經過@Value()註解來完成,該註解既能夠聲明在屬性上,也能夠聲明在方法上,建議聲明在方法上,可是更多的人會聲明在屬性上,由於更方便。
引用類型注入能夠經過三種註解方式來完成,分別爲:@Autowired、@Autowired和@Qualifier()兩者結合、@Resource()。建議使用@Resource(),可是通常我都會用@Autowired。
Spring中的AOP
1. 爲何叫springAOP呢?
Spring能夠爲全部service層的類生成動態代理對象,告訴spring,爲每個service層的類裏面的方法添加管理事務的代碼,spring一聽,是!這樣咱們叫能夠只寫一遍管理事務的代碼,就爲全部的service就都加上了管理事務的代碼。這樣一來,aop思想就體現出來了。SpringAOP的本質就是幫咱們生成動態代理對象。
2. Spring怎麼實現AOP的原理?
答:JDK動態代理和cglib代理。
JDK動態代理有缺陷,就是被代理對象必須實現接口才能產生代理對象,若是沒有接口,就不能使用動態代理技術。咱們用spring容器來實現動態代理,假如要管理的對象沒有實現接口,那麼就不能產生代理對象了。爲了讓全部的對象都能產生動態代理對象,Spring又融入了第三方代理技術cglib代理。Cglib能夠對任何類生成代理對象,它的原理是對目標對象進行繼承代理,若是目標對象被final修飾,那麼該類沒法被cglib代理。
3. 那麼Spring到底使用的是JDK代理,仍是cglib代理呢?
答:混合使用。若是被代理對象實現了接口,就優先使用JDK代理,若是沒有實現接口,就用用cglib代理。
4. aop名詞學習
Joinpoint(鏈接點):目標對象中,全部能夠加強的方法
Pointcut(切入點):目標對象,已經加強的方法。
Advice(通知/加強):加強的代碼
Target(目標對象):被代理對象
Weaving(織入):將通知應用到切入點的過程
Proxy(代理):將通知織入目標對象以後,造成代理對象
5. 談談你對AOP的理解。
答:AOP,面向切面編程。簡單來說就是將縱向重複的代碼,橫向抽取出來。
很明顯的一個體現就是在Filter過濾器中。在沒有Filter以前,解決servlet的亂碼問題是很複雜的,每次在接收請求以前,都要寫句代碼來解決亂碼問題,即:request.setCharacterEncoding(「UTF-8」),只要寫一個servlet,就是寫這句代碼來解決亂碼問題。直到有一天,Filter出現了。咱們把解決亂碼的那句代碼放到Filter中去,今後在servlet中,就不再用重複寫那句代碼了。從架構上來講,Filter解決亂碼的事架在了全部的servlet上,這樣一來,切面就造成了。
面向切面編程的思想,還有一個直接的體現就是在攔截器中。(後面待補充)
6. Spring中的AOP思想靠什麼來體現的呢?
答:Spring中的AOP思想體如今可以爲容器中管理的對象生成動態代理對象。
之前咱們要使用動態代理,咱們須要本身調用下面的方法:
Proxy.newProxyInstance(xx,xx,xx);
生成代理對象。
7. Spring切面能夠應用5種類型的通知,哪5種?
答:前置通知(Before)、後置通知(After,在方法完成以後調用通知,不管方法執行是否成功)、後置通知(After-returning,在方法成功執行以後調用通知)、異常通知(After-throwing,在方法拋出異常後調用通知)、環繞通知(Around,在目標方法以前以後都調用)。
8. Spring中應用aop,須要哪些步驟?
答:(1)導包
(2)準備目標對象
(3)準備通知
(4)將通知織入目標對象中
Spring中配置aop實際上主要配的是第四步——將通知織入目標對象中。有兩種方式,一種是xml配置方式,一種是註解配置方式。
先看xml配置方式:
再看註解配置方式:
9. Spring AOP的實現方式有哪些?
答:一、經典的基於代理的AOP:使用Java代碼實現,編寫Advice、PointCut,而後提供給Advisor使用。開啓自動代理後,便可在applicationContext中得到加強後的bean。
二、@AspectJ註解驅動的切面:基於註解的開發(推薦使用),在項目中須要開啓AOP自動代理<aop:aspectj-autoproxy/>。
三、XML Schema方式:須要實現相應的加強接口,如BeforeAdvice、AfterAdvice等。而後利用一下配置如:
ofo面試題:aop機制,實現,具體怎樣使用,具體到標籤?
答: AOP,面向切面編程,是對OOP(面向對象編程)的補充和完善,簡單來說就是將縱向重複的代碼,橫向抽取出來。最明顯的體現就是過濾器和攔截器的使用。
Spring實現AOP的本質是動態代理,Spring採用兩種動態代理的方式,分別是JDK動態代理和cglib動態代理。JDK動態代理的被代理對象必須實現接口,而cglib動態代理的被代理對象原則上能夠是任何類,cglib實現動態代理的原理是對被代理對象進行繼承,重寫被代理對象中全部的方法,因此被代理對象不能被final修飾。
Spring操做AOP,具體可分爲4步。1.導包;2,準備目標對象;3.準備通知;4,將通知織入目標對象。其中2(準備目標對象)和3(準備通知)由java代碼實現,4(將通知織入目標對象)有兩種實現方式,一種是xml配置,一種是註解配置。其中,xml配置用的標籤有<aop:config>、<aop:pointcut>、<aop:aspect>、<aop:before>、<aop:after-returning>、<aop:around>、<aop:after-throwing>、<aop:after>。註解配置用到的註解有:@Aspect、@Pointcut、@Before、@AfterReturning、@Around、@AfterThrowing、@After。
ofo面試題:Spring切面能夠應用5種類型的通知,哪5種?
答:前置通知(Before)、後置通知(After-returning,在方法成功執行以後調用通知)、環繞通知(Around,在目標方法以前以後都調用)、異常通知(After-throwing,在方法拋出異常後調用通知)、後置通知(After,在方法完成以後調用通知,不管方法執行是否成功)。
Spring中的事務管理
1. 簡單介紹一下Spring中的事務管理。
答:事務就是對一系列的數據庫操做(好比插入多條數據)進行統一的提交或回滾操做,若是插入成功,那麼一塊兒成功,若是中間有一條出現異常,那麼回滾以前的全部操做。這樣能夠防止出現髒數據,防止數據庫數據出現問題。
現實世界中最多見的事務例子可能就是轉帳了。
2. 事務的4個特性?
答:ACID。
原子性(Atomic):事務是由一個或多個活動所組成的一個工做單元。原子確保事務中的全部操做所有發生或所有不發生。若是全部的活動都成功了,事務也就成功了。若是任意一個活動失敗了,整個事務也失敗並回滾。
一致性(Consistent):一旦事務完成(無論成功仍是失敗),系統必須確保它所建模的業務處於一致的狀態。現實的數據不該該被損壞。
隔離性(Isolated):事務容許多個用戶對相同的數據進行操做,每一個用戶的操做不會與其餘用戶糾纏在一塊兒。所以,事務應該被彼此隔離,避免發生同步讀寫相同數據的事情(注意的是,隔離性每每涉及到鎖定數據庫中的行或表)。
持久性(Durable):一旦事務完成,事務的結果應該持久化,這樣就能從任何的系統崩潰中恢復過來。這通常會涉及將結果存儲到數據庫或其餘形式的持久化存儲中。
3. 如何在Spring的核心配置文件applicationContext.xml中配置事務
主要配置三大方面:事務管理器、事務通知和定義事務性切面。
代碼以下:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd"> <!-- 事務管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!-- 數據源 --> <property name="dataSource" ref="dataSource" /> </bean> <!-- 事務通知 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <!-- 傳播行爲 --> <tx:method name="save*" propagation="REQUIRED" /> <tx:method name="insert*" propagation="REQUIRED" /> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="create*" propagation="REQUIRED" /> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="find*" propagation="SUPPORTS" read-only="true" /> <tx:method name="select*" propagation="SUPPORTS" read-only="true" /> <tx:method name="get*" propagation="SUPPORTS" read-only="true" /> </tx:attributes> </tx:advice> <!-- 定義事務性切面 --> <aop:config> <aop:advisor advice-ref="txAdvice" pointcut="execution(* cn.e3mall.service..*.*(..))" /> </aop:config> </beans>
4. 操做事務的方法
操做事務的方法通常就三種:開啓事務、提交事務、回滾事務。針對這三個方法,JDBC、Hibernate、Mybatis等都有不一樣的實現方式。由於在不一樣平臺、操做事務的代碼各不相同。爲此,Spring提供了一個接口PlatformTransactionManager,針對不一樣的操做平臺提供不一樣的實現類。比方說,若是是JDBC和iBatis,實現類是DataSourceTransactionManager,若是是Hibernate,實現類是HibernateTransactionManager。不一樣的實現類就是不一樣的事務管理器,爲了使用事務管理器,你須要將其聲明在應用程序上下文中。
若是在應用程序中你直接使用JDBC/iBatis來進行持久化,DataSourceTransactionManager會爲你處理事務邊界。爲了使用DataSourceTransactionManager,你須要使用以下的XML將其裝配到應用程序的上下文定義中:
<!-- 事務管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!-- 數據源 --> <property name="dataSource" ref="dataSource" /> </bean>
若是應用程序的持久化是經過Hibernate實現的,那麼你須要使用HibernateTransactionManager,你須要使用以下的XML將其裝配到應用程序的上下文定義中:
<!-- 事務管理器 --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <!-- 數據源 --> <property name="dataSource" ref="dataSource" /> </bean>
當配置好事務管理器以後,在spring中具體配置事務時,又有兩種選擇:一種是編碼事務(瞭解),一種是聲明式事務。聲明式事務是經過事務屬性來定義的,具體的說,是經過傳播行爲、隔離級別、只讀提示、事務超時及回滾規則來進行定義的。
5. 事務的傳播行爲指什麼?
答:在業務(service)方法之間平行調用時,如何來處理事務的問題。
6. Spring中定義事務傳播行爲的屬性有幾種,分別是什麼?
答:7種。分別是REQUIRED、REQUIRES_NEW、SUPPORTS、NOT_SUPPORTED、MANDATORY、NESTED、NEVER。咱們經常使用的是propagation=」REQUIRED」,默認的就是REQUIRED,指得是支持當前事務,若是不存在,就新建一個(默認),因此這個屬性不用配置。其他6個屬性幾乎不用。
7. 事務中可能會出現的併發問題有哪些?
答:髒讀、不可重複讀、幻讀。
解決併發問題的方法就是設置隔離級別。
在理想狀況下,事務之間是徹底隔離的,從而能夠防止這些問題發生,可是徹底隔離會致使性能問題,由於它一般會涉及鎖定數據庫中的記錄,侵佔性的鎖定會阻礙併發性,要求事務互相等待以完成各自的工做。 考慮到徹底的隔離會致使性能問題,並且並非全部的應用程序都須要徹底的隔離,因此有時應用程序須要在事務隔離上有必定的靈活性。所以就會有各類隔離級別。
8. 事務中有幾種隔離級別呢?
答:4種。讀未提交(uncommitted)、讀已提交(committed)、可重複讀(repeatable_read)、串行化(serializable)。
讀未提交(uncommitted):容許讀取還沒有提交的數據變動。可能會致使髒讀、幻讀或不可重複讀。
讀已提交(committed):容許讀取併發事務已經提交的數據。能夠阻止髒讀、可是幻讀或不可重複讀仍有可能發生。
可重複讀(repeatable_read):能夠阻止髒讀和不可重複讀,但可能會致使幻讀。
串行化(serializable):徹底服從ACID的隔離級別,確保阻止髒讀、不可重複讀以及幻讀。這是最慢的事務隔離級別,由於它一般是經過徹底鎖定事務相關的數據庫表來實現的。
10. 解釋一下事務超時和回滾規則
11. 基於在5大事務屬性,就能夠在XML中定義事務了。
代碼以下:
<!-- 事務通知 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <!-- 傳播行爲 --> <tx:method name="save*" propagation="REQUIRED" /> <tx:method name="insert*" propagation="REQUIRED" /> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="create*" propagation="REQUIRED" /> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="find*" propagation="SUPPORTS" read-only="true" /> <tx:method name="select*" propagation="SUPPORTS" read-only="true" /> <tx:method name="get*" propagation="SUPPORTS" read-only="true" /> </tx:attributes> </tx:advice>
<tx:advice>只是定義了AOP通知,用於把事務邊界通知給方法,可是這只是事務通知,而不是完整的事務性切面。咱們在<tx:advice>中沒有聲明哪些Bean應該被通知——咱們須要一個切點來作這件事,爲了完整定義事務切面,咱們必須定義一個通知器(advisor)。
這就涉及aop命名空間了。如下的XML定義了一個通知器,它使用txAdvice通知全部實現SpitterService接口的Bean,代碼以下:
<!-- 定義事務性切面 --> <aop:config> <aop:advisor advice-ref="txAdvice" pointcut="execution(* cn.e3mall.service..*.*(..))" /> </aop:config>
<tx:advice>配置元素極大地簡化了Spring聲明式事務所須要的XML,若是我告訴你它甚至能夠進一步簡化,你會感覺如何呢?若是我再告訴你,你只須要在Spring上下文中添加一行XML,便可聲明事務,你的感覺如何呢?這就是用註解的方式來配置事務。
Spring整合SSM
1.使用Spring整合SSM框架,須要配置哪些東西?簡單說一下。
答:Spring整合Dao,要配置數據庫啓動,配置SqlSessionFactory,配置Mapper動態代理。
Spring整合Service,要配置包掃描器(開啓註解驅動),要配置事務管理(事務管理器,事務通知,事務切面)。
Spring整合Web,要配置包掃描器(掃描Controller),配置處理器映射器和處理器適配器(採用註解驅動的方法),配置視圖解析器。
在web.xml,要加載Spring容器,而且要配置一個springMVC的前端控制器。
2.Spring的配置有哪些?簡單說一下。(ofo面試)
答:Spring整合Dao,要配置數據庫啓動,配置SqlSessionFactory,配置Mapper動態代理。
Spring整合Service,要配置包掃描器(開啓註解驅動),要配置事務管理(事務管理器,事務通知,事務切面)。
Spring整合Web,要配置包掃描器(掃描Controller),配置處理器映射器和處理器適配器(採用註解驅動的方法),配置視圖解析器。
在web.xml,要加載Spring容器,而且要配置一個springMVC的前端控制器。
3.Spring平時主要用到的東西有哪些?(ofo面試)
答:控制反轉(IOC)、依賴注入(DI)、屬性注入、事務管理、面向切面編程(AOP)等。
文章轉載至:https://blog.csdn.net/lz1170063911/article/details/79836830