우 육시 엉 - 자연 JAVA SPRING 연구 노트의 개발을위한 자연 프레임 워크 : 봄의 JDK 동적 프록시

JDK의 동적 프록시는 JDK를 java.lang.reflect.Proxy 클래스에 의해 달성된다. 다음은 특별한 경우에 의해 사용 JDK의 다이내믹 프록시를 보여줍니다.
1 . 프로젝트 만들기 
웹 웹 프로젝트에 springDemo03은 MyEclipse에서 웹 프로젝트, 봄의 JAR 종속성 및 지원 패키지의 이름을 만들 수 -INF / lib 디렉토리 및 클래스 경로에 배치했다.
2 . 인터페이스 CustomerDao 만들기를 
아래와 같이 편집 패키지 CustomerDao이 인터페이스를 만들 프로젝트 src 디렉토리 이름 com.mengma.dao 패키지로 만들었습니다. 
에 대한 패키지 페널티 com.mengma.dao,
 공중  인터페이스 CustomerDao {
     공공  무효 추가 (); //이 추가 
    공개  무효 , 업데이트를 () // 수정 
    공공  무효 , 삭제 () // 삭제 
    공공  무효 ) (찾기를; //쿼리 
}
 3 . 구현 클래스 생성 CustomerDAOImpl 
com.mengma.dao 패키지의 인터페이스 클래스 CustomerDaoImpl CustomerDao의 구현을 만들기 위해, 그리고 다음과 같이 인터페이스의 모든 메소드를 구현합니다. 
패키지 com.mengma.dao,
 공공  클래스 CustomerDAOImpl 구현 CustomerDao { 
    @Override 
    공공  무효 추가 () { 
        에서 System.out.println ( "... 고객 추가" ); 
    } 
    @Override 
    공공  무효 업데이트 () { 
        에서 System.out.println ( "... 클라이언트를 수정" ); 
    } 
    @Override 
    공공  무효 삭제 () { 
        에서 System.out.println ( "삭제 고객 ..."); 
    } 
    @Override 
    공공  무효 찾기 () { 
        에서 System.out.println ( "수정 고객 ..." ); 
    } 
}
 4 클래스 MyAspect 컷 만듭니다. 
com.mengma.jdk라는 패키지를 작성, src 디렉토리에를 패킷 클래스 MyAspect에서 컷, 아래 그림과 같이 편집을 만들 수 있습니다. 
패키지 com.mengma.jdk;
 공용  클래스 MyAspect {
     공개  공극 myBefore () { 
        에서 System.out.println ( "실행 전에 방법" ); 
    } 
    공공  공극 myAfter () { 
        에서 System.out.println ( "메소드의 실행 후에" ); 
    } 
}
상기 코드는, 절단면이 향상 목표 클래스 (CustomerDAOImpl)의 경우, 두 개의 강화 방법 각각 myBefore () 메소드 myAfter () 메소드를 정의한다.
5 . 프록시 클래스 생성 MyBeanFactory 
아래와 같이 클래스를 java.lang.reflect.Proxy JDK 다이나믹 프록시를 이용하여 구현 com.mengma.jdk 패키지의 클래스 이름을 MyBeanFactory 만들한다. 
패키지는 com.mengma.jdk;
 수입 java.lang.reflect.InvocationHandler;
 가져 오기 java.lang.reflect.Method와;
 가져 오기 를 java.lang.reflect.Proxy;
 가져 오기 com.mengma.dao.CustomerDao,
 가져 오기 com.mengma.dao. CustomerDAOImpl는,
 공공  클래스 MyBeanFactory는 {
     공공  정적 CustomerDao의 getBean () {
         //는 특정 클래스 준비 
        최종 CustomerDao customerDao는 = 새로운 새로운 CustomerDAOImpl을 ();
         // 클래스 인스턴스 컷을 만들
        최종 MyAspect myAspect는 = 새로운 MyAspect을 ();
        // 使用代理类,进行增强
        반환 (CustomerDao) Proxy.newProxyInstance ( 
                MyBeanFactory. 클래스 .getClassLoader (),
                 새로운 클래스 [] {CustomerDao. 클래스 }, 의 InvocationHandler () {
                     공공 개체 호출 (개체 프록시 방법 방법, 
                            객체 []는 인수) 가 발생 하는 Throwable { 
                        )를 myAspect.myBefore (; // 前增强 
                        오브젝트 OBJ = method.invoke (customerDao, 인수);
                        myAspect.myAfter (); // 강화가 
                        돌아 OBJ; 
                    } 
                }); 
    } 
} 
상기 코드는, 여기서 시뮬레이션의 getBean ()에있어서의 정적 인 정의는, () 메소드의 getBean 호출하여 인스턴스를 생성 IOC의 스프링 프레임 워크를 생각 처음 14 줄의 코드는 customerDao 인스턴스를 만들 수 있습니다. 
첫 번째 클래스의 인스턴스를 생성하기위한 코드 (16 개) 라인에 해당하는 방법 형태 클래스 통화 절단 18 ~ 26 향상된 코드 인스턴스 customerDao 방법 만들어 프록시 클래스를 사용하여 행되고, 제 프록시 'newProxyInstance () 메소드 파라미터는 현재 클래스 로더 타입이고, 두 번째 파라미터는 구현 클래스가 인터페이스의 인스턴스를 생성하고, 세번째 파라미터 강조법에 대한 필요성이있다. 
이 방법에서 대상 클래스 전후 수행 각 클래스 실행 부 myBefore () 메소드 myAfter () 메소드.
6 . JDKProxyTest 테스트 클래스를 만들기 
로 다음, com.mengma.jdk 패키지에 JDKProxyTest라는 테스트 클래스를 만들 수 있습니다. 
패키지 com.mengma.jdk,
 가져 오기 org.junit.Test,
 가져 오기 com.mengma.dao.CustomerDao,
 공공  클래스 JDKProxyTest { 
    @Test 
    공공  무효 시험 () {
         // 봄 획득에 해당하는 식물 (에서 지정된 콘텐츠를하지만, 이 콘텐츠 프록시 객체) 때 
        customerDao customerDao = MyBeanFactory.getBean ();
         //은 방법 수행 
        , customerDao.add () 
        customerDao.update (); 
        customerDao.delete (); 
        customerDao.find를 (); 
    } 
}
위의 코드에서 취득한의 getBean () 메소드를 호출하는 경우 CustomerDao 프록시 객체 클래스, 그 객체의 메소드를 호출한다. 
7 . 프로젝트를 실행하고 결과를 볼 수 
, 성공적으로 실행 () 메서드 콘솔 출력을 JUnit 테스트 실행 테스트를 사용 후

추천

출처www.cnblogs.com/tszr/p/12129844.html