Spring AOP 베이스 소스 상세 설명

Proxy Factory 의 작업 원리
프 록 시 팩 토 리 는 대리 대상 생산 공장 으로,대리 대상 을 생 성하 기 전에 대리 공장 을 배치 해 야 한다.프 록 시 팩 토 리 는 프 록 시 대상 을 생 성하 기 전에 JDK 동적 프 록 시 를 사용 할 지 CGLIB 기술 을 사용 할 지 결정 해 야 한다.

// config  ProxyFactory  
// optimize true, proxyTargetClass true,      ProxyFactory    interface
if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {
  Class<?> targetClass = config.getTargetClass();
  if (targetClass == null) {
    throw new AopConfigException("TargetSource cannot determine target class: " +
        "Either an interface or a target is required for proxy creation.");
  }
  // targetClass   ,    Jdk    
  if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {
    return new JdkDynamicAopProxy(config);
  }
  //   Cglib
  return new ObjenesisCglibAopProxy(config);
}
else {
  //   Jdk    
  return new JdkDynamicAopProxy(config);
}
JdkDynamicaopProxy 프 록 시 생 성 에이전트 대상 과정
  • 대리 대상 생 성 에 필요 한 인터페이스 집합 가 져 오기
  • 프 록 시 Factory.addInterface()를 통 해 추 가 된 인 터 페 이 스 를 가 져 옵 니 다.프 록 시 Factory.addInterface()를 통 해 인 터 페 이 스 를 추가 하지 않 았 다 면 프 록 시 Factory 를 보십시오.setTargetClass()가 설정 한 targetClass 는 하나의 인터페이스 입 니까?인 터 페 이 스 를 결과 집합 에 추가 하 는 동시에 SpringProxy,Advised,Decorating Proxy 라 는 인터페이스 도 결과 집합 에 추가 합 니 다.
  • 대리 할 집합 을 확정 한 후 프 록 시 뉴 프 록 시 인 스 턴 스()를 이용 하여 대리 대상 을 생 성 합 니 다.
  • JdkDynamicaopProxy 프 록 시 생 성 에이전트 실행 과정
  • 프 록 시 Factory.setExposeProxy()를 통 해 exposeProxy 를 true 로 설정 하면 프 록 시 대상 을 ThreadLocal(currentProxy)에 설정 합 니 다.
  • 프 록 시 팩 토 리 를 통 해 설 치 된 target 을 가 져 옵 니 다.target Class 를 설정 하면 target 은 null
  • 입 니 다.
  • 현재 호출 된 방법 대상 에 따라 Proxy Factory 에 추 가 된 일치 하 는 Advisor 를 찾 고 Advisor 를 MethodInterceptor 로 밀봉 하여 되 돌려 주 며 MethodIntercepter 체인 을 chain
  • 이 라 고 합 니 다.
  • chain 이 비어 있 으 면 바이트 가 target 에 대응 하 는 현재 방법 을 실행 합 니 다.target 이 null 이면 오류 가 발생 합 니 다
  • chain 이 비어 있 지 않 으 면 chain 의 MethodInterceptor 를 순서대로 실행 합 니 다.현재 MethodInterceptor 가 MethodBefore Advice Interceptor 라면 Advisor 에서 advice 한 before()방법 을 실행 한 다음 다음 MethodInterceptor 를 실행 합 니 다.현재 MethodInterceptor 가 After Returning Advice Interceptor 라면 다음 MethodInterceptor 를 실행 합 니 다.반환 값 을 받 은 후 Advisor 에서 advice 의 after Returning()방법 을 실행 합 니 다.
  • ObjenesisCglibAopProxy 프 록 시 생 성 에이전트 대상 과정
  • Enhancer 만 들 기
  • Enhancer 의 슈퍼 클래스 를 ProxyFactory.setTarget()을 통 해 설 치 된 대상 의 클래스 로 설정
  • Enhancer 의 interfaces 를 ProxyFactory.addInterface()를 통 해 추 가 된 인터페이스 와 SpringProxy,Advisor 인터페이스
  • 로 설정 합 니 다.
  • Enhancer 의 Callbacks 를 Dynamic Advised Intercepter
  • 로 설정 합 니 다.
  • 마지막 으로 Enhancer 를 통 해 프 록 시 대상 을 만 듭 니 다.
  • ObjenesiscglibAopProxy 가 만 든 프 록 시 대상 실행 과정
    실행 과정 은 주로 Dynamic Advised Interceptor 의 실현 에 달 려 있 고 실행 논 리 는 JdkDynamic AopProxy 와 같 습 니 다.
    자동 에이전트(autoproxy)기능
    '자동 에이전트'는 Spring 에 빈 을 추가 하면 된다 는 뜻 이다.이 빈 은 빈 포스트 프로세서 다.그러면 Spring 은 빈 을 만 들 때마다 이 빈 포스트 프로세서 의 판단 을 거 쳐 현재 만 들 고 있 는 이 빈 이 AOP 를 해 야 하 는 지 아 닌 지 를 판단 한다.
    DefaultAdvisorAutoProxyCreator
    AbstractAutoProxyCreator 는 Smart Instantiation AwareBeanPostProcessor 인 터 페 이 스 를 실현 한 BeanPostProcessor 입 니 다.
  • 한 Bean 이 실례 화 되 기 전에 이 AbstractAutoProxyCreator 에 Custom TargetSource 가 설정 되 어 있 는 지 확인 하고,설정 되 어 있 으 면 현재 Bean 이 TargetSource 를 만들어 야 하 는 지 확인 하고,필요 하 다 면 TargetSource 대상 을 만 든 다음 AOP 에 들 어가 프 록 시 대상 을 만 들 고,이 프 록 시 대상
  • 을 되 돌려 줍 니 다.
  • 만약 에 어떤 빈 이 순환 의존 이 생 겼 다 면 getEarly Bean Reference()방법 으로 AOP
  • 를 미리 진행 할 것 이다.
  • 어떤 Bean 이 초기 화 되면 wrapIfNecessary()방법 으로 AOP
  • 를 진행 합 니 다.
  • 이 클래스 에서 추상 적 인 방법 을 제공 했다.getAdvices AndAdvisors ForBean()은 어떤 Bean 에 어떤 Advices 와 Advisors 가 일치 하 는 지 나타 낸다.
  • AbstractAdvisor AutoProxyCreator 는 AbstractAutoProxyCreator,AbstractAdvisor AutoProxyCreator 에서 getAdvices AndAdvisors ForBean()방법 을 계승 하여 논 리 를 실현 합 니 다.
  • findEligibleAdvisors()호출
  • find CandidateAdvisors 를 호출 하여 모든 Advisor 유형의 Bean 을 얻 습 니 다.현재 Bean 의 수명 주기 가 진행 중인 Bean 에 따라 필터 링 을 진행 합 니 다.
  • @EnableAspectJAutoProxy
    이 주 해 는 주로 AnnotationAwareaspectJAuto Proxy Creator 형식의 BeanDefinition 을 추가 한 것 입 니 다.AspectJAwareAdvisor AutoProxyCreator 는 AbstractAdvisor AutoProxyCreator 를 계승 하여 should Skip(Class를 다시 썼 습 니 다.beanClass,String beanName)방법 은 어떤 bean 이 AOP 를 진행 할 필요 가 있 는 지,should Skip()방법 에서:
  • 모든 Advisor 받 기
  • 모든 Advisor 를 옮 겨 다 니 며 현재 bean 이 Aspect JPointcutAdvisor 라면 건 너 뛰 기
  • AnnotationAware AspectJAuto ProxyCreator 는 AspectJAwareAdvisor AutoProxyCreator 를 계승 하여 findCandidateAdvisors()방법 을 다시 썼 습 니 다.즉,Advisor 형식의 bean 을 찾 을 수 있 고 모든@Aspect 주석 에 표 시 된 클래스 를 스 캔 하여 Advisor 를 생 성 할 수 있 습 니 다.
    주해 와 소스 코드 대응 관계
    @Before 는 AspectJMethodBeforeAdvice 에 대응 하여 MethodBeforeAdvice 를 직접 실현 합 니 다.동적 대 리 를 할 때 AspectJMethodBeforeAdvice 를 MethodBeforeAdvice Interceptor 로 전환 하고 MethodBeforeAdvice Interceptor 로 전환 합 니 다.
  • advice 에 대응 하 는 방법 을 먼저 집행 한다
  • MethodInvocation 의 proceed()를 다시 실행 하면 다음 Interceptor 를 실행 합 니 다.다음 Interceptor 가 없 으 면 target 에 대응 하 는 방법 을 실행 합 니 다.
  • @After 는 AspectJAfter Advice 에 대응 하여 MethodInterceptor 를 직접 실현 하 였 습 니 다.
  • MethodInvocation 의 proceed()를 먼저 실행 하고 다음 Interceptor 를 실행 합 니 다.다음 Interceptor 가 없 으 면 target 에 대응 하 는 방법
  • 을 실행 합 니 다.
  • advice 에 대응 하 는 방법 을 다시 실행 합 니 다.
  • @Around 는 AspectJAround Advice 에 대응 하여 MethodInterceptor 를 직접 실현 하 였 습 니 다.
    advice 에 대응 하 는 방법 을 직접 실행 합 니 다.
    @AfterThrowing 은 AspectJAfter Throwing Advice 에 대응 하여 MethodInterceptor 를 직접 실현 하 였 습 니 다.
  • MethodInvocation 의 proceed()를 먼저 실행 하고 다음 Interceptor 를 실행 합 니 다.다음 Interceptor 가 없 으 면 target 에 대응 하 는 방법
  • 을 실행 합 니 다.
  • 위 에 Throwable 을 던 지면 advice 에 대응 하 는 방법 을 실행 합 니 다.
  • @After Returning 은 Aspect JAfter Returning Advice 에 대응 하여 After Returning Advice 를 실현 하 였 으 며,동적 대 리 를 진행 할 때 Aspect JAfter Returning Advice 를 After Returning Advice Interceptor 로 전환 하여 MethodInterceptor 로 전환 하 였 습 니 다.
  • MethodInvocation 의 proceed()를 먼저 실행 하고 다음 Interceptor 를 실행 합 니 다.다음 Interceptor 가 없 으 면 target 에 대응 하 는 방법
  • 을 실행 합 니 다.
  • 위의 방법 을 실행 한 후 최종 방법의 반환 값 을 얻는다
  • Advice 대응 방법 재 집행
  • 이상 은 Spring AOP 바 텀 소스 에 대한 상세 한 내용 입 니 다.Spring AOP 바 텀 소스 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 해 주 십시오!

    좋은 웹페이지 즐겨찾기