SpringAOP 구조 주입 의 실현 절차

AOP_절단면 프로 그래 밍 에 대한 초보 적 이해
우 리 는 먼저 한 장면 을 상상 합 니 다.당신 은 프로젝트 를 만 들 고 있 습 니 다.개발 과정 에서 여러 모듈 에 반복 되 는 코드 가 있 습 니 다.그래서 이 를 하나의 방법 으로 추상 화한 다음 에 필요 한 곳 에서 이 방법 을 호출 합 니 다.이 코드 를 수정 해 야 할 때 이 방법 만 수정 하면 됩 니 다.어느 날,당신 의 Boss 는 새로운 수 요 를 주 었 습 니 다.한 가지 방법 을 추상 화 한 다음 에 이 방법 이 필요 한 모듈 에서 이 방법 을 호출 해 야 합 니 다.이것 은 당신 을 골 치 아 프 게 할 수 있 습 니 다.대량의 코드 를 수정 해 야 합 니 다.그래서 소스 코드 를 수정 하지 않 고 시스템 업무 에 어떤 기능 을 추가 할 수 있 을까요?다행히 AOP 는 이 문 제 를 잘 해결 할 수 있 었 다.
간단 한 소개
AOP:개발 자가 소스 코드 를 수정 하지 않 는 전제 에서 시스템 의 업무 구성 요소 에 특정한 유 니 버 설 기능 을 추가 하도록 보장 합 니 다.본질은 AOP 프레임 워 크 에서 업무 구성 요 소 를 수정 하 는 여러 가지 방법의 소스 코드 입 니 다.우 리 는 이 를 두 가지 로 나 눕 니 다.
정적 AOP
AOP 프레임 워 크 는 컴 파일 단계 에서 프로그램 소스 코드 를 수정 하여 정적 AOP 프 록 시 클래스(생 성 된*.class 파일 이 수정 되 었 으 므 로 특정한 컴 파일 러 를 사용 해 야 합 니 다)를 생 성 했 습 니 다.예 를 들 어 AspectJ.
동적 AOP:
AOP 프레임 워 크 는 실행 단계 에서 동적 생 성 프 록 시 대상(메모리 에 JDK 동적 프 록 시 또는 CGlib 로 AOP 프 록 시 클래스 를 동적 으로 생 성 합 니 다),예 를 들 어 SpringAOP.
자세하게 설명 하 다
Spring 알림 유형
명칭.
라벨
설명 하 다.
사전 통지
@Before
사전 알림 설정 에 사용 합 니 다.추가 방법 을 지정 하여 접점 방법 전에 실행 합 니 다.
후방 알림
@AfterReturning
설정 후 알림 에 사용 합 니 다.강화 방법 을 지정 하여 접점 방법 을 지정 한 후에 실행 합 니 다.
서 라운드 알림
@Around
서 라운드 알림 설정 에 사용 합 니 다.강화 방법 을 지정 합 니 다.
이상 알림
@AfterThrowing
이상 알림 설정 에 사용 합 니 다.이상 이 발생 했 을 때 강화 하 는 방법 을 지정 합 니 다.
최종 통지
@After
최종 알림 설정 에 사용 합 니 다.증강 방식 의 집행 에 이상 이 있 든 없 든 간 에 모두 집행 할 것 이다.
절단면 류 주해
@Aspect
이 현재 클래스 는 절단면 클래스 라 고 표시 합 니 다.
정지점 주해
@Pointcut
반환 값 이 void 이 고 방법 체 가 비어 있 는 방법 으로 접근 점 을 명명 합 니 다.
실전 연습
의존 패키지 가 져 오기

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.5</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>5.3.5</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.6</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/aopalliance/aopalliance -->
        <dependency>
            <groupId>aopalliance</groupId>
            <artifactId>aopalliance</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
증강 클래스 및 인터페이스 만 들 기
강화 클래스 인터페이스:

public interface VisitService {
    //        ,    ,    ,    
    void visit(String str) throws Exception;

    //        
    void around();
}
증강 클래스:

public class VisitServiceImpl implements VisitService {
    //  ,  ,  ,        
    public void visit(String str) throws Exception{
        System.out.println(str);
        if(!str.equalsIgnoreCase("agree")){
            throw new Exception("    ");
        }
    }
    //        
    public void around() {
        System.out.println("    ");
    }
}
절단면 클래스 만 들 기

@Component("VisitAspect")
@Aspect //    myAspect      
public class VisitAspect_anno {
    //         
    //          void 、              
    @Pointcut("execution(* Spring_AOP.service.impl.VisitServiceImpl.visit(..))")
    private void v1() {
    }

    //    
    @Before("v1()")
    public void visitBefore(JoinPoint joinPoint) {

        System.out.println("  :");
    }

    @After("v1()")
    //    ,      ,   
    public void visitAfter(JoinPoint joinPoint) {
        System.out.println("    ");
    }

    @AfterReturning("v1()")
    //         
    public void visitSuccess(JoinPoint joinPoint) {
        System.out.println("    ,  ");
    }

    @AfterThrowing(value = "v1()",throwing = "ex")
    //    ,     
    public void visitThrow(JoinPoint joinPoint, Throwable ex) {
        System.out.println("    ,  ");
    }

    @Around("execution(* Spring_AOP.service.impl.VisitServiceImpl.around())")
    //    ,          
    public Object visitAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("-------  -------");
        Object obj = proceedingJoinPoint.proceed();
        System.out.println("------------------");
        return obj;
    }
}
xml 파일 설정

    <!--          AspectJ -->
    <context:component-scan base-package="Spring_AOP" />
    <!--            AspectJ     -->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
테스트 클래스 만 들 기

 public class visitTest {
    @Test
    public void VisitTest(){
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext_AOP.xml");
        VisitService visitService = app.getBean(VisitService.class);
        try {
            visitService.visit("agree");
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            visitService.visit("ok");
        } catch (Exception e) {
            e.printStackTrace();
        }
        visitService.around();
    }
}
테스트 실행
구령:
agree
요청 성공,환영
입력 완료
구령:
ok
요청 실패,거절
입력 완료
둘러싸다
서 라운드 알림
둘러싸다
총결산
구조 주입 을 사용 하면 AOP 모드 를 더욱 편리 하 게 구현 할 수 있 지만,마찬가지 로 설치 주입 에 비해 각기 다른 장점 이 있다.
이상 은 주해 로 SpringAOP 프레임 워 크 주입 의 실현 을 실현 하 는 것 입 니 다.잘못 이 있 으 면 지적 해 주 십시오.지금까지 인내심 을 가 진 친구 에 게 감 사 드 립 니 다.
SpringAOP 에 관 한 이 편 입 니 다.구조 주입 의 실현 절차 에 대한 글 은 여기까지 입 니 다.SpringAOP구조 주입 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기