我很难在Spring项目中使用方面。
作为切入点的方法运行良好,但没有通知。
下面是类,它启动整个spring引导,这是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或aspectj的任何建议--我做错了什么?
我只是把这个项目作为沙箱来学习方面,所以我很想学习如何使用Spring和AspectJ来实现它。对我来说,最重要的是在没有XML的情况下完成这一切。
编辑:我在MyAspect中添加了简单的构造函数,并使用println来检查是否创建了它(毕竟它是带有@Component的普通spring ),而且它是由spring正确创建的。
编辑2: IntelliJ IDEA告诉我有关方法登录和login2的信息:“这个建议不建议任何方法”,但同时,我可以从字符串中跳转(通过控件-单击),这就是注释中的值,以纠正实现。
发布于 2016-01-26 20:08:36
你所需要的就是这样的东西:
@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://stackoverflow.com/questions/35021008
复制相似问题