Java Spring AOP-@在未执行之前
我试图使用带有就地切入点表达式的Java Spring AOP-@在未执行之前,java,spring-aop,pointcut,Java,Spring Aop,Pointcut,我试图使用带有就地切入点表达式的@Before通知来实现一个简单的SpringAOP(v4)示例,但没有调用aspect方法。我拥有所有必需的依赖项(SpringAOP、aopalliance、aspectweaver)。我做错了什么 package com.xyz; public class TestClass { @PostConstruct public void init() { test(); } public void test()
@Before
通知来实现一个简单的SpringAOP(v4)示例,但没有调用aspect方法。我拥有所有必需的依赖项(SpringAOP、aopalliance、aspectweaver)。我做错了什么
package com.xyz;
public class TestClass {
@PostConstruct
public void init() {
test();
}
public void test() {
...
}
}
这方面:
@Aspect
@Component
public class MyAspect{
@Before("execution(* com.xyz.TestClass.test())")
public void beforeTest() {
...
}
}
没有执行AOP的原因是,
TestClass.test()
没有在spring上下文中调用,而是从TestClass.init()
进行简单/简单的调用
要测试您的设置,请将其修改为与下面类似的内容,以便TestClass.test()
调用由spring管理
package com.xyz;
public class TestClass {
public void test() {
...
}
}
将TestClass
注入另一个类,比如说AnotherTestClass
,然后从那里调用test
方法
package com.xyz;
public class AnotherTestClass {
@Autowired
private TestClass testClass;
public void anotherTest() {
testClass.test();
}
}
是否启用了Spring自动代理?您是如何创建
TestClass
的实例的?TestClass
是在我的应用程序上下文中定义的bean。当应用程序启动时,它会在整个生命周期中运行,但切点永远不会被击中。我在应用程序上下文中也有
。还需要什么吗?在我的示例中,TestClass
是一个spring管理的bean。它是在应用程序上下文中定义的。这还不够吗?不,正如我在回答要拦截的TestClass.test()
时提到的,应该通过另一个bean调用它。同一bean中的普通调用不会影响已注册的方面?TestClass
无法自动连接。但是,我可以将其设置为一个bean(在应用程序上下文中定义),它通过另一个testclass
的构造函数(在应用程序上下文中定义的另一个bean)进行设置。有没有办法让它与给定的设置一起工作?谢谢如果两个bean都是在相同的上下文中定义的,那么您可以很好地自动关联它们。有什么具体的原因让你认为它不可能是这样的吗?没有太多的细节,这只是bean和应用程序的本质。