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 동적 에이전트 가 이미 실현 되 었 음 을 나타 낸다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[MeU] Hashtag 기능 개발➡️ 기존 Tag 테이블에 존재하지 않는 해시태그라면 Tag , tagPostMapping 테이블에 모두 추가 ➡️ 기존에 존재하는 해시태그라면, tagPostMapping 테이블에만 추가 이후에 개발할 태그 기반 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.