Spring 의 AOP (주석 기반)

5458 단어 [프레임]Spring
목표 클래스
public class MathCalculator {
	public int div(int i,int j){
		return i/j;	
	}
}

절단면 류
@Aspect
public class LogAspects {
	
	//           
	//1、    
	//2、       
	@Pointcut("execution(public int com.atguigu.aop.MathCalculator.*(..))")
	public void pointCut(){};
	
	//@Before         ;      (         )
	@Before("pointCut()")
	public void logStart(JoinPoint joinPoint){
		Object[] args = joinPoint.getArgs();
		System.out.println(joinPoint.getSignature().getName()+"  。。。@Before:     :{"+Arrays.asList(args)+"}");
	}
	
	@After("com.atguigu.aop.LogAspects.pointCut()")
	public void logEnd(JoinPoint joinPoint){
		System.out.println(joinPoint.getSignature().getName()+"  。。。@After");
	}
	
	//JoinPoint             
	@AfterReturning(value="pointCut()",returning="result")
	public void logReturn(JoinPoint joinPoint,Object result){
		System.out.println(joinPoint.getSignature().getName()+"    。。。@AfterReturning:    :{"+result+"}");
	}
	
	@AfterThrowing(value="pointCut()",throwing="exception")
	public void logException(JoinPoint joinPoint,Exception exception){
		System.out.println(joinPoint.getSignature().getName()+"  。。。    :{"+exception+"}");
	}
}

설정 클래스
@EnableAspectJAutoProxy
@Configuration
public class MainConfigOfAOP {
	 
	//          
	@Bean
	public MathCalculator calculator(){
		return new MathCalculator();
	}

	//         
	@Bean
	public LogAspects logAspects(){
		return new LogAspects();
	}
}

AOP: [동적 에이전트]
프로그램 이 실행 되 는 동안 특정한 코드 를 지정 한 방법 이 지정 한 위치 에 동적 으로 삽입 하여 실행 하 는 프로 그래 밍 방식 을 말한다.
  • aop 모듈 가 져 오기, Spring AOP: (spring - aspects)
  • 업무 논리 류 (MathCalculator) 를 정의 하고 업무 논리 가 실 행 될 때 로 그 를 인쇄 합 니 다 (방법 전, 방법 운행 종료, 방법 이상, xxx)
  • 로그 절단면 류 (LogAspects) 를 정의 합 니 다. 절단면 류 의 방법 은 MathCalculator. div 가 어디 까지 실행 되 는 지 동적 으로 감지 한 다음 에 실행 해 야 합 니 다
        :
    	    (@Before):logStart:     (div)      
    	    (@After):logEnd:     (div)        (              )
    	    (@AfterReturning):logReturn:     (div)        
    	    (@AfterThrowing):logException:     (div)        
    	    (@Around):    ,          (joinPoint.procced())
    
  • 절단면 류 의 목표 방법 에 언제 어디서 실행 되 는 지 표시 (알림 설명)
  • 절단면 류 와 업무 논리 류 (목표 방법 소재 류) 를 모두 용기 에 넣는다.절단면 류 와 업무 논리 류 (목표 방법 소재 류) 를 모두 용기 에 넣는다
  • Spring 에 게 어떤 종류 가 절단면 류 인지 알려 야 합 니 다. (절단면 류 에 주 해 를 추가 해 야 합 니 다. @ Aspect) Spring 에 게 절단면 류 (절단면 류 에 주 해 를 추가 해 야 합 니 다. @ Aspect)
  • 설정 클래스 에 @ EnableAspectJAutoProxy [주석 기반 op 모드 오픈] 설정 클래스 에 @ EnableAspectJAutoProxy [주석 기반 op 모드 오픈] Spring 에 많은 @ EnableXXX
  • 3 단계 곡: 1), 비 즈 니스 논리 구성 요소 와 절단면 류 를 용기 에 넣 고 Spring 에 절단면 류 (@ Aspect) 2 가 무엇 인지 알려 줍 니 다. 절단면 류 의 모든 알림 방법 에 알림 주 해 를 표시 하고 Spring 이 언제 어디서 실행 되 는 지 알려 줍 니 다 (접점 표현 식) 3), 주 해 를 기반 으로 한 op 모드 를 엽 니 다. @ Enable Aspect JAuto Proxy
    AOP 원리: [용기 에 어떤 구성 요 소 를 등 록 했 는 지 보 세 요. 이 구성 요 소 는 언제 작 동 합 니까? 이 구성 요소 의 기능 은 무엇 입 니까?]
    1. @ Enable AspectJAuto Proxy 는 무엇 입 니까?
    @Import(AspectJAutoProxyRegistrar.class):      AspectJAutoProxyRegistrar
      AspectJAutoProxyRegistrar         bean:BeanDefinetion
    internalAutoProxyCreator=AnnotationAwareAspectJAutoProxyCreator
    

    용기 에 AnnotationAware Aspect JAuto Proxy Creator 를 등록 합 니 다.
    2、 AnnotationAwareAspectJAutoProxyCreator:
    AnnotationAwareAspectJAutoProxyCreator
    	->AspectJAwareAdvisorAutoProxyCreator
    		->AbstractAdvisorAutoProxyCreator
    			->AbstractAutoProxyCreator
    					implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware
    			       ( bean          )、    BeanFactory
    

    흐름:
    1)、     ,  ioc  
    2)、     ,  refresh()    
    3)、registerBeanPostProcessors(beanFactory);  bean           bean   
    	1)、   ioc                 BeanPostProcessor
    	2)、       BeanPostProcessor
    	3)、       PriorityOrdered   BeanPostProcessor
    	4)、          Ordered   BeanPostProcessor
    	5)、           BeanPostProcessor
    	6)、  BeanPostProcessor,       BeanPostProcessor  ,      
    

    internalAutoProxyCreator 를 만 든 BeanPostProcessor [AnnotationAware AspectJAutoProxyCreator]
    1)、  Bean   
    2)、populateBean: bean       
    3)、initializeBean:   bean;
    		1)、invokeAwareMethods():  Aware       
    		2)、applyBeanPostProcessorsBeforeInitialization():        postProcessBeforeInitialization()
    		3)、invokeInitMethods():           
    		4)、applyBeanPostProcessorsAfterInitialization():        postProcessAfterInitialization();
    4)、BeanPostProcessor(AnnotationAwareAspectJAutoProxyCreator)    ----》aspectJAdvisorsBuilder
    7)、 BeanPostProcessor   BeanFactory :
    beanFactory.addBeanPostProcessor(postProcessor);
    

    요약:
    	1)、@EnableAspectJAutoProxy   AOP  
    	2)、@EnableAspectJAutoProxy             AnnotationAwareAspectJAutoProxyCreator
    	3)、AnnotationAwareAspectJAutoProxyCreator        ;
    	4)、       :
    		1)、registerBeanPostProcessors()       ,  AnnotationAwareAspectJAutoProxyCreator  
    		2)、finishBeanFactoryInitialization()         bean
    			1)、             
    			2)、AnnotationAwareAspectJAutoProxyCreator         
    			3)、       ,          
    				 :       ,      (Advisor);               (cglib);
    	5)、      :
    		1)、          
    		2)、CglibAopProxy.intercept();
    			1)、           (         MethodInterceptor)
    			2)、          ,              ;
    			3)、  :
    				    :    -》    -》    -》    
    				    :    -》    -》    -》    
    

    좋은 웹페이지 즐겨찾기