spring知識點概述

阿木俠發表於2017-05-15

什麼是spring?

Spring是一個從實際專案開發經驗中抽取的,可高度重用的應用框架。
Spring是一個輕量級容器,它所帶的包裝器使許多不同的服務和框架更易於使用。輕量級容器接受任何JavaBean,而不是隻接受特定型別的元件。

spring框架結構組成

spring框架各個模組介紹

Spring Core:核心容器提供 Spring 框架的基本功能。核心容器的主要元件是 BeanFactory,它是工廠模式的實現。
BeanFactory 使用控制反轉 (IOC) 模式將應用程式的配置和依賴性規範與實際的應用程式程式碼分開。

Context:Spring 上下文是一個配置檔案,向 Spring 框架提供上下文資訊。Spring 上下文包括企業服務,例如 JNDI、EJB、電子郵件、國際化、校驗和排程功能。

Spring AOP:通過配置管理特性,Spring AOP 模組直接將面向方面的程式設計功能整合到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何物件支援 AOP。Spring AOP 模組為基於 Spring 的應用程式中的物件提供了事務管理服務。通過使用 Spring AOP,不用依賴 EJB 元件,就可以將宣告性事務管理整合到應用程式中。

Spring DAO:JDBC DAO 抽象層提供了有意義的異常層次結構,可用該結構來管理異常處理和不同資料庫供應商丟擲的錯誤訊息。異常層次結構簡化了錯誤處理,並且極大地降低了需要編寫的異常程式碼數量(例如開啟和關閉連線)。Spring DAO 的面向 JDBC 的異常遵從通用的 DAO 異常層次結構。

Spring ORM:Spring 框架插入了若干個 ORM 框架,從而提供了 ORM 的物件關係工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有這些都遵從 Spring 的通用事務和 DAO 異常層次結構。

Spring Web :Web 上下文模組建立在應用程式上下文模組之上,為基於 Web 的應用程式提供了上下文。所以,Spring 框架支援與 Jakarta Struts 的整合。Web 模組還簡化了處理多部分請求以及將請求引數繫結到域物件的工作。

Spring MVC
MVC 框架是一個全功能的構建 Web 應用程式的 MVC 實現。通過策略介面,MVC 框架變成為高度可配置的,MVC 容納了大量檢視技術,其中包括 JSP、Velocity、Tiles、iText 和 POI。

spring的實現

1,採用了IoC使程式碼對Spring的依賴減少 ,
2,Spring將管理的Bean作為POJO(Plain Old Java Object)進行控制 
3,Spring的元件就是普通的Java Bean ,
4,單元測試可以不再依賴容器 
5,元件的初始化和管理均由Spring完成 ,
6,配置檔案中宣告各種關係

兩種spring容器型別:

1. BeanFactory:(org.springframework.beans.factory.BeanFactory介面定義)是最簡答的容器,提供了基本的DI支援。最常用的BeanFactory實現就是XmlBeanFactory類,它根據XML檔案中的定義載入beans,該容器從XML檔案讀取配置後設資料並用它去建立一個完全配置的系統或應用。 

2. ApplicationContext應用上下文:(org.springframework.context.ApplicationContext)基於BeanFactory之上構建,並提供面向應用的服務。

spring的核心:控制反轉 (IOC)和麵向切面(AOP)

IOC提煉

Inversion of Control, 一般分為兩種型別:依賴注入DI(Dependency Injection)和依賴查詢(Dependency Lookup).依賴注入應用比較廣泛。
Spring IOC負責建立物件,管理物件(DI),裝配物件,配置物件,並且管理這些物件的整個生命週期。
優點:把應用的程式碼量降到最低。容器測試,最小的代價和最小的侵入性使鬆散耦合得以實現。IOC容器支援載入服務時的餓漢式初始化和懶載入。 
DI依賴注入是IOC的一個方面,是個通常的概念,它有多種解釋。這概念是說你不用床架物件,而只需要描述它如何被建立。你不在程式碼裡直接組裝你的元件和服務,但是要在配置檔案裡描述元件需要哪些服務,之後一個IOC容器輔助把他們組裝起來。 
IOC的注入方式:1. 構造器依賴注入;2. Setter方法注入。

AOP提煉

切面(aspect):一個關注點的模組化,這個關注點可能會橫切多個物件。事務管理是J2EE應用中一個關於橫切關注點的很好的例子。
連線點(Joinpoint):程式執行過程中某個特定的點,比如某方法呼叫的時候或者處理異常的時候。在Spring AOP中,一個連線點總是表示一個方法的執行。
通知(advice):在切面的某個特定的連線點上執行的動作。其中包括了“around”、“before”和“after”等不同型別的通知。
切入點(Pointcut):匹配連線點的斷言。通知和一個切入點表示式關聯,並在滿足這個切入點的連線點上執行(例如,當執行某個特定名稱的方法時)。切入點表示式如何和連線點匹配,是AOP的核心。
引入(introduction):為類新增新方法和屬性。
目標物件(Target Object): 被一個或者多個切面所通知的物件。也被稱做被通知(advised)物件。
AOP代理(AOP Proxy):AOP框架建立的物件,用來實現切面契約(例如通知方法執行等等)。
織入(Weaving):把切面連線到其它的應用程式型別或者物件上,並建立一個被通知的物件。這些可以在編譯時(例如使用AspectJ編譯器),類載入時和執行時完成。

Bean的生命週期

1,建立Bean的例項(factory-method, autowireConstrutor) 
2),屬性注入(autowireByName, autowireByType) 
3,初始化Bean 
a,啟用Aware方法:(invokeAwaresMethods)Spring中提供了一些Aware相關介面,比如BeanNameAware, BeanFactoryAware, ApplicationContextAware等,實現這些Aware介面的bean在被初始化之後,可以取得一些相對應的資源。

private void invokeAwareMethods(final String beanName, final Object bean){
    if(bean instanceof Aware)
    {
        if(bean instanceof BeanNameAware){
            ((BeanNameAware) bean).setBeanName(beanName);
        }
        if(bean instanceof BeanClassLoaderAware){
            ((BeanClassLoaderAware) bean).setBeanClassLoader(getBeanClassLoader());
        }
        if(bean instanceof BeanFactoryAware){
            ((BeanFactoryAware) bean).setBeanFactory(AbstactAutowire CapableBeanFactory.this);
        }
    }
}
b,處理器的應用(BeanPostProcessor介面):呼叫客戶自定義初始化方法前以及呼叫自定義初始化方法後分別會呼叫BeanPostProcessor的postProcessBeforeInitialization和postProcessAfterInitialization方法,使使用者可以根據自己的業務需求進行響應的處理。 
c, 啟用自定義的init方法(init-method & 自定義實現InitializingBean介面)
protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinetion mbd){
    if(System.getSecurityManager() != null){
        AccessController.doPrivileged(new PrivilegedAction<Object>(){
            @Override
            public Object run()
            {
                invokeAwareMethods(beanName,bean);
                return null;
            }
        });
    }
    else{
       
        invokeAwareMethods(beanName,bean);
    }

    Object wrappedBean = bean;
    if(mbd == null !! !mbd.isSynthetic()){
        wrappedBean = applyBeanPostProcessorsBeforeInitialization(wappedBean,beanName);
    }
    try{
        invokeInitMethods(beanName, wappedBean, mbd);
    }
    catch(Throwable ex){
        throw new BeanCreationException((mbd != null ? mbd.getResourceDescription():null),beanName,"Invocation of init method failed",ex);
    }
    if(mbd == null || !mbd.isSynthetic()){
        wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
    }
    return wappedBean;
}
d,使用Bean。 駐留在應用的上下文中,直到該應用上下文被銷燬。 
e,銷燬(destory-mthod & 實現DisposableBean介面)


springMVC工作流程

1.          

使用者向伺服器傳送請求,請求被Spring 前端控制Servelt DispatcherServlet捕獲

2.

DispatcherServlet對請求URL進行解析,得到請求資源識別符號(URI)。然後根據該URI,呼叫HandlerMapping獲得該Handler配置的所有相關的物件(包括Handler物件以及Handler物件對應的攔截器),最後以HandlerExecutionChain物件的形式返回

3.

DispatcherServlet 根據獲得的Handler,選擇一個合適的HandlerAdapter。(附註:如果成功獲得HandlerAdapter後,此時將開始執行攔截器的preHandler(...)方法)

4.

提取Request中的模型資料,填充Handler入參,開始執行Handler(Controller)。 在填充Handler的入參過程中,根據你的配置,Spring將幫你做一些額外的工作:

      HttpMessageConveter: 將請求訊息(如Json、xml等資料)轉換成一個物件,將物件轉換為指定的響應資訊

      資料轉換:對請求訊息進行資料轉換。如String轉換成Integer、Double等

      資料根式化:對請求訊息進行資料格式化。 如將字串轉換成格式化數字或格式化日期等

      資料驗證: 驗證資料的有效性(長度、格式等),驗證結果儲存到BindingResult或Error中

5.

Handler執行完成後,向DispatcherServlet 返回一個ModelAndView物件

6.

根據返回的ModelAndView,選擇一個適合的ViewResolver(必須是已經註冊到Spring容器中的ViewResolver)返回給DispatcherServlet

7.

ViewResolver 結合Model和View,來渲染檢視,並將渲染結果返回給客戶端


1,Spring依賴注入的兩種方式(根據例項解):
http://blog.csdn.net/weixin_36380516/article/details/72301260

http://blog.csdn.net/weixin_36380516/article/details/72354668


3,spring框架中Bean的基本屬性及呼叫外部properties等配置檔案的方法介紹:

http://blog.csdn.net/weixin_36380516/article/details/72426357

4,Spring AOP中的前置通知和後置通知詳解
http://blog.csdn.net/weixin_36380516/article/details/72551678

更新於05/17,持續更新...

5, spring中定時器的使用:
http://blog.csdn.net/weixin_36380516/article/details/72596834

6,spring所有開源專案(github):
https://github.com/spring-projects

7,spring官方文件:
http://spring.io/docs/reference

更新於05/24,持續更新...

8,Spring整合Struts2和Hibernate的Demo:
http://blog.csdn.net/weixin_36380516/article/details/72722424

http://blog.csdn.net/weixin_36380516/article/details/72829361

更新於06/02...

相關文章