【问题标题】:Spring AspectJ not executing Before adviceSpring AspectJ 没有执行之前的建议
【发布时间】:2020-09-29 09:16:39
【问题描述】:

对于可能重复此问题(正如我在许多其他 SO 网站中看到的那样),我深表歉意,但是,我不确定此时还可以尝试什么。

我正在尝试设置一个简单的 AspectJ Spring 应用程序。一旦我有了一个工作示例,我可能会创建一个可以通过注释在我的团队中使用的通用库,所以我对使用 AspectJ 非常感兴趣,因为我认为它可以简化很多我想要做的事情做。

下面是我的代码:

AspectDemoApplication.class - 我的主要应用程序起点。我正在初始化一个新的 Account 对象并调用该方法,希望在运行时能看到该方法的建议。

public class AspectDemoApplication {
    public static void main(String[] args) {
        Account acct = new Account();
        acct.sayHello();
    }
}

Account.class - 保存方法的服务类。

public class Account {
    public String sayHello() {
        System.out.println("hello from method");
        return "hello";
    }
}

LogAspect.class - 我定义切入点和建议的方面类。

@Aspect
//@Component
public class LogAspect {
    @Pointcut(value = "execution(* com.rob.aspectdemo.Account.sayHello(..))")
    private void logBefore() { }

    @Before("logBefore()")
    public String print() {
        System.out.println("before hello");
        return null;
    }
}

AspectJConfig.class - 我的 AspectJ 配置类。大多数在线资源使用 .xml 配置,但来自 EnableAspectJAutoProxy 上的 Javadocs,它说它具有相同的功能。

@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true)
@ComponentScan(basePackages = "com.rob")
public class AspectJConfig {
    @Bean
    public LogAspect getLogAspect() {
        return new LogAspect();
    }
    @Bean
    public Account getAccount() {
        return new Account();
    }
}

build.gradle - 我的 gradle 文件显示我的依赖项(我可以看到我在外部库中有 aspectjrt.jar)。

implementation 'org.springframework:spring-core:5.2.7.RELEASE'
implementation 'org.springframework:spring-context:5.2.7.RELEASE'
implementation 'org.springframework:spring-aop:5.2.7.RELEASE'
implementation 'org.aspectj:aspectjrt:1.9.5'
implementation 'org.aspectj:aspectjweaver:1.9.5'
implementation 'org.aspectj:aspectjtools:1.9.5'

我的问题是,当我启动应用程序(调用 main() 方法)时,它能够在 Account.sayHello() 方法中打印 println 语句,但它不会在通知中打印 println。

我尝试使用这些在线指南(以及许多其他 SO 链接)但无济于事(大多数网站都声明相同的内容):

mkyong

Spring AOP

bealdung

我正在使用 IntlliJ v2020.1,即使在这个 IDE 中,我的 Before 建议旁边也有一个符号,上面写着“这个建议不建议任何方法”。但是当我使用 IDE 的 PointcutExpression Fragment 工具时,它说切入点语法是正确的。

任何帮助将不胜感激! 谢谢!

【问题讨论】:

  • 原因是您创建的帐户实例不是 Spring 托管 bean。您正在使用 new Account() 创建实例。而是从 Spring 上下文中获取 Account bean。此外,我不确定您是否正在创建 spring ApplicationContext instance 。你用的是 Spring Boot 吗?
  • 我认为应用程序无法按预期工作的主要原因是因为 1. Spring Application 上下文未创建 2. Account 实例应该是 Spring AOP 工作的 spring bean
  • 不,我不是通过 ApplicationContext 创建 bean,我现在就试试。我只是使用 Spring,没有 Spring Boot。
  • 您需要代码示例吗?我可以分享这个作为这个问题的答案
  • 如果我能得到代码示例那就太好了!

标签: spring aop aspectj spring-aop


【解决方案1】:

以下代码将创建一个 Spring 应用程序上下文并从该上下文中获取帐户 bean

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class AspectDemoApplication {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AspectJConfig.class);
        ctx.registerShutdownHook();
        Account acct = ctx.getBean(Account.class);
        acct.sayHello();
    }
}

【讨论】:

  • 谢谢!你是对的 - 应用程序上下文的东西完全飞到我的头上,再次感谢你。
猜你喜欢
  • 2014-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-29
  • 1970-01-01
相关资源
最近更新 更多