gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 19:55:43 27 4
gpt4 key购买 nike

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

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

其次,它同时使用注释和 XML,因为它使用注释设置其 REST Controller ,并使用 XML 设置其服务/DAO。

现在我有一个在服务上非常有效的建议,但如果在 REST Controller 上使用则根本不会触发。

这是它的相关部分:

@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 初始化的事实是方面不会在 Controller 上触发的原因吗?如果是这样,我怎样才能让它发挥作用?

谢谢,


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

这是 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 上下文(是吗?),是否会出现该方面在注释初始化上下文中根本不存在的情况?

再次感谢,

最佳答案

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

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

只需添加 aspect 和 <aop:aspectj-autoproxy >这两种配置和你的方面都应该有效。如果没有,您可能需要强制创建基于类的代理 ( <aop:aspectj-autoproxy proxy-target-class="true"> ),如果您的类未实现接口(interface)(或仅标记接口(interface),如 Serializable )就是这种情况。

关于java - 在 Spring 的单个项目中同时使用 XML 和注释配置是个坏主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19725850/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com