gpt4 book ai didi

java - Spring @AspectJ : Advice not applied

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:10:40 24 4
gpt4 key购买 nike

我试图在调用 start();

之前编入代码

这是我要建议的 TestClass:

package com.test;

public class TestClass {

public static void main(String[] args) {

new TestClass().start();
}
private void start() {

System.out.println("Test started");
}
}

这是包含建议的方面:

package com.test;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LogAspect {

@Before("call(void com.test.TestClass.start())")
public void logBefore(JoinPoint joinPoint) {
System.out.println("logBefore() is running");
}

}

这是我的 spring.xml:

    <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"
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 ">

<aop:aspectj-autoproxy/>
<context:annotation-config/>
<context:component-scan base-package="com.test"/>

我也试过像这样在 XML 中显式命名 bean:

<aop:aspectj-autoproxy/>
<bean id="test" class="com.test.TestClass" />
<bean id="aspect" class="com.test.LogAspect" />

这是我的项目设置(我使用的是 Spring Tool Suite 3.1.0 版):

Project setup

结果是 TestClass.start 被调用得很好,但是建议没有被应用。

我必须更改什么才能应用建议?

谢谢。

编辑:我终于让它工作了:

根据您的建议编辑我的代码后,我查看了这个 tutorial .这促使我让我的 TestClass 实现一个接口(interface)。这解决了问题。

这是我的最终设置:

final setup

TestClass 包括它的接口(interface):

package com.test;

import org.springframework.context.support.ClassPathXmlApplicationContext;

interface TestClass {
void start();
}

public class TestClassImpl implements TestClass {

public static void main(String[] args) {
ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(
"Spring-Config.xml");

TestClass t1 = (TestClass) appContext.getBean("myTest");
t1.start();
}

@Override
public void start() {
System.out.println("test");
}
}

方面:

package com.test;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class LogAspect {
@Before("execution(void com.test.TestClass.start(..))")
public void logBefore(JoinPoint joinPoint) {

System.out.println("logging before "
+ joinPoint.getSignature().getName());
}
}

和 Spring-Config.xml

<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"
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 ">

<aop:aspectj-autoproxy/>
<bean id="myTest" class="com.test.TestClassImpl" />
<bean id="logAspect" class="com.test.LogAspect" />

</beans>

感谢您的帮助。

最佳答案

call AspectJ 切入点适用于从另一个类调用 的方法。当您自己直接调用它时,您应该使用 execution 切入点,因此更改:

@Before("call(void com.test.TestClass.start())")

@Before("execution(void com.test.TestClass.start())")

同时让 Spring 创建 bean,而不是您自己直接创建。


另外: 注意,您可以将 Spring XML 文件与 src/resources 中的源文件分开,它们将被提取通过 ClassPathXmlApplicationContext

关于java - Spring @AspectJ : Advice not applied,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14071619/

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