5

我有一个 .war 应用程序,它使用 Spring 并以两种不同的方式初始化它的上下文。它同时使用注释配置和 XML 配置。所以我的第一个问题是:

这总是一种不好的做法吗?它会导致什么问题?

其次,它同时使用注解和 XML,因为它使用注解设置其 REST 控制器,并使用 XML 设置其服务/DAO。

现在我有一个在服务上效果很好的建议,但如果在 REST 控制器上使用则根本不会触发。

这是其中的一个相关部分:

@Aspect
public class SessionAwareAspect {

    private SessionManager sessionManager;

    private EngineActionResolver actionResolver;

    @Around("@annotation(sessionAware)")
    public Object authenticate(final ProceedingJoinPoint invocation, SessionAware sessionAware) {

        // some logic
    }

    @Required
    public void setSessionManager(SessionManager sessionManager) {
        this.sessionManager = sessionManager;
    }

    @Required
    public void setActionResolver(EngineActionResolver actionResolver) {
        this.actionResolver = actionResolver;
    }
}

它在上下文中初始化,如下所示:

<bean id="sessionAwareAspect" class="cayetano.pplive.core.session.SessionAwareAspect">
    <property name="sessionManager" ref="sessionManager"/>
    <property name="actionResolver" ref="engineActionResolver" />
</bean>

<aop:aspectj-autoproxy>
    <aop:include name="sessionAwareAspect" />
</aop:aspectj-autoproxy> 

所以我的第二个问题是:

上下文是用注释和 XML 初始化的事实是方面不会在控制器上触发的原因吗?如果是这样,我怎样才能使它工作?

谢谢,


部署日志中的一些附加信息。

这就是 XML bean 被实例化的方式:

Nov 01, 2013 1:02:09 PM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
[list of DAOs/Services]

.... irrelevant log
.... 50/100 lines after

Nov 01, 2013 1:02:22 PM org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor <init>
INFO: JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
Nov 01, 2013 1:02:22 PM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
[list of REST controllers]

因此,如果这实际上创建了 2 个单独的 bean 上下文(是吗?),那么在注释初始化的上下文中可能根本不存在方面吗?

再次感谢,

4

2 回答 2

5

使用哪种配置方式无关紧要,您可以混合和匹配 XML/Annotations/Java 甚至属性文件来表达您的 bean 配置。你如何混合/匹配这些并不重要。

要记住的一件事是,Bean(Factory)PostProcessors只对 bean 的定义与它们的定义相同 。注册一个创建代理并将建议(方面)应用于 bean。如果这是在由 加载的上下文中定义的,它将对.ApplicationContext<aop:aspectj-autoproxy >BeanPostProcessorContextLoaderListenerDispatcherServlet

只需将方面添加<aop:aspectj-autoproxy >到两个配置中,您的方面应该可以工作。如果没有,您可能需要强制创建基于类的代理 ( ) <aop:aspectj-autoproxy proxy-target-class="true">,如果您的类没有实现接口(或仅像Serializable

于 2013-11-01T11:59:15.787 回答
1

事实证明,问题实际上是在 web.xml 中明确定义的两个单独的上下文,我不知道。一个人只是错过了这个方面。

据我到目前为止所读到的,使用基于注释和基于 XML 的配置都不错(除了它有点不一致的事实)。在某些情况下甚至被推荐。

于 2013-11-01T14:16:34.243 回答