1. 程式人生 > >關於 use-default-filters 屬性的說明

關於 use-default-filters 屬性的說明

----------------------------------------------------------------------------------------------------------------------------------------------------------

筆記中提供了必要的程式碼示例,需要說明的是,大部分程式碼示例都是本人所敲程式碼並進行測試,不足之處,請大家指正~

本部落格中所有言論僅代表博主本人觀點,若有疑惑或者需要本系列分享中的資料工具,敬請聯絡 [email protected]

-----------------------------------------------------------------------------------------------------------------------------------------------------------

前言:昨天在做一個小專案時先對 SSM 進行整合,一通配置之後進行測試,發現啟動 Tomcat 就出錯了,錯誤資訊如下:

複製程式碼
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'employeeController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private
com.mybatis.ssm.service.EmployeeService com.mybatis.ssm.controller.EmployeeController.employeeService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.mybatis.ssm.service.EmployeeService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for
this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.mybatis.ssm.service.EmployeeService com.mybatis.ssm.controller.EmployeeController.employeeService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.mybatis.ssm.service.EmployeeService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
複製程式碼

檢視錯誤資訊應該是說沒有掃描到 LZ 的 Service,經過一番排查之後,LZ 將錯誤定位到了包掃描的配置上,其實也就是 use-default-filters 配置的問題上。

Step 1:先看一下LZ 的 SpringMVC 和 Spring 的配置檔案中對包掃描的配置:

SpringMVC:

1 <!-- 配置自動掃描的包 -->
2     <context:component-scan base-package="com.mybatis.ssm" use-default-filters="false">
3         <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
4     </context:component-scan>

Spring:

1 <!-- 配置自動掃描的包 -->
2     <context:component-scan base-package="com.mybatis.ssm" use-default-filters="false">
3         <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
4     </context:component-scan>

SpringMVC 主要就是來管理網站的跳轉邏輯,所以在配置掃描的包時,使用 use-default-filters 屬性,並設定為 false,即不使用預設的 Filter 進行掃描。

而 Spring 的配置檔案中,LZ 也想當然的配置了 use-default-filters 為 false,正式這個配置,導致出錯。

Step 2:錯誤分析

要分析這個錯誤,就要先了解 use-default-filters 這個屬性的作用。use-default-filters 屬性的預設值為 true,即使用預設的 Filter 進行包掃描,而預設的 Filter 對標有 @Service,@Controller和@Repository 的註解的類進行掃描,因為前面說過,我們希望 SpringMVC 只來控制網站的跳轉邏輯,所以我們只希望 SpringMVC 的配置掃描 @Controllerce 註解標註的類,不希望它掃描其餘註解標註的類,所以設定了 use-default-filters 為 false,並使用 context:include-filter 子標籤設定其只掃描帶有 @Controller 註解標註的類。

而 Spring 就不同了,我們希望 Spring 只不掃描帶有 @Controller 註解標註的類,而掃描其他註解標註的類,而這時建立在使用預設的 Filter 進行掃描的基礎上,設定了 context:exclude-filter 標籤,不掃描 @Controller 註解標註的類,所以不應該設定 use-default-filters 為 false,所以這就解釋了為什麼一開始啟動 Tomcat 時報了一個找不到 Service 的錯誤。

Step 3:總結

在使用 use-default-filters 屬性時要分清楚需要掃描哪些包,是不是需要使用預設的 Filter 進行掃描。LZ 稍微總結一下,即 use-default-filters="false" 需要和 context:include-filter 一起使用,而不能和 context:exclude-filter 屬性一起使用

Step 4:更正

Spring 的配置檔案中包掃描配置如下:

1 <!-- 配置自動掃描的包 -->
2     <context:component-scan base-package="com.mybatis.ssm">
3         <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
4     </context:component-scan>

這樣更正過來之後,再啟動 Tomcat 就沒有錯誤了!

相關推薦

context:component-scan標籤的use-default-filters屬性的作用以及原理分析

一、背景   我們在Spring+SpringMVC+Mybatis的整合開發中,經常會遇到事務配置不起作用等問題,那麼本文就來分析下出現這種問題可能的原因以及解決方式。 二、分析及原理窺探   1.專案結構      2.我們在spring-mvc.xml檔案中進行如下配置,這種方式會成功掃描到帶

關於 use-default-filters 屬性的說明

---------------------------------------------------------------------------------------------------------------------------------------------------------

Spring.cloud.gateway default-filters

序 本文主要研究下spring.cloud.gateway.default-filters 配置 { "sourceType": "org.springframework.cloud.gateway.config.GatewayProperties", "

vue.use無非就是為Vue對象註入新的方法和屬性

clas prot .proto baseurl 內容 uil common img import //我在項目中寫了個簡單的common.js export default { install: function(Vue){ Vue.prototyp

170831-關於聲式事務-事務屬性的設置

再次 提交 alt ans 可重復 except 告訴 res 技術分享 事務屬性的設置 @Transactional中的屬性值 傳播行為 propagation=Propagation.REQUIRED是默認值 會按外層事務來,當下面的事務有錯時,也會回滾 pro

使用dtd--屬性

復數 doctype 劃線 str pty 含義 spa 標識 logs <!ATTLIST 元素名 屬性名稱 屬性類型 屬性特點> 1.屬性類型 類型 含義 CDATA 純文本 enumerated 枚舉類型 ID 以屬性的方式唯一標識改元素

schema中屬性

屬性 mls 數據 string complex cnblogs org code attr <attribute name="屬性名" default="默認值" fixed="固定值" use="option|required" type="數據類型名"&

Java中什麽是匿名對象,空參構造方法輸出創建了幾個匿名對象,屬性成static

es2017 ava cit 得到 定義 屬性 自增 alt spa package com.swift; //使用無參構造方法自動生成對象,序號不斷自增 public class Person { private static int count; //如果在定

jpa/hibernate @onetomany 使用left join 添加多條件,可以使用過濾器filters (with-clause not allowed on fetched associations; use filters異常信息)

modified tran SQ fetch join vat reac sset nag package com.ipinyou.mip.dataAsset.campaignManagement.entity; import com.ipinyou.mip.util

Vue: export default中的name屬性到底有啥作用呢?

前言 又開始一個全新的專案,每天都要元氣滿滿呀~在劃分模組和建立單頁面元件時,常常寫到name。巢狀路由中,index.vue極為常見,那麼在vue中,export default { name: 'xxx'} 中的name到底有啥作用呢? 開始 還是先回到官方的文件:https://c

Eclipse報The default workspace'xxxxx' is in use or cannot be created Pl

原因:出現這種情況一般是workspace的配置檔案中出現了.lock檔案(workspace/.metadata/.lock),鎖定了workspace。把.lock檔案刪除即可。如果該檔案不能刪除,可能是因為javaw.exe程序未結束,結束該程序及eclipse.exe程序即可刪除。 正常情況下,如果

QPushButton的default和autoDefault 屬性

QPushButton類有兩個屬性:default和autodefault屬性。 (1) default屬性表示當在對話方塊中時有“Enter”鍵按下時執行此按鍵的click()事件。它的預設值是false; (2)autoDefault屬性設定為true時會影響按鍵的外觀(略微

雙擊Eclipse提示“The default workspace “xxxx” is in use or cannot be created Please choose a different on

原因 出現這種情況一般是workspace的配置檔案中出現了.lock檔案(workspace/.metadata/.lock),鎖定了workspace。 解決 把.lock檔案刪除即可。 如果該檔案不能刪除,可能是因為javaw.exe程序未結束,結束該程序及eclipse

[Vue warn]: The data property "orderId" is already declared as a prop.Use prop default value instead

在使用Vue開發中,使用元件時報了這麼一個錯誤: [Vue warn]: The data property "list" is already declared as a prop. Use prop default value instead. 翻譯的白話就是:“list

[Vue warn]: The data property "orderId" is already declared as a prop.Use prop default value instead

在使用Vue開發中,使用元件時報了這麼一個錯誤: [Vue warn]: The data property "list" is already declared as a prop. Use pr

Vue: export default中的name屬性有啥作用呢?

前言 又開始一個全新的專案,每天都要元氣滿滿呀~在劃分模組和建立單頁面元件時,常常寫到name。巢狀路由中,index.vue極為常見,那麼在vue中,export default { name: 'xxx'} 中的name到底有啥作用呢? 開始 官方文件已經給

mysql安裝提示:TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_ti

centos6 安裝 mysql5.6 有異常提示:TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see doc

How to Use Homebrew Zsh Instead of Mac OS X Default

Out of the box Mac OS X version 10.8.x (Lion) comes with zsh version 4.3.11 (i386-apple-darwin12.0). However zsh is currently at versi

java中的類成員屬性——default和protected

java類中,在不寫修飾符的情況下,類成員預設為default型別,而不是protected型別。 public class Human { int code; // 等價於 default int code; protected String name; }