Spring JDK 동적 에이전트 실현 과정 상세 설명

4785 단어 SpringJDK동태대리
이 글 은 주로 Spring JDK 동적 대리 실현 과정 에 대한 상세 한 설명 을 소개 합 니 다.이 글 은 예시 코드 를 통 해 매우 상세 하 게 소개 되 어 여러분 의 학습 이나 업무 에 대해 어느 정도 참고 학습 가 치 를 가지 고 있 으 므 로 필요 한 분 들 은 참고 하 시기 바 랍 니 다.
1.항목 만 들 기
MyEclipse 에 spring Demo 03 이라는 웹 프로젝트 를 만 들 고 Spring 지원 과 의존 하 는 JAR 패 키 지 를 웹 프로젝트 의 WEB-INF/lib 디 렉 터 리 에 복사 하여 클래스 경로 에 발표 합 니 다.
2.인터페이스 만 들 기 CustomerDao
프로젝트 의 src 디 렉 터 리 아래 com.mengma.dao 라 는 가방 을 만 들 고 이 가방 아래 에 customerDao 인 터 페 이 스 를 만 듭 니 다.편집 후 다음 과 같 습 니 다.

package com.mengma.dao;

public interface CustomerDao {
  public void add(); //   

  public void update(); //   

  public void delete(); //   

  public void find(); //   
}
3.구현 클래스 CustomerDaoImpl 만 들 기
com.mengma.dao 패키지 에서 customerDao 인터페이스의 실현 클래스 customerDaoImpl 을 만 들 고 이 인터페이스의 모든 방법 을 실현 합 니 다.다음 과 같 습 니 다.

package com.mengma.dao;

public class CustomerDaoImpl implements CustomerDao {

  @Override
  public void add() {
    System.out.println("    ...");
  }

  @Override
  public void update() {
    System.out.println("    ...");
  }

  @Override
  public void delete() {
    System.out.println("    ...");
  }

  @Override
  public void find() {
    System.out.println("    ...");
  }
}
4.절단면 클래스 MyAspect 만 들 기
src 디 렉 터 리 에서 com.mengma.jdk 라 는 가방 을 만 들 고 이 가방 아래 에 절단면 류 MyAspect 를 만 듭 니 다.편집 후 다음 과 같 습 니 다.

package com.mengma.jdk;

public class MyAspect {
  public void myBefore() {
    System.out.println("      ");
  }

  public void myAfter() {
    System.out.println("      ");
  }
}
상기 코드 에서 절단면 에서 두 가지 강화 방법 을 정 의 했 는데 그것 이 바로 my Before()방법 과 my After()방법 으로 목표 클래스(customerDaoImpl)를 강화 하 는 데 사용 된다.
5.프 록 시 클래스 MyBeanFactory 만 들 기
com.mengma.jdk 패키지 아래 MyBeanFactory 라 는 클래스 를 만 듭 니 다.이 클래스 에서 java.lang.reflect.Proxy 를 사용 하여 JDK 동적 에이 전 트 를 실현 합 니 다.다음 과 같 습 니 다.

package com.mengma.jdk;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import com.mengma.dao.CustomerDao;
import com.mengma.dao.CustomerDaoImpl;

public class MyBeanFactory {

  public static CustomerDao getBean() {
    //      
    final CustomerDao customerDao = new CustomerDaoImpl();
    //        
    final MyAspect myAspect = new MyAspect();
    //      ,    
    return (CustomerDao) Proxy.newProxyInstance(
        MyBeanFactory.class.getClassLoader(),
        new Class[] { CustomerDao.class }, new InvocationHandler() {
          public Object invoke(Object proxy, Method method,
              Object[] args) throws Throwable {
            myAspect.myBefore(); //    
            Object obj = method.invoke(customerDao, args);
            myAspect.myAfter(); //    
            return obj;
          }
        });
  }
}
상기 코드 에서 정적 getBean()방법 을 정 의 했 습 니 다.스프링 프레임 워 크 의 IoC 사상 을 모 의 한 것 입 니 다.getBean()방법 으로 인 스 턴 스 를 만 들 고 14 번 째 줄 코드 는 customerDao 인 스 턴 스 를 만 들 었 습 니 다.
16 줄 코드 가 만 든 절단면 클래스 인 스 턴 스 는 절단면 류 에 해당 하 는 방법 을 호출 하 는 데 사 용 됩 니 다.18~26 줄 은 프 록 시 클래스 를 사용 하여 생 성 된 인 스 턴 스 customerDao 의 방법 을 강화 하 는 코드 입 니 다.그 중에서 Proxy 의 new Proxy Instance()방법의 첫 번 째 매개 변 수 는 현재 클래스 의 클래스 로 더 입 니 다.두 번 째 매개 변 수 는 생 성 된 인 스 턴 스 의 실현 클래스 인터페이스 이 고 세 번 째 참 수 는 강화 해 야 할 방법 입 니 다.
목표 클래스 방법 이 실 행 된 전후 에 절단면 류 의 my Before()방법 과 my After()방법 을 각각 실행 합 니 다.
6.테스트 클래스 JDKProxyTest 만 들 기
com.mengma.jdk 패키지 아래 JDK ProxyTest 라 는 테스트 클래스 를 만 듭 니 다.다음 과 같 습 니 다.

package com.mengma.jdk;

import org.junit.Test;
import com.mengma.dao.CustomerDao;

public class JDKProxyTest {
  @Test
  public void test() {
    //           (   spring  ,         )
    CustomerDao customerDao = MyBeanFactory.getBean();
    //     
    customerDao.add();
    customerDao.update();
    customerDao.delete();
    customerDao.find();
  }
}
상기 코드 에서 getBean()방법 을 호출 할 때 customerDao 류 의 프 록 시 대상 을 가 져 온 다음 에 이 대상 의 방법 을 호출 했 습 니 다.
7.항목 실행 및 결과 보기
JUnit 테스트 실행 test()방법 을 사용 하여 실행 에 성공 하면 콘 솔 의 출력 결 과 는 그림 1 과 같 습 니 다.
다음 그림 의 출력 결 과 를 보면 목표 클래스 를 호출 하 는 방법 전후 에 강 화 된 코드 를 성공 적 으로 호출 한 것 을 알 수 있다.이 는 JDK 동적 에이전트 가 이미 실현 되 었 음 을 나타 낸다.

이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기