gpt4 book ai didi

java - AspectJ - 方法 @around 未调用

转载 作者:行者123 更新时间:2023-12-02 13:40:21 27 4
gpt4 key购买 nike

我想使用 AspetcJ 插入位于 org.apache.log4j.Category.java 文件中的 log4J 方法。

protected void forcedLog(String fqcn, Priority level, Object message, Throwable t) {
callAppenders(new LoggingEvent(fqcn, this, level, message, t));
}

最后

@Around("执行( protected void org.apache.log4j.Category.*(..))

可以。

我有什么问题?

我的方面没有被调用。

所以我做了更简单的例子 - 而且它也没有被调用。

core.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<!-- <aop:aspectj-autoproxy /> -->

<context:load-time-weaver/>


<!-- Aspect -->
<!--
<bean id="beanName" class="class.sth.ClazzName" />
<bean id="beanName2" class="class.sth.Clazz2Name" />
-->

<!-- other beans - not aspects -->
</beans>

aop.xml

<!DOCTYPE aspectj PUBLIC "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>

<weaver>
<!-- only weave classes in our application-specific packages -->
<include within="*"/>
<exclude within="org.jibx*"/>
</weaver>

<aspects>
<!-- weave in just this aspect -->
<aspect name="class.sth.ClazzName"/>
<aspect name="class.sth.Clazz2Name"/>
</aspects>

</aspectj>

当我运行 JUnit 测试时应该调用的示例 java 类 - 我清楚地看到这行代码被执行:

System.out.println("测试");

我仍然没有看到我的方面被调用。

@Aspect
@Order(3)
public class ClazzName {

@Around("call(* *println(..))")
public void testMethod(ProceedingJoinPoint joinPoint) {
Object o = joinPoint.getArgs();
System.out.println("test");
}
}

在我的应用程序中,同一 JUnit 测试 的其他方面被调用。这可以告诉我们,我们在项目中有良好的依赖关系。

@Aspect
@Order(2)
public class Clazz2Name {


@Around("@annotation(loggable)")
public Object doStuff(ProceedingJoinPoint joinPoint, Clazz2Name log) throws Throwable{
...
}

...

我的类并不总是标记为@Component,我想保持这种状态。

JUnit VM 参数

-javaagent:C:\aspectjWeaver\spring-instrument-3.0.4.jar

问题是我如何实现我的目标并让我的方面在我想要的时候被调用?

最佳答案

您实际上至少存在以下问题:

  1. 您没有阅读 Spring AOP 文档。 (抱歉,无法抗拒。)
  2. 您正在使用 Spring AOP,而不是完整的 AspectJ。不同之处在于,前者仅适用于 Spring 组件,但 Log4J 不是 Spring 组件。因此,如果您想让它工作,您需要通过加载时编织使用完整的 AspectJ,如 Spring 手册第 11.8 章,第 Using AspectJ with Spring applications 节所述。 .
  3. 即使使用完整的 AspectJ,您也需要知道您无法 Hook JDK 方法的执行,因为这些方法在实例化方面编织器之前已经加载。因此,您应该通过 call(* println(..)) Hook 方法调用,而不是 Hook 方法执行。

我不明白的是为什么你想要 Hook Log4J 和 JDK 方法。您想将调用重定向到其他 channel 吗?也许最好描述您实际想要实现的目标,而不是您认为问题应该如何实现已解决。

关于java - AspectJ - 方法 @around 未调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42766613/

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