国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

『SpringMVC』<context:include-filter>&<

darryrzhong / 941人閱讀

摘要:現在給定一個項目的包結構在中有以下配置只掃描注解可以看出要把最后的包寫上,不能包含子包,所以不能寫成。

  大家好,我是豬弟,豬在我心中從來不是蠢的代名詞,而是懶的代名詞,本次準備記錄一個在開發測試過程中遇到的問題,跟蹤了三天spring和第三方RPC組件的源碼,最終發現了問題是因為第三方組件沒有處理好而父子容器導致的,還有一個因素是spring注解掃描重疊。

Spring版本:4.3.13.RELEASE

JDK版本:1.7_u25 64位

SpringMVC的配置中為了防止Spring重復創建同一個類的實例,一般會用到的兩個子標簽&&

但它使用的時候表現的效果并不是和語義上的完全一致,現在來看一下其中的坑:

在很多配置中一般都會把spring-config.xmlspring-mvc.xml進行分開配置,這種配置可以他們保證各司其職,在web.xml的一般配置中spring-mvc.xml實例創建初始化是以DispatchServlet為入口,而spring-config.xml實例創建初始化是以ContextLoadListener為入口的,容器的加載順序: listener -> filter -> servlet ,所以spring容器先初始化,springmvc容器后初始化 。

    
    
        contextConfigLocation
        
            classpath:spring-config.xml
        
    
    
        org.springframework.web.context.ContextLoaderListener
    

    
    
        blog-spring-mvc
        org.springframework.web.servlet.DispatcherServlet
        
            contextConfigLocation
            
                classpath:spring-mvc.xml
            
        
        1
    
    
        blog-spring-mvc
        /
    

如果在spring-mvc.xml中配置掃描的包和spring-config.xml中的發生重疊,那么會導致一個bean被創建兩次,而且在spring中是存在父子容器的,spring容器是父容器,springmvc是子容器,springmvc創建的實例放在子容器中,spring創建的實例放在父容器中。

其實這同一個類的兩個實例是不同的,springmvc創建實例默認對象不實現接口(大家都知道Controller是不用實現接口的),所以springmvc創建的實例是直接使用目標類的構造器來實例化的,而不是代理對象,即使一個類實現了接口,但如果該類是由springmvc實例化,那么springmvc也會直接使用該類的構造器直接創建一個對象(怎么去證明呢,你可以寫一個定時任務,在定時任務中注入Controller的實例,然后debug查看實例對象的地址,如果是代理對象在地址上都會有一個$Proxy的標記,否則就不是代理對象),所以在controller層使用AOP時多數采用的是CGLIB子類代理。

Spring創建實例會判斷目標類是否實現了接口,如果沒實現接口那么就直接采用目標類構造器創建,像一般的service和dao都會采用接口方式編程,對于接口方式編程的類,spring創建的實例都是代理對象(這一點可以用debug的方式查看controller類中注入的service實例對象地址,他們都帶有一個$Proxy的標記,很容易就能看出都是代理對象)。

那么為了防止重疊我們要把重疊的部分去掉,現在有下面的一個需求:

spring-mvc.xml中只對工程中所有用@Controller注解的類進行掃描創建實例。

spring-config.xml中要對工程中所有的非@Controller注解的類進行掃描創建實例。

現在給定一個項目的包結構:

xin.sun.blog.controlller

xin.sun.blog.service

(1)在spring-mvc.xml中有以下配置:



    

可以看出要把最后的包寫上,不能包含子包,所以不能寫成: base-package="xin.sun.blog" 。如果這樣寫,對于 include-filter 標簽來講它會掃描基包下面所有spring注解的類,而不是僅僅掃描 @Controller 。這點需要非常的注意,這一般會導致一個常見的錯誤,那就是事務不起作用,補救的方法是添加 use-default-filters="false"

(2)在spring-config.xml中有如下配置:



    

可以看到,他是要掃描xin.sun.blog包和子包下的所有spring注解的類,但是不包含@Controller注解的類。對于exculude-filter不存在包不精確導致都進行掃描的問題。

那么還有一個問題:當掃描的包不小心重疊了,導致類在父子容器各實例化了一遍,在 @Autowire 的時候會注入哪個容器中的對象呢?看一個Controller類,代碼如下:

@Controller
public class MyController{

    @Autowired
    private IValidService validService;
    //其他代碼省略 
}

答案是:Spring為了保證注入類的一致性,采用了雙親委托的機制,如果父容器中存在該類的實例那么優先使用父容器中的實例,如果父容器中沒有該實例才會用子容器中的實例

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68326.html

相關文章

  • Python代碼太臃腫怎么辦?下給給大家總結幾個小技巧

      小編寫這篇文章的一個主要目的,主要是給大家介紹,關于如何處理代碼臃腫的事項,但是如果要處理的話,還是比較的麻煩的,那么,遇到這種問題的話,需要怎么去處理呢?下面就給大家詳細的解答下。  什么是單行代碼  你可以將單行代碼視為壓縮在一起的代碼塊,使其適合一行。它是只包含在一行中的簡潔、有用的程序。  為什么我需要它們  如果你并不喜歡寫單行代碼,或者你只是好奇為什么我們必須知道這些,那么下面是一...

    89542767 評論0 收藏0
  • 如何利用Pandas查詢選取數據

      小編寫這篇文章的主要目的,主要還是利用Pandas這門工具,去進行編程等一系列的一些操作,比如可以用來進行增刪查改等一系列的操作步驟。那么,怎么利用Pandas去查詢數據呢?下面就給大家詳細解答下。  一,Pandas查詢數據的幾種方法  df[]按行列選取,這種情況一次只能選取行或者列  df.loc方法,根據行、列的標簽值查詢  df.iloc方法,根據行、列的數字位置查詢,根據索引定位 ...

    89542767 評論0 收藏0
  • Python中雙下使用方法解析

      在Python這門語言中,有一些比較特殊的使用方法,主要用到的是雙下劃線開始和結束,正是因為如此,他還有一個比較接地氣的名字,叫做雙下方法,感興趣的話,可以詳細的為大家進行解答一下。  前言  大家在寫Python代碼的時候有沒有這樣的疑問。  為什么數學中的+號,在字符串運算中卻變成拼接功能,如'ab'+'cd'結果為abcd;而*號變成了重復功能,如'...

    89542767 評論0 收藏0
  • CSRF攻擊

    一、什么是CSRF攻擊我們常常聽到這樣一句話:默認的鏈接不要點,那些年也聽過,郵箱中的垃圾鏈接不要點。 因為可能是黑客發起的CSRF攻擊,所以在點擊之前最好是確認鏈接的安全性。CSRF(Cross-site requests forgery)中文名:跨站腳本偽造簡單的理解就是,黑客盜用了你的身份,以你的名義向你訪問的站點發送請求。這些請求操作可能是轉發郵件、獲取發送內容,發起轉賬、獲取權限等。CS...

    社區管理員 評論0 收藏0

發表評論

0條評論

darryrzhong

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<