English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java 대리자 패턴 쉽게 이해하기

모두와 함께 java 대리 모델을 이야기해 보겠습니다

1、정적 대리

1.1정적 대리의 대리 클래스와 대리되는 클래스는 공통 인터페이스를 유지해야 합니다. 

public interface IUserDao {
  void save();
} 

1.2대리된 클래스, 목표 객체 

public class UserDao implements IUserDao{
  @Override
  public void save() {
    System.out.println("-----데이터가 저장되었습니다!!!------");
  }
} 

1.3대리 객체 

public class UserDaoProxy implements IUserDao{
  // 접수하여 저장할 목표 객체
  private IUserDao target;
  public UserDaoProxy(IUserDao target) {
    this.target = target;
  }
  @Override
  public void save() {
    System.out.println("거래를 시작...");
    target.save();       // 목표 객체의 메서드를 실행합니다
    System.out.println("거래를 제출...");
  }
}

1.4테스트 클래스 

public class App {
  public static void main(String[] args) {
    // 목표 객체
    IUserDao target = new UserDao();
    // 대리
    IUserDao proxy = new UserDaoProxy(target);
    proxy.save(); // 실행하는 것은 대리의 메서드입니다
  }
}

2、동적 대리

2.1동일하게, 동적 대리도 인터페이스를 완료해야 합니다。(위와 동일)

2.2목표 객체도 동일합니다.

2.3대리 객체에서만 다릅니다 

public class ProxyFactory {
  // 목표 객체를 유지합니다
  private Object target;
  public ProxyFactory(Object target){
    this.target = target;
  }
  // 대상 객체에 대리 객체 생성 
  public Object getProxyInstance() {
    return Proxy.newProxyInstance(
        target.getClass().getClassLoader(), 
        target.getClass().getInterfaces(),
        new InvocationHandler() {
          @Override
          public Object invoke(Object proxy, Method method, Object[] args)
              throws Throwable {
            System.out.println("거래 시작");
            // 대상 객체 메서드 실행
            Object returnValue = method.invoke(target, args);  
            System.out.println("거래 제출");
            return returnValue;
          }
        });
  }
}

2.4테스트 클래스 

public class App {
  public static void main(String[] args) {
    // 목표 객체
    IUserDao target = new UserDao();
    System.out.println(target.getClass());
    // 대상 객체에 대리 객체 생성
    IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance();
    System.out.println(proxy.getClass());
    // 메서드 실행  【대리 객체】
    proxy.save();
  }
}

3와 cglib 대리

3.1cglib 대리는 인터페이스를 완성하지 않아도 됩니다. 대리되는 클래스와 대리 클래스만 작성하면 됩니다. 여기서 대리되는 클래스는1.2따라서 작성하지 않습니다.

3.2대리 클래스는 다릅니다. cglib 대리 모델을 사용하려면 스프링의 핵심 프레임워크 패키지를 참조해야 합니다. 

public class ProxyFactory implements MethodInterceptor{
  // 대상 객체 유지
  private Object target;
  public ProxyFactory(Object target){
    this.target = target;
  }
  // 대상 객체에 대리 객체 생성
  public Object getProxyInstance(){
    //1. 도구 클래스
    Enhancer en = new Enhancer();
    //2. 부모 클래스 설정
    en.setSuperclass(target.getClass());
    //3. 콜백 함수 설정
    en.setCallback(this);
    //4. 생성자 클래스(대리 객체)
    return en.create();
  }
  @Override
  public Object intercept(Object obj, Method method, Object[] args,
      MethodProxy proxy) throws Throwable {}}
    System.out.println("거래 시작.....");
    // 목표 객체의 메서드를 실행합니다
    Object returnValue = method.invoke(target, args);
    System.out.println("거래 제출.....");
    return returnValue;
  }
}

3.3테스트 클래스 

public class App {
  public static void main(String[] args) {
    // 목표 객체
    UserDao target = new UserDao();
    System.out.println(target.getClass());
    // 대리 객체
    UserDao proxy = (UserDao) new ProxyFactory(target).getProxyInstance();
    System.out.println(proxy.getClass());
    // 대리 객체의 메서드를 실행합니다
    proxy.save();
  }
}

이것이 이 문서의 전체 내용입니다. 많은 도움이 되었기를 바랍니다. 또한, 노래教程에 많은 지지를 부탁드립니다.

성명: 이 문서의 내용은 인터넷에서 가져왔으며, 저작권자는 모두입니다. 내용은 인터넷 사용자가 자발적으로 기여하고 자체로 업로드한 것이며, 이 사이트는 소유권을 가지지 않으며, 인공 편집 처리를 하지 않았으며, 관련 법적 책임도 부담하지 않습니다. 저작권 침해 내용을 발견하면, 이메일을 notice#w로 보내 주시기 바랍니다.3codebox.com에 이메일을 보내면 (#을 @으로 변경하십시오) 신고하시고 관련 증거를 제공하십시오. 사실이 확인되면, 이 사이트는 즉시 저작권 침해 내용을 삭제합니다.

추천해 드립니다