亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java 自定義Spring框架與核心功能詳解

 更新時(shí)間:2021年10月14日 10:09:04   作者:李阿昀  
Spring框架是由于軟件開(kāi)發(fā)的復(fù)雜性而創(chuàng)建的。Spring使用的是基本的JavaBean來(lái)完成以前只可能由EJB完成的事情。然而,Spring的用途不僅僅限于服務(wù)器端的開(kāi)發(fā)

在上一講中,我們對(duì)Spring的基本使用進(jìn)行了一個(gè)簡(jiǎn)單的回顧,接下來(lái),我們就來(lái)看一下Spring核心功能結(jié)構(gòu)。

Spring核心功能結(jié)構(gòu)

Spring大約有20個(gè)模塊,由1300多個(gè)不同的文件構(gòu)成,而這些模塊可以分為下面幾部分:

  • 核心容器
  • AOP和設(shè)備支持
  • 數(shù)據(jù)訪問(wèn)與集成
  • Web組件
  • 通信報(bào)文
  • 集成測(cè)試
  • ······

下面這張圖就是Spring框架的總體架構(gòu)圖。

在這里插入圖片描述

接下來(lái),我就帶領(lǐng)著大家逐一看一下Spring里面的這些模塊。

核心容器

核心容器由Beans、Core、Context和Expression(Spring Expression Language,SpEL)4個(gè)模塊組成。

spring-beans和spring-core模塊

spring-beans和spring-core模塊是Spring框架的核心模塊,包含了控制反轉(zhuǎn)(Inversion of Control,IoC)和依賴注入(Dependency Injection,DI)。

這倆模塊里面有一個(gè)核心接口叫BeanFactory,為什么說(shuō)它是核心接口呢?因?yàn)镾pring IoC里面有一個(gè)很重要的概念,那就是容器,而B(niǎo)eanFactory接口定義的就是容器共有的功能,很顯然,BeanFactory就是容器對(duì)象頂層接口。下面,我們不妨再來(lái)重新認(rèn)識(shí)一遍BeanFactory。

BeanFactory使用控制反轉(zhuǎn)對(duì)應(yīng)用程序的配置和依賴性規(guī)范與實(shí)際的應(yīng)用程序代碼進(jìn)行了分離。大家要知道,bean以及依賴的管理,我們都是在Spring的配置文件里面進(jìn)行配置的,這樣,是不是就能大大降低程序之間的耦合???

BeanFactory屬于延時(shí)加載,也就是說(shuō)在實(shí)例化容器對(duì)象后并不會(huì)自動(dòng)實(shí)例化bean,只有當(dāng)bean被使用時(shí),BeanFactory才會(huì)對(duì)該bean進(jìn)行實(shí)例化與依賴關(guān)系的裝配。這句話什么意思呢?我們不妨先回到咱們的Maven工程(即spring_demo)中,然后再通過(guò)代碼演示來(lái)理解一下這句話?,F(xiàn)在我們創(chuàng)建Spring的容器對(duì)象就不再使用ApplicationContext接口了,而是來(lái)使用BeanFactory接口,如下所示。

package com.meimeixia.controller;

import com.meimeixia.service.UserService;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;

/**
 * @author liayun
 * @create 2021-09-19 18:41
 */
public class UserController {
    public static void main(String[] args) throws Exception {
        // 1. 創(chuàng)建Spring的容器對(duì)象
        // ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
        // 2. 從容器對(duì)象中獲取UserService對(duì)象
        UserService userService = beanFactory.getBean("userService", UserService.class);
        // 3. 調(diào)用UserService對(duì)象的方法進(jìn)行業(yè)務(wù)邏輯處理
        userService.add();
    }
}

以上UserController類的代碼修改完畢之后,我們并不會(huì)看到延時(shí)加載的效果,為了看到延時(shí)加載的效果,我們還得分別在UserDaoImpl和UserServiceImpl這倆類里面提供一個(gè)無(wú)參構(gòu)造方法,因?yàn)閎ean在實(shí)例化的時(shí)候,肯定是要調(diào)用其構(gòu)造方法的。

  • UserDaoImpl類:
package com.meimeixia.dao.impl;

import com.meimeixia.dao.UserDao;

/**
* 數(shù)據(jù)訪問(wèn)層實(shí)現(xiàn)類
* @author liayun
* @create 2021-09-19 18:29
*/
public class UserDaoImpl implements UserDao {

    public UserDaoImpl() {
        System.out.println("userDao被創(chuàng)建了");
    }

    @Override
    public void add() {
        System.out.println("UserDao...");
    }

}
  • UserServiceImpl類:
package com.meimeixia.service.impl;

import com.meimeixia.dao.UserDao;
import com.meimeixia.service.UserService;

/**
* 業(yè)務(wù)邏輯層實(shí)現(xiàn)類
* @author liayun
* @create 2021-09-19 18:37
*/
public class UserServiceImpl implements UserService {

    // 因?yàn)闃I(yè)務(wù)邏輯層是要調(diào)用數(shù)據(jù)訪問(wèn)層中的功能的,所以在這兒我們得聲明一個(gè)UserDao類型的變量
    private UserDao userDao; // 注意了,這兒我們并沒(méi)有為該變量進(jìn)行賦值,賦值的操作得交給Spring去做,只是這樣做的前提是我們得為該變量提供一個(gè)setter方法

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public UserServiceImpl() {
        System.out.println("userService被創(chuàng)建了");
    }

    @Override
    public void add() {
        System.out.println("UserService...");
        userDao.add();
    }
}

為了方便大家看到延時(shí)加載的效果,于是我在UserController類的如下代碼處打上了一個(gè)斷點(diǎn),然后我會(huì)以Debug的方式來(lái)運(yùn)行UserController類的代碼。

在這里插入圖片描述

此時(shí),程序肯定是要停留在斷點(diǎn)處的,然后我們按下F6鍵讓程序再往下運(yùn)行一行代碼,當(dāng)你切換到控制臺(tái)時(shí),你會(huì)發(fā)現(xiàn)控制臺(tái)并沒(méi)有任何打印結(jié)果,如下圖所示。

在這里插入圖片描述

現(xiàn)在容器對(duì)象已經(jīng)實(shí)例化完了,而且我們還為UserDaoImpl和UserServiceImpl這倆類提供了一個(gè)無(wú)參構(gòu)造方法,照理來(lái)說(shuō),此時(shí)應(yīng)該自動(dòng)實(shí)例化bean的(就是自動(dòng)創(chuàng)建UserDaoImpl和UserServiceImpl這倆類的對(duì)象),我們應(yīng)該能夠看到控制臺(tái)中會(huì)打印相應(yīng)結(jié)果的,因?yàn)閯?chuàng)建UserDaoImpl和UserServiceImpl這倆類的對(duì)象,就必須得調(diào)用其無(wú)參構(gòu)造。但是,控制臺(tái)我們沒(méi)有看到任何打印結(jié)果,這就說(shuō)明在實(shí)例化容器對(duì)象后并不會(huì)自動(dòng)實(shí)例化bean,原因正是BeanFactory屬于延時(shí)加載。

那什么時(shí)候?qū)嵗痓ean呢?使用容器對(duì)象里面的getBean方法獲取對(duì)應(yīng)的對(duì)象時(shí)就會(huì)實(shí)例化bean了,當(dāng)然了,并不是我們自個(gè)去實(shí)例化,而是Spring幫我們?nèi)?shí)例化。所以,當(dāng)你按下F6鍵讓程序再往下運(yùn)行一行代碼之后,你就能夠看到控制臺(tái)中會(huì)打印相應(yīng)結(jié)果了,如下圖所示。

在這里插入圖片描述

足以證明只有當(dāng)bean被使用時(shí),BeanFactory才會(huì)對(duì)該bean進(jìn)行實(shí)例化與依賴關(guān)系的裝配!OK,這里就給大家演示完了BeanFactory的延時(shí)加載。

spring-context模塊

spring-context模塊構(gòu)架于核心模塊(即spring-beans和spring-core這倆模塊)之上,擴(kuò)展了BeanFactory,為它添加了bean生命周期控制、框架事件體系及資源加載透明化等功能。此外,該模塊還提供了許多企業(yè)級(jí)支持,如郵件訪問(wèn)、遠(yuǎn)程訪問(wèn)、任務(wù)調(diào)度等。

大家注意了,ApplicationContext是該模塊的核心接口,它的超類是BeanFactory,也就是說(shuō)它是BeanFactory的子接口。與BeanFactory不同,ApplicationContext實(shí)例化后會(huì)自動(dòng)對(duì)所有的單實(shí)例bean進(jìn)行實(shí)例化與依賴關(guān)系的裝配,使之處于待用狀態(tài)。

這又是啥子意思呢?還是回到咱們的Maven工程(即spring_demo)中,這里我依舊通過(guò)代碼來(lái)給大家進(jìn)行演示?,F(xiàn)在我們創(chuàng)建Spring的容器對(duì)象還是使用ApplicationContext接口了,如下所示。

package com.meimeixia.controller;

import com.meimeixia.service.UserService;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;

/**
 * @author liayun
 * @create 2021-09-19 18:41
 */
public class UserController {
    public static void main(String[] args) throws Exception {
        // 1. 創(chuàng)建Spring的容器對(duì)象
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        // BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
        // 2. 從容器對(duì)象中獲取UserService對(duì)象
        UserService userService = applicationContext.getBean("userService", UserService.class);
        // 3. 調(diào)用UserService對(duì)象的方法進(jìn)行業(yè)務(wù)邏輯處理
        userService.add();
    }
}

依舊在UserController類的如下代碼處打上了一個(gè)斷點(diǎn),然后以Debug的方式來(lái)運(yùn)行UserController類的代碼。

在這里插入圖片描述

此時(shí),程序肯定是要停留在斷點(diǎn)處的,然后我們按下F6鍵讓程序再往下運(yùn)行一行代碼,當(dāng)你切換到控制臺(tái)時(shí),你會(huì)發(fā)現(xiàn)現(xiàn)在控制臺(tái)有打印結(jié)果了,如下圖所示。

在這里插入圖片描述

這也就是說(shuō)在實(shí)例化容器對(duì)象后就會(huì)自動(dòng)實(shí)例化bean,我想大家也應(yīng)該猜到原因了,就是與BeanFactory相反,ApplicationContext屬于非延時(shí)加載。所以,這里大家一定要非常清楚BeanFactory和ApplicationContext的區(qū)別。

spring-context-support模塊

spring-context-support模塊是對(duì)Spring IoC容器及IoC子容器的擴(kuò)展支持。

這里面涉及到了一個(gè)IoC子容器,想必大家都用過(guò)Spring MVC吧!它和Spring就牽扯到了一個(gè)父容器和子容器的關(guān)系,當(dāng)然,這一塊我們不做重點(diǎn)說(shuō)明啊!

spring-context-indexer模塊

spring-context-indexer模塊是Spring的類管理組件和Classpath掃描組件。

想必大家都知道,如果我們?cè)谂渲梦募锩媾渲昧艘粋€(gè)組件掃描的話,那么它就會(huì)自動(dòng)去掃描對(duì)應(yīng)類路徑下面的那些類有沒(méi)有對(duì)應(yīng)的注解。

spring-expression模塊

spring-expression模塊是統(tǒng)一表達(dá)式語(yǔ)言(EL)的擴(kuò)展模塊,可以查詢、管理運(yùn)行中的對(duì)象,同時(shí)也可以方便地調(diào)用對(duì)象方法,以及操作數(shù)組、集合等。它的語(yǔ)法類似于傳統(tǒng)EL,但提供了額外的功能,最出色的要數(shù)函數(shù)調(diào)用和簡(jiǎn)單字符串的模板函數(shù)。EL的特性是基于Spring產(chǎn)品的需求而設(shè)計(jì)的,可以非常方便地同Spring IoC進(jìn)行交互。

AOP和設(shè)備支持

用過(guò)Spring框架的話,那么你肯定用過(guò)AOP,相信你應(yīng)該也是比較熟悉的,所以這里我就不再做過(guò)多贅述了。

數(shù)據(jù)訪問(wèn)與集成

其實(shí),數(shù)據(jù)訪問(wèn)與集成這一模塊說(shuō)白了就是對(duì)Dao層進(jìn)行封裝的一個(gè)組件。

Web組件

對(duì)Web層進(jìn)行封裝的組件。

通信報(bào)文

從以上Spring框架的總體架構(gòu)圖中可以看到,Messaging代表的就是通信報(bào)文,這里我只是提一嘴。

集成測(cè)試

從以上Spring框架的總體架構(gòu)圖中可以看到,Test代表的就是集成測(cè)試,說(shuō)白了就是Spring集成JUnit來(lái)進(jìn)行單元測(cè)試。

當(dāng)然了,Spring框架里面肯定還有一些其他模塊,但我在這里不可能一一列出來(lái),于是就只挑了如上幾個(gè)模塊來(lái)說(shuō)了一下,其中要重點(diǎn)關(guān)注核心容器這一模塊。

bean概述

接下來(lái),我來(lái)為大家講一講Spring中的bean,因?yàn)閎ean對(duì)于Spring來(lái)說(shuō)特別特別重要,所以我單獨(dú)把它拿過(guò)來(lái)給大家講一講。

Spring就是面向bean的編程(簡(jiǎn)稱BOP,Bean Oriented Programming),bean在Spring中處于核心地位。bean對(duì)于Spring的意義就像Object對(duì)于OOP的意義一樣,如果Spring中沒(méi)有了bean,那么也就沒(méi)有Spring存在的意義了。Spring IoC容器通過(guò)配置文件或者注解的方式來(lái)管理bean對(duì)象之間的依賴關(guān)系。

接下來(lái),我們來(lái)看一下什么是bean?

Spring中bean用于對(duì)一個(gè)類進(jìn)行封裝。如下面的配置:

<bean id="userDao" class="com.meimeixia.dao.impl.UserDaoImpl"></bean>

<bean id="userService" class="com.meimeixia.service.impl.UserServiceImpl">
    <property name="userDao" ref="userDao"></property>
</bean>

你會(huì)發(fā)現(xiàn)以上配置中用到了兩個(gè)<bean>標(biāo)簽,而每一個(gè)<bean>標(biāo)簽就代表著一個(gè)bean。就拿第一個(gè)<bean>標(biāo)簽來(lái)說(shuō),id屬性的值就是bean對(duì)象的名稱,而class屬性的值就是bean對(duì)象所屬類的全限定類名。為什么要聲明這倆屬性呢?因?yàn)镾pring底層在去創(chuàng)建bean對(duì)象時(shí),是通過(guò)反射的方式根據(jù)全限定類名去創(chuàng)建該類的對(duì)象的。

為什么bean如此重要呢?這是因?yàn)椋?/p>

  1. Spring將bean對(duì)象交由一個(gè)叫IoC的容器進(jìn)行管理。也就是說(shuō)IoC容器是以bean對(duì)象為單位來(lái)進(jìn)行管理的。
  2. bean對(duì)象之間的依賴關(guān)系在配置文件中體現(xiàn),并由Spring完成。

這里,我們簡(jiǎn)單地去聊了一下Spring中的bean,對(duì)于bean,大家應(yīng)該還是要知道一點(diǎn)的。

到此這篇關(guān)于Java 自定義Spring框架與核心功能詳解的文章就介紹到這了,更多相關(guān)Java 自定義Spring框架內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java使用Freemarker頁(yè)面靜態(tài)化生成的實(shí)現(xiàn)

    Java使用Freemarker頁(yè)面靜態(tài)化生成的實(shí)現(xiàn)

    這篇文章主要介紹了Java使用Freemarker頁(yè)面靜態(tài)化生成的實(shí)現(xiàn),頁(yè)面靜態(tài)化是將原來(lái)的動(dòng)態(tài)網(wǎng)頁(yè)改為通過(guò)靜態(tài)化技術(shù)生成的靜態(tài)網(wǎng)頁(yè),FreeMarker?是一個(gè)用?Java?語(yǔ)言編寫(xiě)的模板引擎,它基于模板來(lái)生成文本輸,更多相關(guān)內(nèi)容需要的小伙伴可以參考一下
    2022-06-06
  • Java?web訪問(wèn)http://localhost:8080/xx/xx.jsp報(bào)404錯(cuò)誤問(wèn)題的解決方法

    Java?web訪問(wèn)http://localhost:8080/xx/xx.jsp報(bào)404錯(cuò)誤問(wèn)題的解決方法

    這篇文章主要給大家介紹了關(guān)于Java?web訪問(wèn)http://localhost:8080/xx/xx.jsp報(bào)404錯(cuò)誤問(wèn)題的解決方法,很多小伙伴在剛開(kāi)始用Springboot整合jsp開(kāi)發(fā)時(shí)都會(huì)遇到這個(gè)問(wèn)題, 按照別人的教程一步一步搭建,但就是會(huì)報(bào)404,文中介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • 詳解設(shè)計(jì)模式中的proxy代理模式及在Java程序中的實(shí)現(xiàn)

    詳解設(shè)計(jì)模式中的proxy代理模式及在Java程序中的實(shí)現(xiàn)

    代理模式主要分為靜態(tài)代理和動(dòng)態(tài)代理,使客戶端方面的使用者通過(guò)設(shè)置的代理來(lái)操作對(duì)象,下面來(lái)詳解設(shè)計(jì)模式中的proxy代理模式及在Java程序中的實(shí)現(xiàn)
    2016-05-05
  • 詳細(xì)談?wù)凧ava中l(wèi)ong和double的原子性

    詳細(xì)談?wù)凧ava中l(wèi)ong和double的原子性

    原子性是指一個(gè)操作或多個(gè)操作要么全部執(zhí)行,且執(zhí)行的過(guò)程不會(huì)被任何因素打斷,要么就都不執(zhí)行,下面這篇文章主要給大家介紹了關(guān)于Java中l(wèi)ong和double原子性的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • 你真的了解Java的多線程方法嗎

    你真的了解Java的多線程方法嗎

    這篇文章主要為大家詳細(xì)介紹了Java的多線程方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • 如何解決Spring in action @valid驗(yàn)證不生效的問(wèn)題

    如何解決Spring in action @valid驗(yàn)證不生效的問(wèn)題

    這篇文章主要介紹了如何解決Spring in action @valid驗(yàn)證不生效的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Maven的聚合(多模塊)和Parent繼承

    Maven的聚合(多模塊)和Parent繼承

    今天小編就為大家分享一篇關(guān)于Maven的聚合(多模塊)和Parent繼承,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • 使用java獲取md5值的兩種方法

    使用java獲取md5值的兩種方法

    本篇文章是對(duì)使用java獲取md5值的兩種方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • java使用FFmpeg提取音頻的實(shí)現(xiàn)示例

    java使用FFmpeg提取音頻的實(shí)現(xiàn)示例

    在Java開(kāi)發(fā)中,我們經(jīng)常會(huì)遇到需要使用FFmpeg來(lái)處理音視頻文件的情況,本文主要介紹了java使用FFmpeg提取音頻的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • spring cloud實(shí)現(xiàn)Eureka注冊(cè)中心的HA的方法

    spring cloud實(shí)現(xiàn)Eureka注冊(cè)中心的HA的方法

    本篇文章主要介紹了spring cloud實(shí)現(xiàn)Eureka注冊(cè)中心的HA的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01

最新評(píng)論