SpringMVC學習(controller層加載控制與(業務、功能)bean加載控制、Web容器初始化配置類)(3)

目錄

一、SpringMVC、Spring的bean加載控制。

(1)實際開發的包結構層次。

(2)如何"精準"控制兩個容器分別加載各自bean。(分析)

<1>SpringMVC相關bean加載控制。(方法)

<2>Spring相關bean加載控制。(方法)

二、Spring配置類——bean加載控制。

(1)方法一:設定精確范圍。

<1>controller層。

<2>Spring配置類。

<3>SpringMVC配置類。

(2)方法二:直接掃描主包(com.xxx),再排除controller包。

<1>排除過濾器(excludeFilters)與包含過濾器(includeFilters)。

<2>設置過濾規則(type)與過濾類型(classes)。

<3>最終的Spring配置類。

三、Web容器初始化配置類加載Spring環境。

<1>方法createRootApplicationContext()。

<2>Web容器配置類實現AbstractDispatcherServletInitializer類。(bean加載格式)

<3>實現類AbstractAnnotationConfigDispatcherServletInitializer 。(更簡單操作)


一、SpringMVC、Spring的bean加載控制。

(1)實際開發的包結構層次。
  • 在簡單的SpringMVC入門案例中:整體項目的核心包結構只有controller層與config層。
  • SpringMVC學習(入門案例思路及實現、Web容器初始化與SpringMVC配置類)(2)-CSDN博客

  • 但實際上真正的項目沒有這么簡單。其項目的主要包結構如下所示:
  • config目錄。包含Web容器初識化配置類Spring配置類SpringMVC配置類。(取代傳統開發的XML配置文件)

  • controller目錄。其內部是所有SpringMVC需要加載的bean。

  • servicedao等目錄。其內部都是各種業務bean、功能bean。而這些bean都是需要讓Spring加載。
  • 其中Spring需要管理的業務bean(service層)。需要管理的功能bean(第三方bean)如:DataSource(數據源對象)、SqlSessionFactoryBean等等MyBatis相關bean。


(2)如何"精準"控制兩個容器分別加載各自bean。(分析)
<1>SpringMVC相關bean加載控制。(方法)
  • 讓controller層的bean被SpringMVC加載控制很容易做到。——控制SpringMVC加載的bean對應包位于對應的自己項目的controller目錄下即可。


<2>Spring相關bean加載控制。(方法)
  • 讓Spring只加載對應的業務bean、功能bean。而避免加載到SpringMVC管理的bean。
  • 方式一:Spring加載的bean設定掃描范圍為com.xxx,再排除掉controller包內的bean。
  • 方式二:Spring加載的bean設定掃描范圍為精準范圍。就是掃描包設定每層的精確范圍:com.xxx.service包、com.xxx.dao包等。
  • 方式三:不區分Spring與springMVC的環境,加載到同一個環境中。

二、Spring配置類——bean加載控制。

(1)方法一:設定精確范圍。
  • 縮小具體包對應的范圍。這樣就不會掃描到SpringMVC管理的bean所在controller層中。
<1>controller層。
  • ExampleController類。
package com.hyl.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;/*** 控制器類*/
//1.使用注解@Controller定義bean
@Controller
public class ExampleController {/*** 隨機寫一個處理請求的方法* @return 字符串(模仿json數據)*///設置當前方法操作的訪問路徑@RequestMapping("/save")//設置當前操作的返回值類型(如何響應給客戶端)@ResponseBodypublic String save(){//方便測試查看運行結果。System.out.println("exampleController save ...");return "{'module':'springMVC'}";}}

<2>Spring配置類。
package com.hyl.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;//創建Spring的配置類
//排除加載controller包對應bean,使controller層交給SpringMVC管理@Configuration
@ComponentScan({"com.hyl.service","com.hyl.dao"})
/*@ComponentScan("com.hyl")*/
public class SpringConfig {
}

<3>SpringMVC配置類。
package com.hyl.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;//創建SpringMVC的配置類,加載controller包對應bean@Configuration
@ComponentScan("com.hyl.controller")
public class SpringMvcConfig {
}

  • 測試類。(App)
package com.hyl.test;import com.hyl.config.SpringConfig;
import com.hyl.controller.ExampleController;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class App {@Testpublic void test(){AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);ExampleController exampleController = context.getBean(ExampleController.class);System.out.println(exampleController);}}
  • 測試運行結果。無法獲取controller層的對應bean。


(2)方法二:直接掃描主包(com.xxx),再排除controller包。
  • 按住ctrl進入注解@ComponentScan查看其內部的可用屬性。
<1>排除過濾器(excludeFilters)與包含過濾器(includeFilters)。


<2>設置過濾規則(type)與過濾類型(classes)。
  • excludeFilters取值:注解@ComponentScan的Filter。


  • 屬性type、classes根屬地。


  • 過濾規則。分為很多個過濾策略:FilterType.xxx。(包括按注解過濾規則、用戶自定義過濾規則、正則過濾規則等等)

  • 過濾類型。當過濾規則設定為:按注解進行過濾時。就需要再手動指定需要過濾的注解是哪個類型(注解:@Controller),才能完成注解的過濾掃描。


<3>最終的Spring配置類。
  • 簡單說以上操作的目的:當Spring掃描整個包"com.xxx"下所有包時,需要按照注解排除掃描——注解@Controller下標明的bean。
package com.hyl.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.stereotype.Controller;//創建Spring的配置類
//排除加載controller包對應bean,使controller層交給SpringMVC管理@Configuration
/*@ComponentScan({"com.hyl.service","com.hyl.dao"})*/
@ComponentScan(value = "com.hyl",excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = Controller.class)
)
public class SpringConfig {
}
  • 測試類。
package com.hyl.test;import com.hyl.config.SpringConfig;
import com.hyl.controller.ExampleController;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class App {@Testpublic void test(){AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);ExampleController exampleController = context.getBean(ExampleController.class);System.out.println(exampleController);}}
  • 測試前需要將SpringMVC的配置類的注解@Configuration注釋,否則即使在spring配置類中使用了注解攔截掃描,但最終還是會因為該注解自動將bean交給Spring容器管理。



  • 注釋@Configuration后,繼續獲取Controller層的對應bean就會報錯。
  • 為了既可以攔截注解生效,又可以讓SpringMVC配置類被掃描到,可以將其提到上一級目錄或者上上級目錄即可。(如:放置com包下,不放在com.xxx下的某個目錄)

三、Web容器初始化配置類加載Spring環境。

  • 在SpringMVC的入門案例中。配置Tomcat運行的Web容器初識化啟動配置類中,當時只配置了SpringMVC的環境。這次順手將Spring的環境一起配置了。


<1>方法createRootApplicationContext()。
  • createRootApplicationContext()方法作用就是配置Spring的環境,加載Spring配置類。
  • 與加載SpringMVC配置類的操作一模一樣。不一樣的地方就是修改:配置類.class。

<2>Web容器配置類實現AbstractDispatcherServletInitializer類。(bean加載格式)
  • 這樣當服務器啟動時,不僅有SpringMVC容器,還有Spring容器
  • createServletApplicationContext()——>加SpringMVC容器。
  • createRootApplicationContext()——>Spring容器。
package com.hyl.config;import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;//定義一個Servlet容器啟動的配置類,在里面加載SpringMVC的配置
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {/***加載SpringMVC配置類* @return*/@Overrideprotected WebApplicationContext createServletApplicationContext() {AnnotationConfigWebApplicationContext webApplicationContext = new AnnotationConfigWebApplicationContext();webApplicationContext.register(SpringMvcConfig.class);return webApplicationContext;}/***加載Spring配置類(加載Spring容器)* @return*/@Overrideprotected WebApplicationContext createRootApplicationContext() {AnnotationConfigWebApplicationContext webApplicationContext = new AnnotationConfigWebApplicationContext();webApplicationContext.register(SpringConfig.class);return webApplicationContext;}/*** 設置哪些請求歸屬SpringMVC處理* @return*/@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}}

<3>實現類AbstractAnnotationConfigDispatcherServletInitializer 。(更簡單操作)


  • 簡化后的Web容器配置類。
package com.hyl.config;import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;//定義一個Servlet容器啟動的配置類,在里面加載SpringMVC、Spring的配置
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {/***加載Spring配置類(加載Spring容器)* @return*/@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[]{SpringConfig.class};}/***加載SpringMVC配置類* @return*/@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class};}@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/71519.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/71519.shtml
英文地址,請注明出處:http://en.pswp.cn/web/71519.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

fastapi+mysql實現增刪改查

說明&#xff1a; 我計劃用python的fastapi框架&#xff0c;實現操作MySQL數據庫的表&#xff0c;實現增刪改查的操作&#xff0c;并且在postman里面測試 step1: 安裝數據庫依賴 pip install fastapi uvicorn pymysqlstep2:C:\Users\Administrator\PycharmProjects\FastAPIPro…

Linux系統之配置HAProxy負載均衡服務器

Linux系統之配置HAProxy負載均衡服務器 前言一、HAProxy介紹1.1 HAProxy簡介1.2 主要特點1.3 使用場景二、本次實踐介紹2.1 本次實踐簡介2.2 本次實踐環境規劃三、部署兩臺web服務器3.1 運行兩個Docker容器3.2 編輯測試文件3.3 訪問測試四、安裝HAProxy4.1 更新系統軟件源4.2 安…

CS144 Lab Checkpoint 2: the TCP receiver

Overview TCPReceiver 從對等的sender接收消息&#xff0c;使用 receive() 方法&#xff0c;然后調用 Reassembler() 方法&#xff0c;后者寫入 ByteStream 中 然后應用程序從 ByteSteam 中讀取。 同時&#xff0c;TCPReceiver 還會通過 send() 方法給sender發送消息&#xff…

Spring Boot 3.x 核心注解詳解與最佳實踐

Spring Boot 3.x 核心注解詳解與最佳實踐 前言 隨著Spring Boot 3.x的正式發布&#xff0c;這個基于Spring Framework 6的里程碑版本帶來了諸多新特性。本文將深入剖析Spring Boot 3.x的核心注解體系&#xff0c;結合代碼示例講解其作用及使用場景&#xff0c;助您快速掌握新…

PHP之常量

在你有別的編程語言的基礎下&#xff0c;你想學習PHP&#xff0c;可能要了解的一些關于常量的信息。 PHP中的常量不用指定數據類型&#xff0c;可以使用兩次方法定義。 使用const //定義常量 const B 2; echo B . PHP_EOL;使用define define("A", 1); echo A . P…

計算機網絡——子網掩碼

一、子網掩碼是什么&#xff1f;它長什么樣&#xff1f; 子網掩碼的定義 子網掩碼是一個32位的二進制數字&#xff0c;與IP地址“配對使用”&#xff0c;用于標識IP地址中哪部分屬于網絡地址&#xff0c;哪部分屬于主機地址。 示例&#xff1a;IP地址 192.168.1.10&#xff0c;…

Tomcat-web服務器介紹以及安裝部署

一、Tomcat簡介 Tomcat是Apache軟件基金會&#xff08;Apache Software Foundation&#xff09;的Jakarta 項目中的一個核心項目&#xff0c;由Apache、Sun和其他一些公司及個人共同開發而成。 Tomcat服務器是一個免費的開放源代碼的Web應用服務器&#xff0c;屬于輕量級應用…

分布式存儲—— HBase數據模型 詳解

目錄 1.3 HBase數據模型 1.3.1 兩類數據模型 1.3.2 數據模型的重要概念 1.3.3 數據模型的操作 1.3.4 數據模型的特殊屬性 1.3.5 CAP原理與最終一致性 1.3.6 小結 本文章參考、總結于學校教材課本《HBase開發與應用》 1.3 HBase數據模型 在開始學習HBase之前非常…

android中activity1和activity2中接收定時消息

android中activity1和activity2中接收定時消息 業務類 import java.util.Timer; import java.util.TimerTask;public class MyAnager {private MyAnager() {}private static MyAnager instance;//回調接口onRecvTaskpublic interface OnMsgListener {void onRecvTask(String a…

BitMap實現用戶簽到、UV統計

1. Redis 的 BitMap 概述 在 Redis 中&#xff0c;BitMap 并非一種獨立的數據結構&#xff0c;而是基于 String 類型數據結構實現的一種存儲方式。由于 String 類型的最大上限是 512M&#xff0c;換算成 bit 位就是 2^32 個&#xff0c;這決定了 BitMap 可操作的最大范圍。Bit…

共享模型之管程(悲觀鎖)

共享模型之管程&#xff08;悲觀鎖&#xff09; 文章目錄 共享模型之管程&#xff08;悲觀鎖&#xff09;一、常見線程安全的類二、對象頭三、Monitor&#xff08;監視器 / 管程&#xff09;四、偏向鎖偏向鎖的實現原理撤銷偏向鎖 五、輕量級鎖輕量級鎖的釋放 六、重量級鎖七、…

網絡安全ctf試題 ctf網絡安全大賽真題

MISC 1 簽到 難度 簽到 復制給出的flag輸入即可 2 range_download 難度 中等 flag{6095B134-5437-4B21-BE52-EDC46A276297} 0x01 分析dns流量&#xff0c;發現dns && ip.addr1.1.1.1存在dns隧道數據&#xff0c;整理后得到base64: cGFzc3dvcmQ6IG5zc195eWRzIQ 解…

centos7操作系統下安裝docker,及查看docker進程是否啟動

centos7下安裝docker&#xff0c;需要用到的yun命令 &#xff08;yum命令用于添加卸載程序&#xff09; 1.設置倉庫&#xff1a; yum-config-manager \--add-repo \http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 2.安裝 Docker Engine-Community yum in…

私有云基礎架構與運維(二)

二.私有云基礎架構 【項目概述】 經過云計算基礎知識及核心技術的學習后&#xff0c;希望進一步了解 IT 基礎架構的演變過 程&#xff0c;通過學習傳統架構、集群架構以及私有云基礎架構的相關知識&#xff0c;認識企業從傳統 IT 基 礎架構到私有云基礎架構轉型的必要性。…

Linux 系統不同分類的操作命令區別

Linux 系統有多種發行版,每種發行版都有其獨特的操作命令和工具。以下是一些常見的分類及其操作命令的區別: 1. 基于 Red Hat 的發行版 (RHEL, CentOS, Fedora) 1.1 包管理 安裝軟件包: bash復制 sudo yum install <package> 更新軟件包: bash復制 sudo yum update…

?PLC數據類型和?C#數據類型的數據類型映射表

數據類型映射表 ?PLC數據類型?C#數據類型讀取方式?補充說明BitboolDBX布爾值BytebyteDBB單字節無符號整數WordushortDBW16位無符號整數DWorduintDBD32位無符號整數Intshort16位有符號整數DIntint32位有符號整數RealfloatDBR單精度浮點數LRealdoubleDBL雙精度浮點數Stringstr…

windows部署spleeter 版本2.4.0:分離音頻的人聲和背景音樂

windows部署spleeter 版本2.4.0&#xff1a;分離音頻的人聲和背景音樂 一、Spleeter 是什么&#xff1f; Spleeter 是由法國音樂流媒體公司 Deezer 開發并開源的一款基于深度學習的音頻分離工具。它能夠將音樂中的不同音軌&#xff08;如人聲、鼓、貝斯、鋼琴等&#xff09;分…

QTS單元測試框架

1.QTS單元測試框架介紹 目前QTS項目采用C/C語言,而CppUnit就是xUnit家族中的一員,它是一個專門面向C的單元測試框架。因此,QTS采用CppUnit測試框架是比較理想的選擇。 CppUnit按照層次來管理測試,最底層的就是TestCase,當有了幾個TestCase以后&#xff0c;可以將它們組織成Te…

dify + ollama + deepseek-r1+ stable-diffusion 構建繪畫智能體

故事背景 stable-diffusion 集成進 dify 后&#xff0c;我們搭建一個小智能體&#xff0c;驗證下文生圖功能 業務流程 #mermaid-svg-6nSwwp69eMizP6bt {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-6nSwwp69eMiz…

分享幾個論文校對相關的deepseek提示詞

論文校對 1.檢查這段文字是否有語法或風格錯誤&#xff1a;[在此處粘貼您的文本]。 2.審查我的[文件類型&#xff0c;例如&#xff0c;“論文”]中的這一段落是否有語法或風格錯誤&#xff1a;[在此處粘貼您的文本]。 3.請審查我關于[具體主題&#xff0c;例如&#xff0c;…