一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java 自定義Spring框架與核心功能詳解

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

2022-02-19 15:01李阿昀 Java教程

Spring框架是由于軟件開發的復雜性而創建的。Spring使用的是基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅僅限于服務器端的開發

在上一講中,我們對Spring的基本使用進行了一個簡單的回顧,接下來,我們就來看一下Spring核心功能結構。

 

Spring核心功能結構

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

  • 核心容器
  • AOP和設備支持
  • 數據訪問與集成
  • Web組件
  • 通信報文
  • 集成測試
  • ??????

下面這張圖就是Spring框架的總體架構圖。

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

接下來,我就帶領著大家逐一看一下Spring里面的這些模塊。

 

核心容器

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

spring-beans和spring-core模塊

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

這倆模塊里面有一個核心接口叫BeanFactory,為什么說它是核心接口呢?因為Spring IoC里面有一個很重要的概念,那就是容器,而BeanFactory接口定義的就是容器共有的功能,很顯然,BeanFactory就是容器對象頂層接口。下面,我們不妨再來重新認識一遍BeanFactory。

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

BeanFactory屬于延時加載,也就是說在實例化容器對象后并不會自動實例化bean,只有當bean被使用時,BeanFactory才會對該bean進行實例化與依賴關系的裝配。這句話什么意思呢?我們不妨先回到咱們的Maven工程(即spring_demo)中,然后再通過代碼演示來理解一下這句話。現在我們創建Spring的容器對象就不再使用ApplicationContext接口了,而是來使用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. 創建Spring的容器對象
      // ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
      BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
      // 2. 從容器對象中獲取UserService對象
      UserService userService = beanFactory.getBean("userService", UserService.class);
      // 3. 調用UserService對象的方法進行業務邏輯處理
      userService.add();
  }
}

以上UserController類的代碼修改完畢之后,我們并不會看到延時加載的效果,為了看到延時加載的效果,我們還得分別在UserDaoImpl和UserServiceImpl這倆類里面提供一個無參構造方法,因為bean在實例化的時候,肯定是要調用其構造方法的。

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

import com.meimeixia.dao.UserDao;

/**
* 數據訪問層實現類
* @author liayun
* @create 2021-09-19 18:29
*/
public class UserDaoImpl implements UserDao {

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

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

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

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

/**
* 業務邏輯層實現類
* @author liayun
* @create 2021-09-19 18:37
*/
public class UserServiceImpl implements UserService {

  // 因為業務邏輯層是要調用數據訪問層中的功能的,所以在這兒我們得聲明一個UserDao類型的變量
  private UserDao userDao; // 注意了,這兒我們并沒有為該變量進行賦值,賦值的操作得交給Spring去做,只是這樣做的前提是我們得為該變量提供一個setter方法

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

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

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

為了方便大家看到延時加載的效果,于是我在UserController類的如下代碼處打上了一個斷點,然后我會以Debug的方式來運行UserController類的代碼。

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

此時,程序肯定是要停留在斷點處的,然后我們按下F6鍵讓程序再往下運行一行代碼,當你切換到控制臺時,你會發現控制臺并沒有任何打印結果,如下圖所示。

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

現在容器對象已經實例化完了,而且我們還為UserDaoImpl和UserServiceImpl這倆類提供了一個無參構造方法,照理來說,此時應該自動實例化bean的(就是自動創建UserDaoImpl和UserServiceImpl這倆類的對象),我們應該能夠看到控制臺中會打印相應結果的,因為創建UserDaoImpl和UserServiceImpl這倆類的對象,就必須得調用其無參構造。但是,控制臺我們沒有看到任何打印結果,這就說明在實例化容器對象后并不會自動實例化bean,原因正是BeanFactory屬于延時加載。

那什么時候實例化bean呢?使用容器對象里面的getBean方法獲取對應的對象時就會實例化bean了,當然了,并不是我們自個去實例化,而是Spring幫我們去實例化。所以,當你按下F6鍵讓程序再往下運行一行代碼之后,你就能夠看到控制臺中會打印相應結果了,如下圖所示。

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

足以證明只有當bean被使用時,BeanFactory才會對該bean進行實例化與依賴關系的裝配!OK,這里就給大家演示完了BeanFactory的延時加載。

spring-context模塊

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

大家注意了,ApplicationContext是該模塊的核心接口,它的超類是BeanFactory,也就是說它是BeanFactory的子接口。與BeanFactory不同,ApplicationContext實例化后會自動對所有的單實例bean進行實例化與依賴關系的裝配,使之處于待用狀態。

這又是啥子意思呢?還是回到咱們的Maven工程(即spring_demo)中,這里我依舊通過代碼來給大家進行演示。現在我們創建Spring的容器對象還是使用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. 創建Spring的容器對象
      ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
      // BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
      // 2. 從容器對象中獲取UserService對象
      UserService userService = applicationContext.getBean("userService", UserService.class);
      // 3. 調用UserService對象的方法進行業務邏輯處理
      userService.add();
  }
}

依舊在UserController類的如下代碼處打上了一個斷點,然后以Debug的方式來運行UserController類的代碼。

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

此時,程序肯定是要停留在斷點處的,然后我們按下F6鍵讓程序再往下運行一行代碼,當你切換到控制臺時,你會發現現在控制臺有打印結果了,如下圖所示。

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

這也就是說在實例化容器對象后就會自動實例化bean,我想大家也應該猜到原因了,就是與BeanFactory相反,ApplicationContext屬于非延時加載。所以,這里大家一定要非常清楚BeanFactory和ApplicationContext的區別。

spring-context-support模塊

spring-context-support模塊是對Spring IoC容器及IoC子容器的擴展支持。

這里面涉及到了一個IoC子容器,想必大家都用過Spring MVC吧!它和Spring就牽扯到了一個父容器和子容器的關系,當然,這一塊我們不做重點說明啊!

spring-context-indexer模塊

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

想必大家都知道,如果我們在配置文件里面配置了一個組件掃描的話,那么它就會自動去掃描對應類路徑下面的那些類有沒有對應的注解。

spring-expression模塊

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

AOP和設備支持

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

數據訪問與集成

其實,數據訪問與集成這一模塊說白了就是對Dao層進行封裝的一個組件。

Web組件

對Web層進行封裝的組件。

通信報文

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

集成測試

從以上Spring框架的總體架構圖中可以看到,Test代表的就是集成測試,說白了就是Spring集成JUnit來進行單元測試。

當然了,Spring框架里面肯定還有一些其他模塊,但我在這里不可能一一列出來,于是就只挑了如上幾個模塊來說了一下,其中要重點關注核心容器這一模塊。

bean概述

接下來,我來為大家講一講Spring中的bean,因為bean對于Spring來說特別特別重要,所以我單獨把它拿過來給大家講一講。

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

接下來,我們來看一下什么是bean?

Spring中bean用于對一個類進行封裝。如下面的配置:

<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>

你會發現以上配置中用到了兩個<bean>標簽,而每一個<bean>標簽就代表著一個bean。就拿第一個<bean>標簽來說,id屬性的值就是bean對象的名稱,而class屬性的值就是bean對象所屬類的全限定類名。為什么要聲明這倆屬性呢?因為Spring底層在去創建bean對象時,是通過反射的方式根據全限定類名去創建該類的對象的。

為什么bean如此重要呢?這是因為:

  1. Spring將bean對象交由一個叫IoC的容器進行管理。也就是說IoC容器是以bean對象為單位來進行管理的。
  2. bean對象之間的依賴關系在配置文件中體現,并由Spring完成。

這里,我們簡單地去聊了一下Spring中的bean,對于bean,大家應該還是要知道一點的。

到此這篇關于Java 自定義Spring框架與核心功能詳解的文章就介紹到這了,更多相關Java 自定義Spring框架內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/yerenyuan_pku/article/details/120715795

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产欧美国产精品第一区 | 精品国产乱码久久久久久免费 | julia ann全部在线hd | 天天草天天 | 国产区成人综合色在线 | 亚洲国产精品成人午夜在线观看 | 日产精品一卡2卡三卡4乱码久久 | 国产亚洲精品美女 | 欧美日韩亚洲一区二区三区在线观看 | 日本漫画无翼乌 | 4438全国免费观看 | 色哟哟在线视频 | 日韩一区在线观看 | 成年人视频在线免费观看 | 精品国产乱码久久久人妻 | 2018久久精品热在线观看 | 亚洲欧美日韩中文字幕网址 | 啊哈用力cao我 | 国产大片线上免费观看 | 护士让我吃奶我扒她奶 | 极品一区 | 日产乱码卡1卡2卡三卡四在线 | 欧美高清在线精品一区二区不卡 | 三级全黄裸体 | 欧美另类bbbxxxxx另类 | 亚洲欧美国产另类视频 | 91制片厂制作传媒免费版樱花 | 91夜夜操| 极品主播的慰在线播放 | 久久嫩草影院网站 | 精品欧美男同同性videos | 亚洲一区二区精品推荐 | 韩国免费特一级毛片 | 青草国产在线观看 | sxx免费看观看美女 sss亚洲国产欧美一区二区 | 日本69av| 2020最新版的ab片 | 91免费在线播放 | 国产大片网站 | 国产精品久久久久久影院 | 国模孕妇季玥全部人体写真 |