弹簧MVC + 弹簧AOP + AspectJ



我在Spring MVC项目中很难使用方面。

切入点的方法运行良好,但没有建议。

这是

类,它开始了整个春季启动,这是 spring 上下文的根源:

@Lazy
@SpringBootApplication
@EnableAspectJAutoProxy(proxyTargetClass=true)
@Configuration
public class MainSpringBootClass{
    public static void main(String[] args)
    {
        SpringApplication.run(MainSpringBootClass.class, args);
    }
}
这是

带有方法的类,这是切入点的。

@Component
@Log
@Aspect
@EnableAspectJAutoProxy(proxyTargetClass=true)
public class MyExampleClass
{
    public void example()
    {
        System.out.println("example");
    }
}

这是我的方面:

@Aspect
@Component
@EnableAspectJAutoProxy(proxyTargetClass=true)
public class MyAspect implements MethodBeforeAdvice
{
    @Pointcut("execution(* com.example.MyExampleClass.example())")
    public void asd()
    {
        // pointcut
    }
    @Before("asd()")
    public void login()
    {
        System.out.println("im am logging in");
    }
    @Before("execution(* com.example.MyExampleClass.example())")
    public void login2()
    {
        System.out.println("im am logging in2");
    }
    @Override
    public void before(Method method, Object[] args, Object target) throws Throwable
    {
        System.out.println("aop before");
    }
}

这是我的控制器:

@RestController
@EnableAspectJAutoProxy(proxyTargetClass=true)
public class MyExampleController
{
    private final MyExampleClass myExampleClass;
    @Inject
    public AdController(MyExampleClass myExampleClass)
    {
        this.myExampleClass = myExampleClass;
    }
    @RequestMapping("/")
    public String index()
    {
        myExampleClass.example();
        return "x";
    }
}

如您所见,我一直在尝试使用注释暴力破解正确的结果。我也在一些网站上看到,我需要特定的依赖项,所以这里是我的(仅粘贴那些与方面相关的依赖项):

compile 'org.springframework:spring-aop:+'
compile 'org.aspectj:aspectjrt:+'
compile 'org.aspectj:aspectjweaver:+'
compile 'cglib:cglib:+'
compile 'cglib:cglib-nodep:+'

所有依赖项均已成功下载,项目编译并运行良好。当我点击 localhost:8080 时,我看到返回值"x",在日志中我看到"示例"。但是,我没有看到春季aop或方面的任何建议-我做错了什么?

我只是将这个项目用作沙盒来学习方面,所以我渴望学习,如何使用Spring AOP和AspectJ中的每一个来做到这一点。对我来说,最重要的是在没有XML的情况下完成所有工作。

编辑:我已经使用 println 向 MyAspect 添加了简单的构造函数来检查它是否被创建(因为它毕竟是带有@Component的普通春豆)并且它确实如此 - 它是由 spring 正确创建的。

编辑2:IntelliJ IDEA 告诉我有关方法登录和登录 2:"此建议不建议任何方法",但同时,我能够从字符串跳转(通过控制单击),即注释中的值以更正实现。

你所需要的只是这样的东西:

@Aspect
@Component
public class MyAspect {
    @Before("execution(* com.example.MyExampleClass.example(..))")
    public void logBefore(JoinPoint pjp) throws Throwable {
        System.out.println("before...");
    }
}

您可能需要将所有 aspectJ 依赖项替换为 spring-boot-starter-aop

这是一个有效的示例项目(见RestControllerAspect.java):

https://github.com/khoubyari/spring-boot-rest-example

最新更新