Google Guice-AOP
AOP, Aspect 지향 프로그래밍은 프로그램 로직을 소위 관심사라고하는 별개의 부분으로 분해하는 것을 수반합니다. 애플리케이션의 여러 지점에 걸쳐있는 기능을 교차 절단 문제라고하며 이러한 교차 절단 문제는 애플리케이션의 비즈니스 로직과 개념적으로 분리됩니다. 로깅, 감사, 선언적 트랜잭션, 보안, 캐싱 등과 같은 측면에 대한 다양한 일반적인 좋은 예가 있습니다.
OOP에서 모듈화의 핵심 단위는 클래스이고 AOP에서는 모듈화 단위가 aspect입니다. 종속성 주입은 애플리케이션 개체를 서로 분리하는 데 도움이되며 AOP는 영향을받는 개체에서 교차 절단 문제를 분리하는 데 도움이됩니다. AOP는 Perl, .NET, Java 등과 같은 프로그래밍 언어의 트리거와 같습니다. Guice는 애플리케이션을 가로채는 인터셉터를 제공합니다. 예를 들어, 메서드가 실행될 때 메서드 실행 전후에 추가 기능을 추가 할 수 있습니다.
중요한 수업
Matcher-Matcher는 값을 수락하거나 거부하는 인터페이스입니다. Guice AOP에서는 두 개의 matcher가 필요합니다. 하나는 어떤 클래스가 참여하는지 정의하고 다른 하나는 해당 클래스의 메소드를위한 것입니다.
MethodInterceptor-MethodInterceptor는 매칭 메소드가 호출되면 실행됩니다. 메서드, 인수 및 수신 인스턴스와 같은 호출을 검사 할 수 있습니다. 교차 절단 논리를 수행 한 다음 기본 메서드에 위임 할 수 있습니다. 마지막으로 반환 값 또는 예외를 검사하고 반환 할 수 있습니다.
예
GuiceTester라는 Java 클래스를 만듭니다.
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