Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring方面(AspectJ)似乎不起作用_Spring_Spring Mvc_Aspectj_Spring Aop - Fatal编程技术网

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()”)

Spring AOP仅对Spring Bean有效,即,如果要拦截其方法之一,则类
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");
}