Google Guice - AOP
AOP การเขียนโปรแกรมเชิง Aspect ทำให้เกิดการแยกตรรกะของโปรแกรมออกเป็นส่วนต่างๆที่เรียกว่าข้อกังวล ฟังก์ชั่นที่ครอบคลุมหลายจุดของแอปพลิเคชันเรียกว่าข้อกังวลข้ามการตัดและข้อกังวลข้ามตัดเหล่านี้แยกจากแนวคิดทางธุรกิจของแอปพลิเคชัน มีตัวอย่างที่ดีหลายประการเช่นการบันทึกการตรวจสอบธุรกรรมที่เปิดเผยความปลอดภัยการแคชเป็นต้น
หน่วยหลักของโมดูลาร์ใน OOP คือคลาสในขณะที่ใน AOP หน่วยของโมดูลาร์คือด้าน Dependency Injection ช่วยให้คุณแยกวัตถุแอปพลิเคชันของคุณออกจากกันและ AOP ช่วยให้คุณแยกข้อกังวลข้ามการตัดออกจากวัตถุที่ส่งผลกระทบ AOP เป็นเหมือนทริกเกอร์ในภาษาโปรแกรมเช่น Perl, .NET, Java และอื่น ๆ Guice จัดหาเครื่องสกัดกั้นเพื่อสกัดกั้นแอปพลิเคชัน ตัวอย่างเช่นเมื่อมีการเรียกใช้เมธอดคุณสามารถเพิ่มฟังก์ชันพิเศษก่อนหรือหลังการเรียกใช้เมธอด
ชั้นเรียนที่สำคัญ
Matcher- Matcher เป็นอินเทอร์เฟซสำหรับยอมรับหรือปฏิเสธค่า ใน Guice AOP เราต้องการผู้จับคู่สองคนคนหนึ่งกำหนดว่าชั้นเรียนใดเข้าร่วมและอีกคนหนึ่งสำหรับวิธีการของชั้นเรียนเหล่านั้น
MethodInterceptor- MethodInterceptors ถูกเรียกใช้เมื่อมีการเรียกเมธอดการจับคู่ พวกเขาสามารถตรวจสอบการโทร: วิธีการอาร์กิวเมนต์และอินสแตนซ์การรับ เราสามารถใช้ตรรกะการตัดขวางแล้วมอบหมายวิธีการพื้นฐานได้ สุดท้ายเราอาจตรวจสอบค่าส่งคืนหรือข้อยกเว้นและส่งคืน
ตัวอย่าง
สร้างคลาส java ชื่อ GuiceTester
GuiceTester.java
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.matcher.Matchers;
public class GuiceTester {
public static void main(String[] args) {
Injector injector = Guice.createInjector(new TextEditorModule());
TextEditor editor = injector.getInstance(TextEditor.class);
editor.makeSpellCheck();
}
}
class TextEditor {
private SpellChecker spellChecker;
@Inject
public TextEditor(SpellChecker spellChecker) {
this.spellChecker = spellChecker;
}
public void makeSpellCheck(){
spellChecker.checkSpelling();
}
}
//Binding Module
class TextEditorModule extends AbstractModule {
@Override
protected void configure() {
bind(SpellChecker.class).to(SpellCheckerImpl.class);
bindInterceptor(Matchers.any(),
Matchers.annotatedWith(CallTracker.class),
new CallTrackerService());
}
}
//spell checker interface
interface SpellChecker {
public void checkSpelling();
}
//spell checker implementation
class SpellCheckerImpl implements SpellChecker {
@Override @CallTracker
public void checkSpelling() {
System.out.println("Inside checkSpelling." );
}
}
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD)
@interface CallTracker {}
class CallTrackerService implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.println("Before " + invocation.getMethod().getName());
Object result = invocation.proceed();
System.out.println("After " + invocation.getMethod().getName());
return result;
}
}
เอาต์พุต
คอมไพล์และรันไฟล์คุณอาจเห็นผลลัพธ์ต่อไปนี้
Before checkSpelling
Inside checkSpelling.
After checkSpelling