วิธีที่จะตั้งค่าทรัพย์สินมีค่าการใช้งานจาวากำหนดหมายเหตุประกอบ annotation tool และฤดูใบไม้ผลิ AOP?

0

คำถาม

ฉันอยากจะใช้สีกำหนดเองของจาวาหมายเหตุประกอบ annotation tool ต้องใส่ค่าส่วนตัวในการเรียนทรัพย์สินโดยใช้ฤดูใบไม้ผลิ AOP(และ/หรือ AspectJ). เร็วตัวอย่าง:

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() และหลังจากมันกลับมา ฉันอยากจะเห็น"helloworld" ในคอนโซลหรือของบันทึกการปฏิบัติ ฉันต้องสักตั้ง var1 ต้องการกำหนดค่าใช้ AOP. มีทรัพย์สินตัวแปรนั้นจะถูก annotated กับ @MyAnnotation จะถูกตั้งค่าเป็น"helloworld". ฉันหวังว่าตัวอย่างอยู่เหนือมันชัดอยู่แล้ว

อะไรฉันพยายามหรอ?

ดิฉันไปตรวจสอบให้แน่ใจว่าไม่มี typo อยู่ในห่อของชื่อเหมือนกั fiddled กับต่างออก AOP คำแนะนำหมายเหตุประกอบเหมือน @Around แล้ว @Before. ฉันยังพยายามแตกต่างเป้าหมายใน MyAnnotation และลงเอยกับ ElementType.FIELD ซึ่งน่าจะถูกต้อง

คุณสามารถช่วยฉันจะเอามันไปทำงานเหรอ?

ฉันรู้ว่ามันสามารถทำได้แต่ไม่สามารถหางานตัวอย่างเช่นทางออนไลน์ อีกครั้ง,ฉันอยากจะเห็น 2 คำตอบ:

1. วิธีที่จะเอา pointcut ต้องกระตุ้นใน MyController ทางเข้า? ฉันอยากจะจับเป็นจุดหยุดข้างใน enrichVar1(..) วิธีการของ MyAspect ห้องเรียน

2. จะให้ฉันแก้ไขค annotated var1 ค่าอยู่enrichVar1(..) วิธีการของ MyAspect ห้องเรียนด้วยได้ไม๊?

ฉันไม่รู้ว่าฉันทำอะไรผิดพลาด ที่เขาแนะนำให้ผูกผ้ากันเปื้อนจะเป็น greatly นเกียรติอย่างยิ่ง ขอบคุณ!

ที่ AOP จะถูกตั้งขึ้นอย่างถูกต้องในโครงการ ฉันรู้เพราะฉันแล้วใช้ AOP สำหรับในสิ่งที่แตกต่างกันออก(การทำปูมบันทึกสำหรับตัวอย่าง).

ปรับปรุง#1:

ได้โปรดโน้ตไว้มันไม่ใช่รักหรื setters สำหรับ var1 ส่วนตัวตัวแปร ตัวแปรจะถูกใช้ภายใน MyControllerImpl. ต้อง illustrate มันจะดีกว่าถ้าฉันเปลี่ยนกลับค่า getVarExample.

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

คำตอบที่ดีที่สุด

3

เหมือนที่ฉันบอกว่าในความคิดเห็นของฉัน:

ที่ pointcut designator @annotation() intercepts annotated วิธีการของไม่ใช่ annotated ฟิลด์ สำหรับนั้นเป็นชนพื้นเมืองที่มี AspectJ get() แล้ว set(). ฉัน e., ที่ pointcut จะยังต้องการที่ต้องการเปลี่ยนแปลงถ้าการย้ายฐานต้อง AspectJ. แต่ฉันเห็นด้วยที่ต้องทำตามฤดูใบไม้ผลิ AOP และ annotating getter วิธีการของแทนที่จะเป็นของช่องข้อมูลอาจจะเป็นเพียงพออยู่ที่นี่

แต่เพราะว่าคุณยืนยันว่าคุณต้องการที่ controller เรียน....ไม่เปลี่ยนแปลงนี่คือที่เป็นชนพื้นเมืองที่ AspectJ ทางออกหรอกนะ ได้โปรดอ่านบทที่ ใช้ AspectJ กับฤดูใบไม้ผลิโปรแกรม สำหรับวิธีที่จะปรับแต่งอย่างนั้นกับ @EnableLoadTimeWeaving และ JVM พารามิเตอร์ -javaagent:/path/to/aspectjweaver.jar.

เพื่อแสดงให้เห็นว่านี่แก้ปัญหาจริงๆมันทำงานเป็นอิสระแยกจากฤดูใบไม้ผลิผมจะได้ใช้ไม่ฤดูใบไม้ผลิเรียนหรือหมายเหตุประกอบที่ทุกคนเดียวที่ POJOs และเป็นชนพื้นเมืองที่ AspectJ. คุณสามารถเพียงทำแบบเดียวกันในฤดูใบไม้ผลิของคุณโปรแกรม โปรดจำไว้ว่าเป็นชนพื้นเมืองที่ AspectJ งๆไม่ต้องการ @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

ที่ AspectJ คู่มือธิบายเรื่องรูปแบบการสั่งงานของ สนามได้แล้วตั้งเข้าร่วมประเด็นลายเซ็น และ สนามรูปแบบ.


ข้อควรจำ: ฉันคิดว่านั่นของคุณใช้กรณีอาจจะเป็นแฮ็คมากกว่าที่ถูกต้องโปรแกรมการออกแบบ คุณควรจะ refactor มากกว่าแฮคเข้าไปในโปรแกรมแบบนี้

2021-11-24 21:34:25

ฉันอยากจะขอบคุณ! นี่คือสิ่งที่ฉันกำลังมองหาและมันต้องใช้ฉันเป็นอย่างมากมายทำการทดลองเพื่อให้มันทำงานอยู่ ฉันยังไม่รู้วิธีที่จะ incorporate นมันเป็นฤดูใบไม้ผลิเหมาะสมแต่นั่นเป็นอีกเรื่อง ขอบคุณสำหรับเวลาของคุณและเงินรางวัลเป็นของคุณ!
user3732445
0

เหมือนมันไปจาก ฤดูใบไม้ผลิ docs ฤดูใบไม้ผลิ AOP ยังสนับสนุนฤดูใบไม้ผลิถั่ว'วิธีการประมวลผลร่วมกับคะแนน. เพื่อทำให้สนามรเข้าใช้งานร่วมกับจุดทำงานคุณต้องการที่จะใช้ AspectJ นปรับแต่งโปรแกรมเบื้องหลังกับรถโหลดเวลาพิมพ์แบบสาน สำหรับ AOP.

แต่สำหรับคดีของคุณมันไม่ต้องใช้สนามร่วมกับคะแนนคุณสามารถใส่ของคุณหมายเหตุประกอบ annotation tool บ getter และนี่จะทำงานแล้ว

2021-11-24 20:53:57

แน่นอน BTW,ที่ pointcut designator @annotation() intercepts annotated วิธีการของไม่ใช่ annotated ฟิลด์ สำหรับนั้นเป็นชนพื้นเมืองที่มี AspectJ get() แล้ว set(). ฉัน e., ที่ pointcut จะยังต้องการที่ต้องการเปลี่ยนแปลงถ้าการย้ายฐานต้อง AspectJ. แต่ฉันเห็นด้วยที่ต้องทำตามฤดูใบไม้ผลิ AOP และ annotating getter วิธีการของแทนที่จะเป็นของช่องข้อมูลอาจจะเป็นเพียงพออยู่ที่นี่
kriegaex

@geobreze ฉันซาบซึ้งของคุณการตอบสนแต่เรื่องนี้ไม่มีประโยชน์มาก ฉันพบการเชื่อมต่อโดยตัวเองและนั่นไม่ได้ทำงานตัวอย่างเช่นสำหรับคดีของฉัน.
user3732445

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

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

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่