2014-07-02 84 views
0

我有以下情況:是否可以引用使用applicationContext中的@Service創建的bean?

appContext.xml:包含DAO映射器豆(UserMapper,角色映射...)

appContext-security.xml文件:包含需要我服務的一個參考HTTP標籤(UserDetailsS​​ervice中)

APP-servlet.xml中:包含標籤找到註解

<context:component-scan base-package="com.example.myapp"/> 
<mvc:annotation-driven/> 

我的服務有@Service( 「服務名」)註解。這意味着bean是由app-servlet.xml創建的。

OpenID登錄需要的UserDetailsS​​ervice類的工作和UserDetailsS​​ervice中有一個自動裝配Autowired場(UserService)這是我的appContext-security.xml文件:

<security:http auto-config="true"> 
    <security:intercept-url pattern="/welcome*" access="ROLE_USER, ROLE_ADMIN" /> 
    <security:intercept-url pattern="/user/*" access="ROLE_USER, ROLE_ADMIN" /> 
    <security:intercept-url pattern="/rest/*" access="ROLE_USER, ROLE_ADMIN" /> 
    <security:intercept-url pattern="/admin/*" access="ROLE_ADMIN" /> 
    <security:logout logout-success-url="/" /> 
    <security:openid-login default-target-url="/welcome" authentication-failure-url="/loginfailed" user-service-ref="userDetailsService"/> 
    <security:form-login login-page="/login" default-target-url="/welcome" authentication-failure-url="/loginfailed" /> 
    <security:access-denied-handler ref="openIdAuthFailureHandler"/> 
</security:http> 

我猜是因爲它是由創建我不是指的UserDetailsS​​ervice app-servlet.xml,它是根配置文件(appContext.xml和appContext-security.xml)的子代

如果我嘗試在appContext-security.xml中聲明UserDetailsS​​ervice,它的autowired字段UserService在調試時爲null :

<bean id="userDetailsService" class="com.example.myapp.service.impl.UserDetailsServiceImpl"/> 

難道這是一個解決方案分裂掃描?也許,在appContext.xml中掃描服務並僅在app-servlet中掃描控制器可能是一個好主意,但我不知道它是否合理。

我想通過@Service註釋UserDetailsS​​ervice並獲得對appContext-security.xml的引用。這是我的主要問題。我可以參考使用appContext-security.xml中的@Service創建的UserDetailservice嗎?如果不是,我需要什麼變化?

正確答案將被投票。

編輯:

我做了以下內容:

appContext.xml:

<context:component-scan base-package="com.example.myapp"> 
    <context:exclude-filter type="regex" expression="com\.example\.myapp\.controller..*"/> 
</context:component-scan> 

APP-servlet.xml中:

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

<!-- Enabling Spring MVC configuration through annotations --> 
<mvc:annotation-driven /> 

現在,它的工作原理

+0

爲什麼不只掃描控制器中'app-servlet.xml'中的包和'appContext.xml'中的其餘包?這可能會解決你的問題 – geoand

+0

現在我做到了。謝謝@geonand – mannuk

+0

我會將其添加爲未來讀者輕鬆找到的答案。如果爲了幫助未來的讀者而不麻煩,請接受它 – geoand

回答

0

你全部要做的就是改變你的組件掃描。

appContext.xml(根應用上下文中的配置)

<context:component-scan base-package="com.example.myapp"> 
     <context:exclude-filter type="regex" expression="com\.example\.myapp\.controller..*"/> 
     <!--or use this instead 
     <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> 
     --> 
    </context:component-scan> 

app-servlet.xml(用於web應用上下文中的配置)

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

這樣除了控制器所有豆將存在於根應用程序上下文,因此可以在您的安全代碼中訪問。

相關問題