Spring AOP 의 실현 원리 상세 설명 및 사례
spring 실현 AOP 는 JDK 동적 에이전트 와 CGLIB 에이전트 에 의존 하여 이 루어 집 니 다.
다음은 JDK 동적 에이전트 와 CGLIB 에이전트 에 대한 간단 한 소개 입 니 다.
JDK 동적 에이전트:프 록 시 대상 은 특정한 인터페이스의 실현 이 어야 합 니 다.실행 하 는 동안 인터페이스의 실현 클래스 를 만들어 대상 에 대한 프 록 시 를 완성 해 야 합 니 다.
CGLIB 에이전트:실현 원 리 는 JDK 동적 에이전트 와 유사 합 니 다.실행 기간 에 생 성 된 에이전트 대상 은 대상 클래스 에 대한 확장 하위 클래스 입 니 다.CGLIB 는 효율 적 인 코드 생 성 패키지 로,바 텀 은 ASM(오픈 소스 자바 바이트 코드 편집 라 이브 러 리)에 의 해 바이트 코드 를 조작 해 이 뤄 지 며 JDK 보다 성능 이 뛰어나다.
Spring 에 서 는 인터페이스 가 있 을 때 JDK 방식 으로 proxy 프 록 시 대상 을 구현 하고 인터페이스 가 없 을 때 cglib 방식 으로 prixy 프 록 시 대상 을 구현 합 니 다.자세 한 내용 은 다음 과 같다.
// JDK :PersonService ,PersonServiceBean ,
public class JDKProxyFactory implements InvocationHandler {
private Object targetObject;
public Object createProxyIntance(Object targetObject)
{
this.targetObject=targetObject;
return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(),
this.targetObject.getClass().getInterfaces(), this);
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
PersonServiceBean person=(PersonServiceBean)this.targetObject;
Object result=null;
if(person.getUser()!=null)
{
result = method.invoke(targetObject, args);
}
return result;
}
}
// CGlib :PersonServiceBean , PersonService ,
public class CGlibProxyFactory implements MethodInterceptor{
private Object targetObject;
public Object createProxyInstance(Object targetObject)
{
this.targetObject=targetObject;
Enhancer enhancer=new Enhancer();
enhancer.setSuperclass(this.targetObject.getClass());// , final
enhancer.setCallback(this);//
return enhancer.create();
}
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
PersonServiceBean person=(PersonServiceBean)this.targetObject;
Object result=null;
if(person.getUser()!=null)
{
result = methodProxy.invoke(targetObject, args);
}
return null;
}
}
읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[MeU] Hashtag 기능 개발➡️ 기존 Tag 테이블에 존재하지 않는 해시태그라면 Tag , tagPostMapping 테이블에 모두 추가 ➡️ 기존에 존재하는 해시태그라면, tagPostMapping 테이블에만 추가 이후에 개발할 태그 기반 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.