gpt4 book ai didi

java - 当与组件上的@Aspect 耦合时,Spring 忽略@Profile 注释

转载 作者:行者123 更新时间:2023-11-29 04:23:18 25 4
gpt4 key购买 nike

我遇到了一个问题,@Profile 没有对使用 @Aspect 注释的方面生效。即使我的 spring 配置文件未激活,方面也将始终被调用,我查看了如下多个来源,它们似乎声称 @Profile@Aspect 应该允许启用或禁用基于配置文件激活的方面。

http://city81.blogspot.co.uk/2012/05/using-spring-profile-with.html

using Spring @Profile in @Aspect

下面是我的代码;

虚拟方面

@Component
@Profile("sdfkljklf")
@Aspect
public class DummyAspect implements InitializingBean {
public DummyAspect() {
System.out.println("Constructor: " + getClass().getName());
}

@Override
public void afterPropertiesSet() throws Exception {
System.out.println("afterpropertiesSet: " + getClass().getName());
}

@Pointcut("execution(public * spring.desai.common.repository.*.*(..))")
public void pointcut() {
}

@Before("pointcut()")
public void beforeMethod(final JoinPoint jp) {
System.out.println("Entering: " + jp.toLongString());
}

@AfterReturning(pointcut = "pointcut()", returning = "retValue")
public void afterMethod(final JoinPoint jp, Object retValue) {
System.out.println("Exiting " + jp.toLongString());
}
}

根据我的理解,只有当配置文件 sdfkljklf 被激活时,才应该初始化和应用这个方面。然而,每当我的任何符合条件的存储库方法被调用时,我都可以从控制台的方面看到系统输出条目。这是一个 spring boot 应用程序,所以我可以在其中看到以下内容,其中表示配置文件 sdfkljklf 未激活。

2017-12-14 16:25:19,374 [INFO ] SpringBootApp : The following profiles are active: jdbc,embedded,rmiEnabled

另一个有趣的观察是,这个方面在应用程序部署时不会初始化,而只会在第一次调用存储库方法时初始化。我通过在构造函数和 afterPropertiesSet 方法中放置系统输出日志来发现这一点。下面是应用程序完成启动时的日志摘录,然后我调用我的休息端点,该端点又调用服务 -> 存储库 -> 数据库;

2017-12-14 16:27:48,325 [INFO ] TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2017-12-14 16:27:48,340 [INFO ] SpringBootApp : Started SpringBootApp in 5.13 seconds (JVM running for 5.611)
Dec 14, 2017 4:27:49 PM org.apache.catalina.core.ApplicationContext log
INFO: Initializing Spring FrameworkServlet 'dispatcherServlet'
2017-12-14 16:27:49,873 [INFO ] DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization started
2017-12-14 16:27:49,891 [INFO ] DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization completed in 17 ms
2017-12-14 16:27:49,946 [INFO ] HomeController : returning home
2017-12-14 16:27:50,432 [WARN ] PageNotFound : No mapping found for HTTP request with URI [/web-console/resources/style.css] in DispatcherServlet with name 'dispatcherServlet'
Constructor: dummy.pckg.DummyAspect
Entering: execution(public spring.desai.common.model.Persistable spring.desai.common.repository.impl.jdbc.BaseJdbcRepository.findById(java.lang.String))
Exiting execution(public spring.desai.common.model.Persistable spring.desai.common.repository.impl.jdbc.BaseJdbcRepository.findById(java.lang.String))
Entering: execution(public java.util.Collection spring.desai.common.repository.impl.jdbc.SubjectRepositoryImpl.getSubjectsForStudentId(java.lang.String))
Exiting execution(public java.util.Collection spring.desai.common.repository.impl.jdbc.SubjectRepositoryImpl.getSubjectsForStudentId(java.lang.String))
Entering: execution(public java.util.Collection spring.desai.common.repository.impl.jdbc.PaymentRepositoryImpl.findByStudentId(java.lang.String))
Exiting execution(public java.util.Collection spring.desai.common.repository.impl.jdbc.PaymentRepositoryImpl.findByStudentId(java.lang.String))
Entering: execution(public java.util.Collection spring.desai.common.repository.impl.jdbc.ScholarshipRepositoryImpl.findByStudentId(java.lang.String))
Exiting execution(public java.util.Collection spring.desai.common.repository.impl.jdbc.ScholarshipRepositoryImpl.findByStudentId(java.lang.String))

没有堆栈跟踪,因为没有错误,但我无法弄清楚是什么导致它忽略 @Profile 注释?

我试过以下方法都无济于事;

  • 清理构建项目
  • 重新启动 STS 并通过在重新启动时手动删除目标文件夹来清理构建。
  • 更改了切面类的名称以确保它没有被任何硬编码 bean 定义初始化。
  • 将其放置在具有不同根目录的完全不同的包中,以确保它不会被任何错误的 componentScan 扫描
  • 在整个 spring 框架上启用 DEBUG 日志,以查看在初始化此方面之前记录的内容,但是没有什么接近根本原因。
  • 通过以下代码在我的其余 Controller 中 Autowiring 应用程序上下文并打印 bean 定义名称列表。但是,该方面未在部署时初始化,因此不在那里;

    for(String s : context.getBeanDefinitionNames()) {   
    System.out.println(s);
    }

我在 java 7 上使用带有 spring 4.3.2 和 sprint-boot 1.4.0 的 aspectj 1.8.6。任何帮助将不胜感激。如果需要更多详细信息,请告诉我;

最佳答案

这对我有用:

@Configuration
public class AopConfiguration {

@Aspect
@EnableAspectJAutoProxy
@Profile("my_profile")
static class AopRule1 {

@Around("/*some rules*/")
public Object doAop(ProceedingJoinPoint joinPoint) throws Throwable {
//logic
}
}
}

关于java - 当与组件上的@Aspect 耦合时,Spring 忽略@Profile 注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47818300/

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