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

溫馨提示×

溫馨提示×

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

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

Spring Context基礎知識點有哪些

發布時間:2021-12-08 14:29:20 來源:億速云 閱讀:200 作者:iii 欄目:大數據

本篇內容介紹了“Spring Context基礎知識點有哪些”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

Spring IOC/DI AOP 理解

前言

  作為從事java開發的碼農,Spring的重要性不言而喻,你可能每天都在和Spring框架打交道。Spring恰如其名的,給java應用程序的開發帶了春天般的舒爽感覺。Spring,可以說是任何一個java開發者通往技術高階的必備基礎。當然,要學好Spring,尤其是了解Spring的底層原理并不容易,需要花費很多時間和精力來潛心的研習,并在實際的項目中不斷的試錯和總結,才能形成屬于自己的思維理解。博主對Spring最初的認識頗淺,項目中遇到問題依靠度娘大概也能籠而統之的解決。不過呢,接觸Spring這么一年多時間里,對其框架體系認知比較雜亂,深層技術依然是霧里看花一般,沒有形成自己的認知和理解,這對編程技術的提升是十分不利的。鑒于此,才決定靜下心來從頭至尾系統的學習Spring框架,并通過博客的形式記錄學習點滴,分享技術知識,算是拋磚引玉吧。好了,閑言少敘,咱們開始切入正題

Spring框架核心介紹

  DI(Dependency Injection),依賴注入。和我們常聽說的另一個概念 IOC(控制反轉)其實歸根結底實現的功能是相同的,只是同樣的功能站在不同的角度來闡述罷了。這里博主就不去過多的辨析,度娘上有一大堆解釋。我們需要知道的是,什么叫依賴注入,為什么要依賴注入。搞清這兩點,我想對Spring的學習在思想上就算是上道了。

  在沒用使用Spring的時候——也就是沒有依賴注入的時候,java應用程序的類與類之間要實現相互的功能協作是比較費勁的,某個類(A)要實現它的功能如果需要依賴另一個類(B)的協作的話,就需要在A類中主動創建出B類的對象,才能使用B類的方法完成功能(這里看官就不要去糾結靜態方法之類的情況了)。這等于是A類需要負責B類對象整個生命周期的管理。在極度簡單的情況下,在一個類中new出另一個類的對象似乎并沒有什么問題,但是復雜的應用程序類與類的協作關系往往是多邊的,我們并不知道一個類功能的實現會依賴多少個另類對象來協作,所以在類中自行創建對象并且管理對象的整個生命周期,會造成代碼的高度耦合以及不可想象的復雜度。那么,試想,如果我們能將對象的生命周期交給第三方組件來管理,當某個類需要另外的對象時第三方組件就直接創建出來交給它,這樣,類就可以只專注于自己功能的實現,而不用去管理其他類對象的生命周期,這樣類的功能就單純了很多。

是的,你一定已經明白了,Spring(容器)就是這個第三方組件。我們只需要告訴Spring(容器)有哪些對象需要管理就行了,不用去關心Spring框架是如何創建對象的。這樣,當某個類A需要類B對象時,如果類B已經聲明交給了Sping容器管理,那么在程序運行到類A需要類B時,Spring容器就通過依賴注入的方式,將類B對象注入到類A中協助完成業務功能。通過第三方組件的依賴注入,對象無需再自行的創建和管理類與類之間的依賴關系了。對象的創建依賴注入的方式也有多種,譬如接口注入,構造方法注入,setter方法注入等等。說到這里,你對依賴注入應該有比較直白的認知了。至于為什么要依賴注入,上文已經說得很明白了,就是為了減少代碼中組件之間的耦合度,我們還是先通過簡單示例來直觀感受下依賴注入比自己管理對象的好處吧

public class Man implements Human {
    private QQCar car;
    public Man() {
        this.car = new QQCar();
    }
    @Override
    public void xiabibi() {
    }
    public void driveCar(){
        car.drive();
    }
}

 接口Car暫有兩個實現:奔馳車和QQ車,在以上Man類和QQCar類高度耦合的代碼中,老司機通過構造器只創建了QQ車對象,所以只能開QQ車,那么老司機想開奔馳怎么辦呢,你讓他重新創建奔馳車的對象嗎?這樣高度耦合的代碼似乎是毫無辦法的,那么,我們通過注入對象的方式對上述代碼做一番改進:

public class Man implements Human {
    private Car car; //注意此處哦
    public Man(Car car) {
        this.car = car;
    }
    @Override
    public void xiabibi() {
    }

    public void driveCar() {
        car.drive();
    }
}

以上代碼根據多態特性,通過構造器接口注入的方式屏蔽掉了具體的對象實現,這樣,老司機就能想開什么車就開什么車了。這就是依賴注入帶來的好處。

  AOP(Aspect Oriented Programming),面向切面編程。日常開發中,我們在完成某個業務功能的時候,寫了一堆代碼,到最后代碼優化的時候發現,真正完成業務的代碼可能就那么兩句,而其余都是與該部分業務相關度不大,僅僅是為了實現某種技術的代碼,是完全可以抽離出去的,于是很自然的,我們會將其抽取成一個工具類,這樣凡是用到的地方只需調用一下工具方法就ok了。我們再站高一點看,各個業務模塊的功能組件中除了完成相關的業務功能外,都有涉及日志、事務、安全控制等額外的操作等。這些并不是模塊的核心功能,卻又不可或缺。如果將這些額外功能添加進代碼,業務系統每個組件都來一套又顯得太過重復,而且讓業務代碼顯得混亂,不夠純粹。

這個時候,你問上帝,可不可以讓你的業務代碼只專注于業務的實現,不去管什么日志、事務等不相干的東西?喔,上帝說沒問題,于是就有了AOP。如果說依賴注入的目的是讓相互協作的組件保持一種較為松散的耦合狀態的話,AOP則是將遍布應用各處的功能分離出來形成可重用的組件。通俗點說,日志、事務等都是可以重用的組件,我們完全可以將分散于業務代碼各處的日志、事務、安全等功能代碼抽離出成為一個單獨的工具組件,在Spring的配置中將其進行聲明為一個功能切面,再告訴Spring你想在哪些地方、什么時機使用(切入)這些可重用組件就行了。這就是對面向切面的簡單釋義。

Spring 容器跟上下文理解

有了Spring之后,通過依賴注入的方式,我們的業務代碼不用自己管理關聯對象的生命周期。業務代碼只需要按照業務本身的流程,走啊走啊,走到哪里,需要另外的對象來協助了,就給Spring說,我想要個對象 于是Spring就很貼心的給你個對象。聽起來似乎很簡單,使用起來也不難,但是如果僅僅是這樣的拿來主義,倒也灑脫,不用費什么腦子。。。可是,你就真的不關心,Spring是從哪里把對象給你的嗎?

  如果你想要了解Spring深一些,而不僅僅是拿來用用,那么你就應該好好思考一下上訴問題,不然,你還看個鏟鏟啊!你可以這樣去思考:Spring既然要負責應用程序中那么多對象的創建管理,就像蘋果要生產那么多的手機(對象)一樣,肯定有一個專門搞對象的地方。蘋果生產手機的地方叫工廠,比如富士康,但放在軟件開發中,對于Spring搞對象的地方我們就不叫工廠了,而叫做容器。是的,容器的概念在java中你最熟悉的莫過于Tomcat了,它正是一個運行Servlet的web容器,而Spring要想實現依賴注入功能,就離不開對象生產的容器——如果沒有容器負責對象的創建管理,你的程序代碼只是喊要對象了,Spring也無處給你啊。實際上,容器是Spring框架實現功能的核心,容器不只是幫我們創建了對象那么簡單,它負責了對象整個的生命周期的管理——創建、裝配、銷毀。關于Spring的這個容器你最常聽聞的一個術語就是IOC容器。所謂IOC,是一種叫控制反轉的編程思想,網上有很通俗易懂的總結,我就不胡亂闡述了。

總之一句話,我的應用程序里不用再過問對象的創建和管理對象之間的依賴關系了,都讓IOC容器給代勞吧,也就是說,我把對象創建、管理的控制權都交給Spring容器,這是一種控制權的反轉,所以Spring容器才能稱為IOC容器。不過這里要清楚一點:并不是說只有Spring的容器才叫IOC容器,基于IOC容器的框架還有很多,并不是Spring特有的。

  好了,終于把Spring的容器概念闡述的差不多了,但有什么卵用呢?光有容器你其實什么都干不了!你以為容器那么科幻,跟叮當貓面前的百寶袋一樣,你想要啥它就給你啥?實際上,容器里面什么都沒有,決定容器里面放什么對象的是我們自己,決定對象之間的依賴關系的,也是我們自己,容器只是給我們提供一個管理對象的空間而已。那么,我們怎么向容器中放入我們需要容器代為管理的對象呢?這就涉及到Spring的應用上下文了。

什么是應用上下文呢,你可以簡單的理解成就是將你需要Spring幫你管理的對象放入容器的那么一種。。一種。。額。。一種容器對象——是的,應用上下文即是Spring容器的一種抽象化表述;而我們常見的 ApplicationContext 本質上說就是一個維護Bean定義以及對象之間協作關系的高級接口。

應用上下文Context :基于 Core 和 Beans,提供了大量的擴展,包括國際化操作(基于 JDK )、資源加載(基于 JDK properties)、數據校驗(Spring 自己封裝的數據校驗機制)、數據綁定(Spring 特有,HTTP 請求中的參數直接映射稱 POJO)、類型轉換,ApplicationContext 接口是 Context 的核心,可以理解為Bean的上下文或背景信息。

PS:官方文檔里面對 *Context 相關的類的描述本來就是通過讀取xml文件中的信息,再通過動態代理生成具體對象,這里的context狹義上就是指描述類信息的xml文件,實際這里翻譯為 描述或者周圍環境配置 更準確。

這里,我們必須明確,Spring的核心是容器,而容器并不唯一,框架本身就提供了很多個容器的實現,大概分為兩種類型:一種是不常用的BeanFactory,這是最簡單的容器,只能提供基本的DI功能;還有一種就是繼承了BeanFactory后派生而來的應用上下文,其抽象接口也就是我們上面提到的的ApplicationContext,它能提供更多企業級的服務,例如解析配置文本信息等等,這也是應用上下文實例對象最常見的應用場景。有了上下文對象,我們就能向容器注冊需要Spring管理的對象了。對于上下文抽象接口,Spring也為我們提供了多種類型的容器實現,供我們在不同的應用場景選擇

  1. AnnotationConfigApplicationContext:從一個或多個基于java的配置類中加載上下文定義,適用于java注解的方式;

  2. ClassPathXmlApplicationContext:從類路徑下的一個或多個xml配置文件中加載上下文定義,適用于xml配置的方式;

  3. FileSystemXmlApplicationContext:從文件系統下的一個或多個xml配置文件中加載上下文定義,也就是說系統盤符中加載xml配置文件;

  4. AnnotationConfigWebApplicationContext:專門為web應用準備的,適用于注解方式;

  5. XmlWebApplicationContext:從web應用下的一個或多個xml配置文件加載上下文定義,適用于xml配置方式
    Spring Context基礎知識點有哪些

有了以上理解,問題就很好辦了。你只要將你需要IOC容器替你管理的對象基于xml也罷,java注解也好,總之你要將需要管理的對象(Spring中我們都稱之問bean)、bean之間的協作關系配置好,然后利用應用上下文對象加載進我們的Spring容器,容器就能為你的程序提供你想要的對象管理服務了。下面,還是貼一下簡單的應用上下文的應用實例:

  我們先采用xml配置的方式配置bean和建立bean之間的協作關系:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       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-3.2.xsd">
    <bean id="man" class="spring.chapter1.domain.Man">
        <constructor-arg ref="qqCar" />
    </bean>
    <bean  id="qqCar" class="spring.chapter1.domain.QQCar"/>
</beans>

然后通過應用上下文將配置加載到IOC容器,讓Spring替我們管理對象,待我們需要使用對象的時候,再從容器中獲取bean就ok了:

public class Test {
    public static void main(String[] args) {
        //加載項目中的spring配置文件到容器
//        ApplicationContext context = new ClassPathXmlApplicationContext("resouces/applicationContext.xml");
        //加載系統盤中的配置文件到容器
        ApplicationContext context = new FileSystemXmlApplicationContext("E:/Spring/applicationContext.xml");
        //從容器中獲取對象實例
        Man man = context.getBean(Man.class);
        man.driveCar();
    }
}

以上測試中,我將配置文件applicationContext.xml分別放在項目中和任意的系統盤符下,我只需要使用相應的上下文對象去加載配置文件,最后的結果是完全一樣的。當然,現在項目中越來越多的使用java注解,所以注解的方式必不可少:

//同xml一樣描述bean以及bean之間的依賴關系
@Configuration
public class ManConfig {
    @Bean
    public Man man() {
        return new Man(car());
    }
    @Bean
    public Car car() {
        return new QQCar();
    }
}
public class Test {
    public static void main(String[] args) {
        //從java注解的配置中加載配置到容器
        ApplicationContext context = new AnnotationConfigApplicationContext(ManConfig.class);
        //從容器中獲取對象實例
        Man man = context.getBean(Man.class);
        man.driveCar();
    }
}

“Spring Context基礎知識點有哪些”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

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

AI

建宁县| 临邑县| 瓮安县| 新宾| 沙湾县| 辛集市| 台湾省| 齐齐哈尔市| 乐清市| 冀州市| 明溪县| 汪清县| 揭西县| 泗阳县| 佳木斯市| 剑河县| 涿鹿县| 汉寿县| 罗城| 新宾| 南川市| 莲花县| 翼城县| 内丘县| 丰城市| 赫章县| 彰化市| 崇礼县| 元氏县| 丰台区| 葵青区| 泰兴市| 扎鲁特旗| 临江市| 正镶白旗| 昌江| 峨眉山市| 芒康县| 宁都县| 乳源| 三河市|