Spring AOP 절단면 프로 그래 밍 상세 설명

AOP
AOP (Aspect Oriented Programming), 즉 절단면 을 대상 으로 프로 그래 밍 하 는 것 은 OOP (Object Oriented Programming, 대상 을 대상 으로 프로 그래 밍) 의 보충 과 보완 이 라 고 할 수 있다.OOP 는 패 키 징, 계승, 다 형 등 개념 을 도입 하여 하나의 대상 차원 구 조 를 구축 하여 공공 행 위 를 모 의 하 는 집합 에 사용한다.그러나 OOP 는 개발 자가 세로 관 계 를 정의 할 수 있 지만 로그 기능 과 같은 가로 관 계 를 정의 하 는 데 적합 하지 않 습 니 다.로그 코드 는 모든 대상 차원 에 가로로 흩 어 져 있 지만 그 에 대응 하 는 대상 의 핵심 기능 과 는 아무런 관계 가 없다. 예 를 들 어 안전성, 이상 처리 와 투명 한 지속 성 등 다른 유형의 코드 에 대해 서도 마찬가지다. 이런 흩 어 져 있 는 무관 한 코드 를 가로로 자 르 기 (cross cutting) 라 고 하 는데 OOP 디자인 에서 대량의 코드 가 중복 되 었 다.각 모듈 의 중용 에 불리 하 다.
AOP 기술 은 반대로 '가로 자 르 기' 라 고 불 리 는 기술 을 이용 해 봉 인 된 대상 내 부 를 분해 하고 여러 가지 유형의 공공 행 위 를 재 활용 가능 한 모듈 로 봉 인 했 으 며 이 를 '애 스 펙 트', 즉 절단면 이 라 고 명명 했다.이른바 '절단면' 이란 쉽게 말 하면 업무 와 무관 하지만 업무 모듈 에 공동으로 호출 되 는 논리 나 책임 을 포장 하면 시스템 의 중복 코드 를 줄 이 고 모듈 간 의 결합 도 를 낮 추 며 미래의 조작 성과 유지 가능성 에 유리 하 다 는 것 이다.
'횡 절' 기술 을 사용 하여 AOP 는 소프트웨어 시스템 을 두 부분 으로 나 누 었 다. .업무 처리 의 주요 절 차 는 핵심 관심 사 이 고 그 와 의 관계 가 크 지 않 은 부분 은 횡단 관심 사다.횡단 관심 점 의 한 특징 은 그들 이 핵심 관심 점 의 여러 곳 에서 자주 발생 하 는데 각 곳 은 기본적으로 비슷 하 다 는 것 이다. 예 를 들 어 권한 인증, 로그, 사물 등 이다.AOP 는 시스템 의 다양한 관심 사 를 분리 해 핵심 관심 사 와 횡단 관심 사 를 분리 하 는 역할 을 한다.
AOP 핵심 개념
1. 가로 관심 사
어떤 방법 을 차단 하고 차단 한 후에 어떻게 처리 하 는 지 에 대한 관심 사 를 횡단 관심 사 라 고 한다.
2. 절단면 (aspect)
종 류 는 물체 특징 에 대한 추상 이 고 절단면 은 바로 횡 절 관심 점 에 대한 추상 이다.
3. 연결 점 (joinpoint)
차단 되 는 점, Spring 은 방법 형식의 연결 점 만 지원 하기 때문에 Spring 에서 연결 점 은 차단 되 는 방법 을 말 합 니 다. 실제로 연결 점 은 필드 나 구조 기 일 수도 있 습 니 다.
4. 접점 (pointcut)
연결 점 을 차단 하 는 정의
5. 알림 (advice)
알림 이란 연결 점 을 차단 한 후에 실행 할 코드 를 말 하 는데 알림 은 전치, 후 치, 이상, 최종, 서 라운드 알림 다섯 가지 로 나 뉜 다.
6. 목표 대상
에이전트 대상
7. 짜 기 (weave)
대상 에 절단면 을 적용 하고 프 록 시 대상 을 만 드 는 과정
8. 도입 (introduction)
코드 를 수정 하지 않 는 전제 에서 도입 은 클래스 에 동적 으로 방법 이나 필드 를 추가 할 수 있 습 니 다.
Spring 의 AOP 지원Spring AOP Spring IOC 、 , IOC 。따라서 AOP 에이 전 트 는 용기 에 있 는 다른 bean 인 스 턴 스 를 직접 사용 할 수 있 으 며, 이러한 관 계 는 IOC 용기 의 의존 주입 에 의 해 제 공 될 수 있다.Spring 프 록 시 생 성 규칙 은:
1. Java AOP 이렇게 하면 모든 인터페이스 인 스 턴 스 에 대 리 를 만 들 수 있 습 니 다.
2, ,Spring CGLIB , CGLIB 강제 사용 가능
AOP 프로 그래 밍 은 사실 매우 간단 한 일이 다. AOP 프로 그래 밍 을 보면 프로그래머 는 세 부분 만 참여 해 야 한다.
1. 일반 업무 구성 요소 정의
2. 접점 을 정의 합 니 다. 하나의 접점 은 여러 개의 업무 구성 요 소 를 가로로 자 를 수 있 습 니 다.
3. 증강 처 리 를 정의 합 니 다. 증강 처 리 는 AOP 프레임 워 크 에서 일반 업무 구성 요 소 를 위 한 처리 동작 입 니 다.
따라서 AOP 프로 그래 밍 을 하 는 관건 은 바로 접점 과 정의 강화 처 리 를 정의 하 는 것 이다. 적당 한 접점 과 강화 처 리 를 정의 하면 AOP 프레임 워 크 는 자동 으로 AOP 대 리 를 생 성 한다. 즉, = + 방법 이다.
다음은 Spring AOP 의. xml 파일 템 플 릿 을 보 여 줍 니 다. 이름 은 aop. xml 이 고 그 다음 내용 은 aop. xml 에서 확장 합 니 다.




Spring 기반 AOP 단순 구현
설명 하기 전에 설명 하 겠 습 니 다. Spring AOP 를 사용 하여 코드 를 성공 적 으로 실행 하려 면 Spring 로 개발 자 에 게 제공 하 는 jar 가방 만 으로 는 부족 합 니 다. 인터넷 에 두 개의 jar 가방 을 추가 로 다운로드 하 십시오.
1、aopalliance.jar
2、aspectjweaver.jar
maven 프로젝트 라면 pom. xml 에 추가 해 야 합 니 다.
1、spring-aop
2、spring-aspects
Spring AOP 의 XML 구현 방식 을 설명 하기 시작 합 니 다. 먼저 인 터 페 이 스 를 정의 합 니 다.
public interface HelloWorld
{
    void printHelloWorld();
    void doPrint();
}

두 인터페이스 구현 클래스 정의:
public class HelloWorldImpl1 implements HelloWorld
{
    public void printHelloWorld()
    {
        System.out.println("Enter HelloWorldImpl1.printHelloWorld()");
    }
    
    public void doPrint()
    {
        System.out.println("Enter HelloWorldImpl1.doPrint()");
        return ;
    }
}
public class HelloWorldImpl2 implements HelloWorld
{
    public void printHelloWorld()
    {
        System.out.println("Enter HelloWorldImpl2.printHelloWorld()");
    }
    
    public void doPrint()
    {
        System.out.println("Enter HelloWorldImpl2.doPrint()");
        return ;
    }
}

가로로 자 르 는 관심 사 입 니 다. 여 기 는 인쇄 시간 입 니 다.
public class TimeHandler
{
    public void printTime()
    {
        System.out.println("CurrentTime = " + System.currentTimeMillis());
    }
}

이 세 가지 종류 가 있 으 면 간단 한 Spring AOP 를 실현 할 수 있 습 니 다. op. xml 설정 을 보십시오.


        
        
        
        
        
        
            
                
                
                
            
        


main 함 수 를 써 서 호출 합 니 다:
public static void main(String[] args)
{
    ApplicationContext ctx = 
            new ClassPathXmlApplicationContext("aop.xml");
        
    HelloWorld hw1 = (HelloWorld)ctx.getBean("helloWorldImpl1");
    HelloWorld hw2 = (HelloWorld)ctx.getBean("helloWorldImpl2");
    hw1.printHelloWorld();
    System.out.println();
    hw1.doPrint();
    
    System.out.println();
    hw2.printHelloWorld();
    System.out.println();
    hw2.doPrint();
}

실행 결 과 는:
CurrentTime = 1446129611993
Enter HelloWorldImpl1.printHelloWorld()
CurrentTime = 1446129611993

CurrentTime = 1446129611994
Enter HelloWorldImpl1.doPrint()
CurrentTime = 1446129611994

CurrentTime = 1446129611994
Enter HelloWorldImpl2.printHelloWorld()
CurrentTime = 1446129611994

CurrentTime = 1446129611994
Enter HelloWorldImpl2.doPrint()
CurrentTime = 1446129611994

Hello World 인터페이스 에 주 는 두 가지 실현 클래스 의 모든 방법 에 에이 전 트 를 추가 하 는 것 을 보 았 습 니 다. 에이 전 트 는 인쇄 시간 입 니 다.
Spring 기반 AOP 는 다른 디 테 일 을 사용 합 니 다.
1. 가로 관심 사 를 추가 하고 로 그 를 인쇄 합 니 다. 자바 류 는:
public class LogHandler
{
    public void LogBefore()
    {
        System.out.println("Log before method");
    }
    
    public void LogAfter()
    {
        System.out.println("Log after method");
    }
}

op. xml 설정:


        
        
        
        
        
        
        
            
                
                
                
            
            
                
                
                
            
        


테스트 클래스 가 변 하지 않 습 니 다. 인쇄 결 과 는 다음 과 같 습 니 다.
CurrentTime = 1446130273734
Log before method
Enter HelloWorldImpl1.printHelloWorld()
Log after method
CurrentTime = 1446130273735

CurrentTime = 1446130273736
Log before method
Enter HelloWorldImpl1.doPrint()
Log after method
CurrentTime = 1446130273736

CurrentTime = 1446130273736
Log before method
Enter HelloWorldImpl2.printHelloWorld()
Log after method
CurrentTime = 1446130273736

CurrentTime = 1446130273737
Log before method
Enter HelloWorldImpl2.doPrint()
Log after method
CurrentTime = 1446130273737

logHandler 를 timeHandler 앞에서 사용 하려 면 두 가지 방법 이 있 습 니 다.
(1) aspect 안에 order 속성 이 있 는데 order 속성의 숫자 는 바로 관심 사 를 가로로 자 르 는 순서 입 니 다.
(2) log Handler 를 timeHandler 앞 에 정의 합 니 다. Spring 은 기본적으로 aspect 의 정의 순 서 를 짜 는 순서 로 합 니 다.
2. 인터페이스 에 짜 는 방법 만 생각 합 니 다.
pointcut 의 expression 을 수정 하면 됩 니 다:


        
        
        
        
        
        
        
            
                
                
                
            
            
                
                
                
            
        


expression 필드 를 볼 수 있 습 니 다. timeHandler 가 Hello World 인터페이스 print 로 시작 하 는 방법, log Handler 가 Hello World 인터페이스 do 로 시작 하 는 방법 을 표시 합 니 다.
3 、 CGLIB 생 성 에이 전 트 를 강제로 사용
앞에서 말 했 듯 이 Spring 은 동적 프 록 시 나 CGLIB 생 성 프 록 시 를 사용 하 는 규칙 이 있 습 니 다. 높 은 버 전의 Spring 은 동적 프 록 시 를 사용 할 지 CGLIB 생 성 프 록 시 내용 을 자동 으로 선택 합 니 다. 물론 CGLIB 생 성 프 록 시 를 강제로 사용 할 수도 있 습 니 다. 바로 'proxy - target - class' 속성 이 있 습 니 다. 이 속성 값 이 true 로 설정 되면 프 록 시가 역할 을 합 니 다.proxy - target - class 가 false 로 설정 되 거나 이 속성 이 생략 되면 의 에이전트 가 작 동 합 니 다.
원리 차이:
자바 동적 대 리 는 반사 체 제 를 이용 하여 프 록 시 인 터 페 이 스 를 실현 하 는 익명 류 를 만 들 고 구체 적 인 방법 을 호출 하기 전에 InvokeHandler 를 호출 하여 처리 합 니 다.한편, cglib 동적 대 리 는 asm 오픈 소스 패 키 지 를 이용 하여 프 록 시 대상 류 의 class 파일 을 불 러 오고 바이트 코드 를 수정 하여 하위 클래스 를 생 성 합 니 다.
1、           ,        JDK       AOP 
2、           ,      CGLIB  AOP 
3、             ,    CGLIB ,spring    JDK     CGLIB    

PS: 원문 주소:http://blog.csdn.net/caomiao2006/article/details/51295158

좋은 웹페이지 즐겨찾기