Spring AOP 의 실현 원리 상세 설명 및 사례

2453 단어 SpringAOP
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; 
} 
} 
읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기