spring mvc + spring aop + aspectj
spring mvc + spring aop + aspectj
我很难在 Spring MVC 项目中使用方面。
作为切入点的方法运行很好,但没有建议。
这里是 class,它启动了整个 spring 引导并且是 spring 上下文的根目录:
@Lazy
@SpringBootApplication
@EnableAspectJAutoProxy(proxyTargetClass=true)
@Configuration
public class MainSpringBootClass{
public static void main(String[] args)
{
SpringApplication.run(MainSpringBootClass.class, args);
}
}
这里是classwith方法,也就是切入点。
@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",在日志中我看到 "example"。
但是,我没有看到来自 spring aop 和 aspectj 的任何建议 - 我做错了什么?
我只是将这个项目用作沙箱来学习方面,所以我很想知道如何使用 Spring AOP 和 AspectJ 来学习。
对我来说最重要的是在没有 XML.
的情况下完成这一切
编辑:
我已经用 println 向 MyAspect 添加了简单的构造函数来检查它是否被创建(毕竟它是带有 @Component 的普通 spring bean)并且它确实是 - 它是由 spring.[= 正确创建的17=]
编辑 2:
IntelliJ IDEA 告诉我有关方法 login 和 login2:"This advice advices no method",但与此同时,我能够(使用 control-click)从字符串跳转,这是注释中的值以更正实现。
你只需要这样的东西:
@Aspect
@Component
public class MyAspect {
@Before("execution(* com.example.MyExampleClass.example(..))")
public void logBefore(JoinPoint pjp) throws Throwable {
System.out.println("before...");
}
}
您可能需要用 spring-boot-starter-aop
替换所有 aspectJ 依赖项。
这是一个有效的示例项目(参见 RestControllerAspect.java
):
我很难在 Spring MVC 项目中使用方面。
作为切入点的方法运行很好,但没有建议。
这里是 class,它启动了整个 spring 引导并且是 spring 上下文的根目录:
@Lazy
@SpringBootApplication
@EnableAspectJAutoProxy(proxyTargetClass=true)
@Configuration
public class MainSpringBootClass{
public static void main(String[] args)
{
SpringApplication.run(MainSpringBootClass.class, args);
}
}
这里是classwith方法,也就是切入点。
@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",在日志中我看到 "example"。 但是,我没有看到来自 spring aop 和 aspectj 的任何建议 - 我做错了什么?
我只是将这个项目用作沙箱来学习方面,所以我很想知道如何使用 Spring AOP 和 AspectJ 来学习。 对我来说最重要的是在没有 XML.
的情况下完成这一切编辑: 我已经用 println 向 MyAspect 添加了简单的构造函数来检查它是否被创建(毕竟它是带有 @Component 的普通 spring bean)并且它确实是 - 它是由 spring.[= 正确创建的17=]
编辑 2: IntelliJ IDEA 告诉我有关方法 login 和 login2:"This advice advices no method",但与此同时,我能够(使用 control-click)从字符串跳转,这是注释中的值以更正实现。
你只需要这样的东西:
@Aspect
@Component
public class MyAspect {
@Before("execution(* com.example.MyExampleClass.example(..))")
public void logBefore(JoinPoint pjp) throws Throwable {
System.out.println("before...");
}
}
您可能需要用 spring-boot-starter-aop
替换所有 aspectJ 依赖项。
这是一个有效的示例项目(参见 RestControllerAspect.java
):