간편한 Java 프록시 모드

4005 단어 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 프록시 모드를 사용하려면spring의 핵심 프레임워크 패키지를 인용해야 한다. 

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();
  }
}

이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

좋은 웹페이지 즐겨찾기