亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

詳解Spring框架的核心思想之IOC

發布時間:2020-06-21 00:06:52 來源:網絡 閱讀:1506 作者:GitShare 欄目:軟件技術

微信號:GitShare
微信公眾號:愛折騰的稻草
如有問題或建議,請在公眾號留言[1]

前續

為幫助廣大SpringBoot用戶達到“知其然,更需知其所以然”的境界,作者將通過SpringBoot系列文章全方位對SpringBoot2.0.0.RELEASE版本深入分解剖析,讓您深刻的理解其內部工作原理。

No.1 Spring是什么

為了讓更多的朋友了解Spring,首先科普一下Spring!有興趣的朋友可以去Spring官網逛逛,地址是:https://spring.io/

The Spring Framework provides a comprehensive programming and configuration model for modern Java-based enterprise applications - on any kind of deployment platform.

Spring Framework為現代基于Java的企業應用程序提供了全面的編程和配置模型 - 在任何類型的部署平臺上。

總的來說:Spring是一個分層的Java SE/EE應用一站式的輕量級開源框架。

No.2 Spring的優點

Spring的一個關鍵要素是應用程序級別的基礎架構支持:Spring專注于企業應用程序的“管道”,以便團隊可以專注于應用程序級業務邏輯,而無需與特定部署環境建立不必要的聯系。

  • 方便解耦,簡化開發,通過Spring提供的IoC容器,我們可以將對象之間的依賴關系交由Spring進行控制,避免硬編碼造成的程序耦合度高。

  • AOP編程的支持,通過Spring提供的AOP功能,方便進行面向切面編程。

  • 聲明式事務的支持,在Spring中,我們可以從單調煩悶的事務管理代碼中解脫出來,通過聲明式方式靈活地進行事務的管理,提高開發效率和質量。

  • 方便程序的測試,可以用非容器依賴的編程方式進行幾乎所有的測試工作。

  • 方便集成各種優秀框架,Spring提供了對各種優秀框架的直接支持。

No.3 Sprnig的架構
詳解Spring框架的核心思想之IOC

整個Spring框架按其所屬功能可以劃分為五個主要模塊,這五個模塊幾乎為企業應用提供了所需的一切,從持久層、業務層到表現層都擁有相應的支持,這就是Spring為什么是一站式框架。IoC和AOP是Spring的核心。

1、核心模塊(Core Container)
  • Spring的核心模塊實現了IoC的功能,它將類和類之間的依賴從代碼中脫離出來,用配置的方式進行依賴關系描述。 由IoC容器負責類的創建,管理,獲取等。BeanFactory接口是Spring框架的核心接口,實現了容器很多核心的功能。

  • Context模塊構建于核心模塊之上,擴展了BeanFactory的功能,包括國際化,資源加載,郵件服務,任務調度等多項功能。ApplicationContext是Context模塊的核心接口。

  • 表達式語言(Expression Language)是統一表達式語言(EL)的一個擴展,支持設置和獲取對象屬性,調用對象方法,操作數組、集合等。使用它可以很方便的通過表達式和Spring IoC容器進行交互。

2、AOP模塊

Spring AOP模塊提供了滿足AOP Alliance規范的實現,還整合了AspectJ這種AOP語言級的框架。通過AOP能降低耦合。

3、數據訪問集成模塊(Data Access/Integration )

該模塊包括了JDBC、ORM、OXM、JMS和事務管理

  • 事務模塊:該模塊用于Spring管理事務,只要是Spring管理對象都能得到Spring管理事務的好處,無需在代碼中進行事務控制了,而且支持編程和聲明性的事務管理。

  • JDBC模塊:提供了一個JBDC的樣例模板,使用這些模板能消除傳統冗長的JDBC編碼還有必須的事務控制,而且能享受到Spring管理事務的好處。

  • ORM模塊:提供與流行的“對象-關系”映射框架的無縫集成,包括Hibernate、JPA、MyBatis等。而且可以使用Spring事務管理,無需額外控制事務。

  • OXM模塊:提供了一個對Object/XML映射實現,將java對象映射成XML數據,或者將XML數據映射成java對象,Object/XML映射實現包括JAXB、Castor、XMLBeans和XStream。

  • JMS模塊:用于JMS(Java Messaging Service),提供一套 “消息生產者、消息消費者”模板用于更加簡單的使用JMS,JMS用于用于在兩個應用程序之間,或分布式系統中發送消息,進行異步通信。

4、Web模塊

該模塊建立在ApplicationContext模塊之上,提供了Web應用的功能。如文件上傳、FreeMarker等。
Spring可以整合Struts2等MVC框架。Spring自己提供了MVC框架Spring MVC。

5、測試模塊

Spring可以用非容器依賴的編程方式進行幾乎所有的測試工作,支持JUnit和TestNG等測試框架。

No.4 什么是IOC

IOC是Inversion of Control的縮寫,也稱為“控制反轉”。1996年,Michael Mattson在一篇有關探討面向對象框架的文章中,首先提出了IOC 這個概念。  
簡單來說就是把復雜系統分解成相互合作的對象,這些對象類通過封裝以后,內部實現對外部是透明的,從而降低了解決問題的復雜度,而且可以靈活地被重用和擴展。  
IOC理論提出的觀點大體是這樣的:借助于“第三方”(IOC容器)實現具有依賴關系的對象之間的解耦。

2004年,Martin Fowler探討了同一個問題,既然IOC是控制反轉,那么到底是“哪些方面的控制被反轉了呢?”,經過詳細地分析和論證后,他得出了答案:“獲得依賴對象的過程被反轉了”。
控制被反轉之后,獲得依賴對象的過程由自身管理變為了由IOC容器主動注入。于是,他給“控制反轉”取了一個更合適的名字叫做“依賴注入(Dependency Injection)”。

所謂依賴注入,就是由IOC容器在運行期間,動態地將某種依賴關系注入到對象之中。  
依賴注入(DI)和控制反轉(IOC)是從不同的角度的描述的同一件事情,就是指通過引入IOC容器,利用依賴關系注入的方式,實現對象之間的解耦。

小結:
  • 所謂控制反轉,就是把原先我們代碼里面需要實現的對象創建、依賴的代碼,反轉給容器來幫忙實現。

  • IOC(Inversion of Control)另外一種說法叫DI(Dependency Injection),即依賴注入。它并不是一種技術實現,而是一種設計思想。

  • 從技術角度來看,IOC其實就是反射編程。通過類名(字符串)來動態生成類對象。

  • IoC容器:最主要是完成了對象的創建和依賴的管理注入。

No.5 Spring的IOC容器(BeanFaoctory體系)

BeanFactory作為最頂層的一個接口類,它定義了IOC容器的基本功能規范,其源碼如下:

public interface BeanFactory {
    /**
     * 對FactoryBean的轉義定義,因為如果使用bean的名字檢索FactoryBean得到的對象是工廠生成的對象,如果需要得到工廠本身,需要轉義
     */

    String FACTORY_BEAN_PREFIX = "&";
    /**
     * 根據bean的名字,獲取在IOC容器中得到bean實例 
     */

    Object getBean(String name) throws BeansException;
    /**
     * 根據bean的名字和Class類型來得到bean實例,增加了類型安全驗證機制
     */

    <T> getBean(String name, @Nullable Class<T> requiredType) throws BeansException;
    /**
     * 根據bean的名字和Class類型來得到bean實例,args實例化bean時的參數
     */

    Object getBean(String name, Object... args) throws BeansException;
    /**
     * 根據bean的Class類型類獲取bean實例
     */

    <T> getBean(Class<T> requiredType) throws BeansException;
    /**
     * 根據bean的Class類型類獲取bean實例,args實例化bean時的參數
     */

    <T> getBean(Class<T> requiredType, Object... args) throws BeansException;
    /**
     * 提供對bean的檢索,看看是否在IOC容器有這個名字的bean 
     */

    boolean containsBean(String name);
    /**
     * 根據bean名字得到bean實例,并同時判斷這個bean是不是單例 
     */

    boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
    /**
     * [2.0.3新增]根據bean名字得到bean實例,并同時判斷這個bean是不是原型
     */

    boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
    /**
     * 檢查給定名稱的getBean調用是否將返回可分配給指定目標類型的對象。
     */

    boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
    /**
     * [2.0.1版本新增]檢查給定名稱的getBean調用是否將返回可分配給指定目標類型的對象。 
     */

    boolean isTypeMatch(String name, @Nullable Class<?> typeToMatch) throws NoSuchBeanDefinitionException;
    /**
     * 得到bean實例的Class類型  
     */

    @Nullable
    Class<?> getType(String name) throws NoSuchBeanDefinitionException;
    /**
     * 得到bean的別名,如果根據別名檢索,那么其原名也會被檢索出來
     */

    String[] getAliases(String name);
}

用于訪問Spring bean容器的根接口。  
BeanFactory實現應盡可能支持標準bean生命周期接口,完整的初始化方法及其標準順序是:

1、BeanNameAware的setBeanName
2、BeanClassLoaderAware的setBeanClassLoader
3、BeanFactoryAware的setBeanFactory
4、EnvironmentAware的setEnvironment
5、EmbeddedValueResolverAware的setEmbeddedValueResolver
6、ResourceLoaderAware的setResourceLoader(僅適用與運行時的應用上下文) 
7、ApplicationEventPublisherAware的setApplicationEventPublisher (僅適用與運行時的應用上下文) 
8、MessageSourceAware的setMessageSource (僅適用與運行時的應用上下文) 
9、ApplicationContextAware的setApplicationContext (僅適用與運行時的應用上下文) 
10、ServletContextAware'的setServletContext (僅適用與運行時的應用上下文) 
- 11、 BeanPostProcessors的postProcessBeforeInitialization方法
- 12、InitializingBean的afterPropertiesSet
- 13、自定義一個初始化方法(init-method)
- 14、BeanPostProcessors的postProcessAfterInitialization方法

關閉BeanFactory時,以下生命周期方法適用:

1、DestructionAwareBeanPostProcessors的postProcessBeforeDestruction方法
2、DisposableBean's destroy 
- 3、自定義一個銷毀方法(destroy-method)
1、BeanFactory的繼承關系
詳解Spring框架的核心思想之IOC
  • ListableBeanFactory  
    BeanFactory接口的擴展由bean工廠實現,提供容器內bean實例的枚舉功能。

  • HierarchicalBeanFactory  
    可以被作為分層結構中的一部分的bean工廠實現。提供父容器的訪問功能。

public interface HierarchicalBeanFactory extends BeanFactory {
    /**
     * 返回其父工廠,如果沒有返回Null
     */

    @Nullable
    BeanFactory getParentBeanFactory();
    /**
     * 返回當前bean工廠上下文是否存在給定bean名字的bean,忽略定義在其繼承層次中的工廠上下文,只在當前層次中查找
     */

    boolean containsLocalBean(String name);

}
  • AutowireCapableBeanFactory  
    BeanFactory接口的擴展將由能夠自動裝配的BeanFactory實現,前提是他們希望為現有bean實例公開此功能。
    添加集成其他框架功能。如果集成WebWork則可以使用Spring對Actions等進行管理。

  • SimpleJndiBeanFactory
    基于JNDI的簡單實現Spring的BeanFactory接口,不支持枚舉bean定義。

  • ConfigurableBeanFactory  
    是HierarchicalBeanFactory的子類,在其基礎上提供了配置BeanFactory的功能。

  • ConfigurableListableBeanFactory  
    是ListableBeanFactory、ConfigurableBeanFactory和AutowireCapableBeanFactory的子類,它提供了分析和修改bean定義以及預先實例化單例的功能。

  • ApplicationContext  
    應用上下文接口,這個在Spring的Context一文中已經分析過了。

2、Spring中IOC容器的初始化

在Spring中IOC容器的初始化是有refresh()方法來啟動的,主要有三個基本過程:

  • 1.BeanDifinition的Resource定位

  • 2.BeanDifinition的載入與解析

  • 3.BeanDifinition在Ioc容器中的注冊  

No.6 IOC容器的缺點

IOC給我們帶來的優點就不說了,主要看看其注意事項:

  • 項目中引人第三方的IOC容器,對象的生成變得復雜;

  • 由于IOC容器是通過反射來生成對象,所以會有一定的性能損耗;

  • Spring的IOC容器在使用時,需要配置大量的配置文件。

后記

為幫助廣大SpringBoot用戶達到“知其然,更需知其所以然”的境界,作者將通過SpringBoot系列文章全方位對SpringBoot2.0.0.RELEASE版本深入分解剖析,讓您深刻的理解其內部工作原理。

本系列歷史文章列表
  • 1、[SpringBoot]利用SpringBoot快速構建并啟動項目

  • 2、[SpringBoot]詳解SpringBoot應用的啟動過程

  • 3、[SpringBoot]深入淺出剖析SpringBoot的應用類型識別機制

  • 4、[SpringBoot]深入淺出剖析SpringBoot中Spring Factories機制

  • 5、[SpringBoot]詳解SpringBoot中SpringApplication的run方法的前三步

  • 6、[SpringBoot]圖解Spring的Environment機制

  • 7、[SpringBoot]源碼解析SpringBoot應用Environment的構造過程

  • 8、[SpringBoot]源碼解析SpringBoot的Banner機制

  • 9、[SpringBoot]圖解SpringBoot的應用上下文機制

  • 10、[SpringBoot]源碼分析SpringBoot的異常處理機制

  • 11、[SpringBoot]源碼解析SpringBoot應用上下文的刷新處理

  • 12、[SpringBoot]源碼解析SpringBoot應用上下文前置處理

  • 13、[SpringBoot]圖解Spring的核心組件之Context

  • 14、[SpringBoot]詳解Spring的核心思想之AOP


詳解Spring框架的核心思想之IOC


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

安化县| 平乐县| 特克斯县| 屏南县| 湾仔区| 旬邑县| 哈密市| 唐山市| 安龙县| 原阳县| 高平市| 东乡族自治县| 石景山区| 绥德县| 翼城县| 宣威市| 密山市| 鹤壁市| 兰州市| 南溪县| 托克逊县| 无极县| 香格里拉县| 南开区| 观塘区| 永宁县| 冷水江市| 平舆县| 长白| 册亨县| 鸡西市| 塔城市| 宜黄县| 博客| 监利县| 囊谦县| 湘阴县| 深州市| 栖霞市| 巩留县| 天气|