如何设置的财产价值使用的定制标注和弹AOP?

0

的问题

我想使用的定义Java注中插入一个值在私人类财产的使用弹簧AOP(和/或模型或许). 简单的例子:

MyAnnotation.java:

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD })
public @interface MyAnnotation {
}

MyController.java:

public class MyControllerImpl implements MyController {

    ...
    
    @MyAnnotation
    private String var1;

    @Override
    public String getVarExample() {
       // imagine this is a REST API that gets called on @GET
       // request and returns a string

       System.out.println(this.var1); // <-- I'd like this to be "helloworld"
                                    // this is just for illustration
                                    // of course, I will want to do 
                                    // something more meaningful with
                                    // the 'var1' variable
       return "ok"; <- unimportant for this example
    }
    ...

MyAspect.java:

@Aspect
@Component
public class MyAspect {

    @Pointcut("@annotation(com.mypackage.annotation.MyAnnotation)")
    public void fieldAnnotatedWithMyAnnotation() {
        
    }

    @Around("fieldAnnotatedWithMyAnnotation()")
    public Object enrichVar1(ProceedingJoinPoint pjp) throws Throwable {
        
        // problem #1 - the program never enters here
        // problem #2 - I need to figure out how to set up the var1 here
        //              to "helloworld" , how?
        return pjp.proceed();
    }
    ...
}

什么我喜欢来发生的?

我会打电话和获得进入 getVarExample() 后它返回 我想看看"案" 控制或记录。 我想以某种方式设置 var1 一定值采用AOP。 任何财产的变量将被标注了 @MyAnnotation 将设置为"建". 我希望上述例子是清楚的。

什么我有没有试过吗?

我确定没有错字中包名,也摆弄不同AOP咨询意见的注释喜欢 @Around@Before. 我也尝试了不同的目标 MyAnnotation 并且结束了 ElementType.FIELD 这应该是正确的。

你能帮助我得到它的工作?

我知道这是可以做到的,但无法找到任何工作,例如在线。 再次,我要看看2的答案:

1. 怎么得到的切入点的触发MyController入口? 我想要抓住一个断点的内部 enrichVar1(..) 方法 MyAspect 类。

2. 我怎么可以修改附加说明的 var1enrichVar1(..) 方法 MyAspect 课吗?

我不知道我在做什么错误的。 任何帮助,将不胜感激。 谢谢你!

AOP设置正确,在我的项目。 我知道因为我已经使用AOP不同的东西,(日志为例)。

更新#1:

请注意有没有吸气,或者以为 var1 私人可变的。 变量将仅仅用于内 MyControllerImpl. 为了说明这个更好的我改变了回返值 getVarExample.

annotations aspectj java spring
2021-11-22 12:02:25
2

最好的答案

3

就像我说的在我的评论:

切入点点 @annotation() 拦截附加说明的方法,不附加说明的领域。 为此,本机模型或许有 get()set(). 即, 切入点还将需要改变,如果迁移到模型或许. 但我同意,坚持春AOP和注释吸气的方法,而不是的领域是能够在这里。

但因为你坚持要保留控制器类保持不变,这里是本机模型或许解决方案。 请阅读一章 使用的模型或许有弹簧应用 对于如何配置, @EnableLoadTimeWeaving 和JVM参数 -javaagent:/path/to/aspectjweaver.jar.

为了证明这种方案真的不会独立工作的弹簧,我使用没有弹簧类或标注所有,唯独和当地模型或许. 你可以简单地这样做在你的春应用程序。 请注意,母样aspect方面不需要 @Component 注解、与此相反弹AOP方面。

package de.scrum_master.app;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD })
public @interface MyAnnotation {}
package de.scrum_master.app;

public interface MyController {
  String getVarExample();
}
package de.scrum_master.app;

public class MyControllerImpl implements MyController {
  @MyAnnotation
  private String var1;

  @Override
  public String getVarExample() {
    System.out.println(this.var1);
    return "ok";
  }
}
package de.scrum_master.app;

public class Application {
  public static void main(String[] args) {
    MyController myController = new MyControllerImpl();
    myController.getVarExample();
  }
}
package de.scrum_master.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class MyAspect {

  @Pointcut("get(@de.scrum_master.app.MyAnnotation * *)")
  public void fieldAnnotatedWithMyAnnotation() {}

  @Around("fieldAnnotatedWithMyAnnotation()")
  public Object enrichVar1(ProceedingJoinPoint pjp) throws Throwable {
    System.out.println(pjp);
    return "helloworld";
  }
}

时运行 Application控制台日志将是:

get(String de.scrum_master.app.MyControllerImpl.var1)
helloworld

这样aspect手册解释了法 领域得到并设置的连接点签名领域的图案.


注: 我认为,你的使用情况可能是一个黑客,而不是一个有效的应用程序的设计。 你应该"重构",而不是侵入的一个程序是这样。

2021-11-24 21:34:25

我要感谢你! 这是我一直在寻找什么和我花了很多尝试,以获得它的工作。 我仍然不知道如何将其纳入春天正确,但这是另一个话题。 谢谢您的时间和奖金是你的!
user3732445
0

因为它不从 春天文档 弹AOP并支持春季豆'方法的执行加入点。 让领域访问,加入点的工作需要使用 模型或许是后端负载时织 为AOP。

但对于你的情况这是不需要使用领域的连接点,你可以把你的注释在吸气,这应工作。

2021-11-24 20:53:57

准确。 顺便说一句,切入点点 @annotation() 拦截附加说明的方法,不附加说明的领域。 为此,本机模型或许有 get()set(). 即, 切入点还将需要改变,如果迁移到模型或许. 但我同意,坚持春AOP和注释吸气的方法,而不是的领域是能够在这里。
kriegaex

@geobreze我很欣赏你响应,但这不是有帮助的。 我找到的链接通过自己并没有任何工作的例子对我的情况。
user3732445

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................