亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

darryrzhong / 990人閱讀

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

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

Spring版本:4.3.13.RELEASE

JDK版本:1.7_u25 64位

SpringMVC的配置中為了防止Spring重復(fù)創(chuàng)建同一個類的實例,一般會用到的兩個子標簽&& 。

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

在很多配置中一般都會把spring-config.xmlspring-mvc.xml進行分開配置,這種配置可以他們保證各司其職,在web.xml的一般配置中spring-mvc.xml實例創(chuàng)建初始化是以DispatchServlet為入口,而spring-config.xml實例創(chuàng)建初始化是以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中的發(fā)生重疊,那么會導(dǎo)致一個bean被創(chuàng)建兩次,而且在spring中是存在父子容器的,spring容器是父容器,springmvc是子容器,springmvc創(chuàng)建的實例放在子容器中,spring創(chuàng)建的實例放在父容器中。

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

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

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

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

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

現(xiàn)在給定一個項目的包結(jié)構(gòu):

xin.sun.blog.controlller

xin.sun.blog.service

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



    

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

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



    

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

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

@Controller
public class MyController{

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

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

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/68326.html

相關(guān)文章

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

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

    89542767 評論0 收藏0
  • 如何利用Pandas查詢選取數(shù)據(jù)

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

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

      在Python這門語言中,有一些比較特殊的使用方法,主要用到的是雙下劃線開始和結(jié)束,正是因為如此,他還有一個比較接地氣的名字,叫做雙下方法,感興趣的話,可以詳細的為大家進行解答一下?! ∏把浴 〈蠹以趯慞ython代碼的時候有沒有這樣的疑問?! 槭裁磾?shù)學中的+號,在字符串運算中卻變成拼接功能,如'ab'+'cd'結(jié)果為abcd;而*號變成了重復(fù)功能,如'...

    89542767 評論0 收藏0
  • CSRF攻擊

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

    社區(qū)管理員 評論0 收藏0

發(fā)表評論

0條評論

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