是否可以从applicationContext引用使用@Service创建的bean?

时间:2014-07-02 08:43:24

标签: spring spring-mvc spring-security

我有以下情况:

appContext.xml:包含DAO mappers bean(UserMapper,RoleMapper ...)

appContext-security.xml:包含需要引用我的某个服务的http标签(UserDetailsS​​ervice)

app-servlet.xml:包含用于查找注释的标签

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

我的服务有@Service(&#34; serviceName&#34;)注释。这意味着bean是由app-servlet.xml创建的。

OpenID登录需要UserDetailsS​​ervice类工作,UserDetailsS​​ervice有一个自动装配字段(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,则其自动装配字段UserService在调试中为空:

<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 />

现在可行了

1 个答案:

答案 0 :(得分: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" />

这样,除了控制器之外的所有bean都将出现在根应用程序上下文中,因此可以在您的安全代码中访问。