Spring AspectJ 未执行之前的建议
Spring AspectJ not executing Before advice
我很抱歉可能会重复这个问题(正如我在许多其他 SO 站点中看到的那样),但是,我不确定此时还可以尝试什么。
我正在尝试设置一个简单的 AspectJ Spring 应用程序。一旦我有了一个工作示例,我可能会创建一个可以通过注释在我的团队中使用的公共库,所以我对使用 AspectJ 非常感兴趣,因为我认为它可以简化我正在尝试的很多事情做。
下面是我的代码:
AspectDemoApplication.class - 我的主要应用程序起点。我正在初始化一个新的 Account 对象并调用该方法,希望我能在 运行 时看到针对此方法的建议。
public class AspectDemoApplication {
public static void main(String[] args) {
Account acct = new Account();
acct.sayHello();
}
}
Account.class - 保存该方法的服务 class。
public class Account {
public String sayHello() {
System.out.println("hello from method");
return "hello";
}
}
LogAspect.class - 我的方面 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 配置 class。大多数在线资源使用 .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 语句,但它不会在建议。
我试过使用这些在线指南(以及许多其他 SO 链接)但无济于事(大多数网站都说同样的事情):
我正在使用 IntlliJ v2020.1,甚至在这个 IDE 中,我在我的 Before 建议旁边有一个符号,上面写着 "This advice advises no methods"。但是当我使用 IDE 的 PointcutExpression Fragment 工具时,它说切入点语法是正确的。
如有任何帮助,我们将不胜感激!
谢谢!
以下代码将创建一个 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();
}
}
我很抱歉可能会重复这个问题(正如我在许多其他 SO 站点中看到的那样),但是,我不确定此时还可以尝试什么。
我正在尝试设置一个简单的 AspectJ Spring 应用程序。一旦我有了一个工作示例,我可能会创建一个可以通过注释在我的团队中使用的公共库,所以我对使用 AspectJ 非常感兴趣,因为我认为它可以简化我正在尝试的很多事情做。
下面是我的代码:
AspectDemoApplication.class - 我的主要应用程序起点。我正在初始化一个新的 Account 对象并调用该方法,希望我能在 运行 时看到针对此方法的建议。
public class AspectDemoApplication {
public static void main(String[] args) {
Account acct = new Account();
acct.sayHello();
}
}
Account.class - 保存该方法的服务 class。
public class Account {
public String sayHello() {
System.out.println("hello from method");
return "hello";
}
}
LogAspect.class - 我的方面 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 配置 class。大多数在线资源使用 .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 语句,但它不会在建议。
我试过使用这些在线指南(以及许多其他 SO 链接)但无济于事(大多数网站都说同样的事情):
我正在使用 IntlliJ v2020.1,甚至在这个 IDE 中,我在我的 Before 建议旁边有一个符号,上面写着 "This advice advises no methods"。但是当我使用 IDE 的 PointcutExpression Fragment 工具时,它说切入点语法是正确的。
如有任何帮助,我们将不胜感激! 谢谢!
以下代码将创建一个 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();
}
}