在使用Spring的单个项目中同时使用XML和注释配置是不是一个坏主意?

时间:2013-11-01 11:27:07

标签: java spring aop spring-aop

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

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

其次它使用注释和XML,因为它使用注释及其使用XML的Services / DAO来设置其REST控制器。

现在我有一个在服务上运行良好的建议,但如果在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上下文(是吗?),那么在注释初始化上下文中该方面根本不存在吗?

再次感谢,

2 个答案:

答案 0 :(得分:5)

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

要记住的一件事是,Bean(Factory)PostProcessors仅对相同 ApplicationContext中的bean进行操作。<aop:aspectj-autoproxy >注册BeanPostProcessor 1}}创建代理并将建议(方面)应用于bean。如果这是在ContextLoaderListener加载的上下文中定义的,那么它将对DispatcherServlet加载的上下文中的bean不执行任何操作。

只需在两个配置中添加方面和<aop:aspectj-autoproxy >,您的方面就可以正常运行。如果没有,您可能需要强制创建基于类的代理(<aop:aspectj-autoproxy proxy-target-class="true">),如果您的类没有实现接口(或只有Serializable等标记接口),则会出现这种情况。 / p>

答案 1 :(得分:1)

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

据我所知,到目前为止,使用基于注释和基于XML的配置都是不错的(除了它有点不一致的事实)。它甚至是recommended in some cases