Spring AOP 순 주해 실현

19366 단어 자바aop
의존 패키지 spring - aop, spring - context, spring - aspects, spring - test, junit 가 져 오기
<dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>5.2.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>5.2.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.2.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

설정 클래스 와 절단면 클래스 를 작성 합 니 다.
@Aspect//    
@Configuration//     
@EnableAspectJAutoProxy//  AOP
@ComponentScan("com.xiehetao")//     
public class SpringAop {
     

    @Pointcut("execution(* com.xiehetao.*.*(..))")
    public void pj(){
     }

    @Before("pj()")
    public void sayHi(){
     
        System.out.println("2");
    }

    @After("pj()")
    public void sayHello(){
     
        System.out.println("5");
    }
    @AfterReturning("pj()")
    public void sayGood(){
     
        System.out.println("6");
    }
    @AfterThrowing("pj()")
    public void sayNo(){
     
        System.out.println("6");
    }

    @Around("pj()")
    //      ,                   ,     
    public int process(ProceedingJoinPoint joinPoint){
     
        System.out.println("1");
        int obj=0;
        try{
     
            obj  = (Integer)joinPoint.proceed();
            System.out.println("4");
        }catch (Throwable e){
     
            return 7;
        }
        return obj;
    }
}

피 강화 류
@Component
public class Girl /*implement Student*/{
     //     ,java  JDK    ,     cglib      
    public int dance(){
     
        System.out.println("3");
        int i=1/0;//           
        return 7;
    }
}

interface Student {
     
    int dance();
}

테스트 클래스
@RunWith(SpringJUnit4ClassRunner.class)//junit  spring
@ContextConfiguration(classes={
     SpringAop.class})//     ,       ,  locations  
public class test {
     

    @Autowired
    private Girl girl;
    //private Student girl;//   jdk    ,         ,          ,   

    @Test
    public void Test(){
     
        System.out.println(girl.dance());
//        System.out.println(ans);
    }
}


요약: 순 주해 방식 개발 AOP 절차: 1. 의존 패키지 spring - aop, spring - context, spring - aspects, spring - test, junit (후 두 개 는 유닛 테스트 에 사용) 2. 주해 류 (xml 파일 에 해당 함) 를 표시 하고 스 캔 패키지 경 로 를 추가 하 며 절단면 을 추가 하고 AOP 동적 대 리 를 추가 합 니 다.(두 가지 프 록 시 방식 이 있 습 니 다. 하 나 는 JDK 동적 프 록 시 입 니 다. 인 터 페 이 스 를 실현 하 는 방식, 하 나 는 CGlib 입 니 다. 클래스 를 통 해 이 루어 지지 만 final 클래스 를 강화 할 수 없습니다) 3. advice (알림) 를 작성 합 니 다.알림 은 다섯 가지 가 있 습 니 다. 전치, 후 치, 복귀 후 치, 이상 알림, 서 라운드 알림 의 실행 순 서 는 클래스 에서 우선 서 라운드 알림 을 숫자 로 표시 한 다음 에 후 치 알림 은 리 턴 후 치 와 이상 알림 전에 서 라운드 알림 을 사용 하 는 것 을 권장 합 니 다. 4. JDK 동적 대리 와 cglib 동적 대리 에 대해 JDK 동적 대리 방식 으로 이 루어 지 기 를 원한 다 면 테스트 했 습 니 다.인 터 페 이 스 를 정의 한 다음 에 이 인 터 페 이 스 를 실현 합 니 다. 테스트 할 때 주입 대상 은 인터페이스 유형 이 어야 합 니 다. (클래스 를 실현 하 는 방식 으로 주입 하면 오류 가 발생 할 수 있 습 니 다. @ Autowired 검색 은 유형 에 따라 찾 습 니 다. girl 은 두 가지 유형 이 있 습 니 다. 하 나 는 인터페이스 유형 이 고 하 나 는 실체 유형 입 니 다)오류 유형: 'com. xiehetao. test' 라 는 이름 의 bean 을 만 드 는 중 오류 가 발생 했 습 니 다. 필드 'girl' 을 통 해 표 현 된 불만 족 스 러 운 의존성; 중첩 예 외 는 org. springframework. beans. factory. BeanNotOFRequiredTypeException: Bean named 'girl' 은 'com. xiehetao. Girl' 유형 이 될 것 으로 예상 되 지만 실제로는 'com. sun. proxy. $Proxy 29' 유형 이 었 습 니 다.cglib 동적 에이전트 방식 으로 구현 되 기 를 바 랍 니 다. 클래스 를 직접 실현 하면 됩 니 다. 여기 자바 는 자동 으로 판단 합 니 다. 그런 방식 이 적당 합 니 다. 기본 방식 은 JDK 동적 에이전트 입 니 다.

좋은 웹페이지 즐겨찾기