Spring方面(AspectJ)似乎不起作用
我真的不知道为什么这不起作用: 所需的每个罐子都在这个地方。包括Spring方面(AspectJ)似乎不起作用,spring,spring-mvc,aspectj,spring-aop,Spring,Spring Mvc,Aspectj,Spring Aop,我真的不知道为什么这不起作用: 所需的每个罐子都在这个地方。包括aspectjrt。 基本上,我从配置类开始: @Configuration @ComponentScan(basePackages = { "some.path" }) @EnableAspectJAutoProxy public class SomeConf { ... } 然后我有我的方面: @Component @Aspect public class ControllerLoggerAspect { @Poin
aspectjrt
。
基本上,我从配置类开始:
@Configuration
@ComponentScan(basePackages = { "some.path" })
@EnableAspectJAutoProxy
public class SomeConf { ... }
然后我有我的方面
:
@Component
@Aspect
public class ControllerLoggerAspect {
@Pointcut("execution(* some.path.ATest.*(..))")
private void aspectTest() {
System.out.println("\n\n ASPECT WORKING \n\n");
}
}
在some.path
下,我有Atest
类:
打包一些.path
public class ATest {
public void dummyMethod(){
System.out.println("\n\n\nDummy static executed\n\n\n");
}
}
想象一下,现在我有了控制器:
@Controller
@RequestMapping(value = "/mapping")
public class SomeController {
@RequestMapping(value = "/something")
public ResponseEntity<String> publish(@RequestParam("Id") Long[] ids) {
//aspect should be invoked here
new ATest().dummyMethod();
return new ResponseEntity<>("{ \"status\": \"stubbed\"}", HttpStatus.OK);
}
}
@控制器
@请求映射(value=“/mapping”)
公共类控制器{
@请求映射(value=“/something”)
公共响应性发布(@RequestParam(“Id”)Long[]Id){
//应该在这里调用方面
新的ATest().dummyMethod();
返回新的响应属性(“{\”状态\“:\”存根\“}”,HttpStatus.OK);
}
}
除aspect方法外,所有方法都被正确调用。没有错误,没有例外,什么都没有。有什么想法吗?您需要配置要执行的建议。切入点仅有助于确定连接点。将执行通知,而不是切入点 您可以使用切入点“aspectTest()”编写如下建议: 或者,您可以将示例中的切入点注释替换为如下建议注释:
@Before("execution(* some.path.ATest.*(..))")
public void aspectTest() {
System.out.println("\n\n ASPECT WORKING \n\n");
}
这里是所有ADIVCE的列表:
- @在(“aspectTest()”)之前
- @之后(“aspectTest()”)
- @返回后(pointcut=“aspectTest()”,returning=“retVal”)
- @后throwing(pointcut=“aspectTest()”,throwing=“ex”)
- @周围(“aspectTest()”)
ATest
必须是一个@组件
以前尝试过的第二个解决方案不起作用。Hovever@Before(“execution(public**(..)”)显示某些方面的输出,但也会破坏程序的执行。也许您必须将方法aspectTest声明为public。否则spring将无法执行它……好的,它不会改变一件事——部分是真的,在这种情况下也是真的(自动代理)。Spring还支持CTW和LTW,两者都不需要SpringBean(请参见@Configurable
)。但是我想问题是关于SpringAOP的。SpringAOP有两种模式。不,SpringAOP总是基于代理的。没有“两种模式”。如果您在Spring中使用AspectJ,它就不再称为SpringAOP,它只是Spring中的AspectJ。它对自调用有效,因为它只是AspectJ!!!因为这就是AspectJ的工作原理,不管有没有Spring。它与Spring完全无关,AspectJ适用于任何容器或应用服务器内外的任何JVM语言。如果您使用AspectJ模式,它就不再是SpringAOP了。
@Before("execution(* some.path.ATest.*(..))")
public void aspectTest() {
System.out.println("\n\n ASPECT WORKING \n\n");
}