我有一个单独的.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上下文(是吗?),那么在注释初始化上下文中该方面根本不存在吗?
再次感谢,
答案 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。