[Java]プロキシモード

7218 ワード

Spring AOPにはエージェントという存在があります.
これは抽象的な概念で、最初は理解しにくいです.
Javaエージェントモードでさらに理解してみましょう.
ソース:https://www.baeldung.com/java-proxy-pattern

エージェントモードとは?


エージェントモードは、アクセラレータモードのようにターゲットの機能を拡張しません.
クライアント(使用者)がターゲットにアクセスする方法を変更します.
簡単に言えば、エージェントは仲介者です.
代わりに、クライアントの要求を受け入れ、同じインタフェースの他のインプリメンテーションに委任します.
図から見るとそうです.

プロキシモードの例


例えばJDBC接続やSessionFactoryこのオブジェクトには最初にいくつかの設定が必要です.必要に応じてこのオブジェクトを呼び出し、繰り返し使用したいと考えています.

簡単に言えば、一度設定すれば、設定せずに繰り返し使用できるようになります.

ExpensiveObjectインタフェース

public interface ExpensiveObject {
    void process();
}

ExpensiveObjectImplクラス

public class ExpensiveObjectImpl implements ExpensiveObject {
	
    //인스턴스가 생성될때 설정 메서드를 실행한다.
    public ExpensiveObjectImpl() {
        heavyInitialConfiguration();
    }
    
    @Override
    public void process() {
        LOG.info("프로세스가 끝났습니다.");
    }
    
    private void heavyInitialConfiguration() {
        LOG.info("초기 설정중...");
    }
    
}

ExpensiveObjectProxy

//클라이언트가 사용하는 중개인(proxy) 클래스
public class ExpensiveObjectProxy implements ExpensiveObject {
	
    private static ExpensiveObject object;
//클라이언트는 이 process() 를 호출할 것이다.
    @Override
    public void process() {
    //static 필드에 인스턴스를 저장하기 때문에 설정 메서드는 
    //ExpensiveObjectImpl 메서드가 실행될때 총 한번만 실행된다.
        if (object == null) {
            object = new ExpensiveObjectImpl();
        }
        //ExpensiveObject에 위임
        object.process();
    }
}

テスト

public static void main(String[] args) {
    ExpensiveObject object = new ExpensiveObjectProxy();
    object.process();
    object.process();
}

結果

초기 설정중...
프로세스가 끝났습니다.
프로세스가 끝났습니다.

n/a.結論


エージェントモードはこのような時によく使われます.
  • オブジェクトのより単純なバージョンまたはより安全にオブジェクトにアクセスする必要がある場合、
  • ローカルバージョンのリモートオブジェクトを取得するには、
  • が必要です.