亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

@Service被構造兩次

@Service被構造兩次

紅顏莎娜 2019-11-15 17:04:17
我的Spring應用程序有一個問題,該應用程序啟動時會兩次創建我的@Service類。我知道這是我的配置出現的問題,就像我以前經歷過的那樣,但是我到底在做什么錯呢?我在下面布置配置的方式有什么根本錯誤嗎?(我忽略了我認為無關的所有內容)web.xml:<servlet>    <servlet-name>myapp</servlet-name>    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    <load-on-startup>1</load-on-startup></servlet><servlet-mapping>    <servlet-name>myapp</servlet-name>    <url-pattern>/</url-pattern></servlet-mapping><context-param>    <param-name>contextConfigLocation</param-name>    <param-value>        /WEB-INF/myapp-config.xml        /WEB-INF/myapp-security.xml        /WEB-INF/myapp-mvc.xml    </param-value></context-param><listener>    <listener-class>com.myapp.servlet.MyAppContextListener</listener-class></listener><listener>    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>myapp-servlet.xml<context:component-scan base-package="com.myapp" annotation-config="true" /><mvc:annotation-driven />myapp-config.xml<context:component-scan base-package="com.myapp" annotation-config="true" /><context:annotation-config />
查看完整描述

3 回答

?
絕地無雙

TA貢獻1946條經驗 獲得超4個贊

除了@GaryF的答案外,還有以下針對該問題的漂亮解決方案(用于產生的項目Spring Roo):


myapp-config.xml

<!-- Load everything except @Controllers -->

<context:component-scan base-package="com.myapp">

    <context:exclude-filter expression="org.springframework.stereotype.Controller"

        type="annotation"/>

</context:component-scan>

myapp-servlet.xml

<!-- Load @Controllers only -->

<context:component-scan base-package="com.myapp" use-default-filters="false">

    <context:include-filter expression="org.springframework.stereotype.Controller" 

        type="annotation"/>

</context:component-scan>

編輯:


<context:component-scan>從中刪除myapp-config.xml意味著,所有自動發現的帶注釋的Bean都在DispatcherServlet的上下文(即從中加載的上下文myapp-servlet.xml)中注冊。


但是,推薦的方法是將servlet的上下文用于特定于表示的內容(例如控制器),并將根上下文(myapp-config.xml)用于應用程序的核心服務。上面的解決方案使這種方法變得容易。


關于實際考慮,當您將核心服務放在servlet的應用程序上下文中時,不能從該servlet的范圍之外訪問它們,例如,從另一個servlet進行訪問(您可能需要使用另一個servlet來實現另一種訪問技術)或過濾器(例如Spring Security過濾器)。這就是在根應用程序上下文中擁有核心服務的原因。


查看完整回答
反對 回復 2019-11-15
?
揚帆大魚

TA貢獻1799條經驗 獲得超9個贊

您正在同一基本程序包上進行兩次單獨的組件掃描。刪除其中之一。


查看完整回答
反對 回復 2019-11-15
  • 3 回答
  • 0 關注
  • 661 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號