Spring Aop (2) - Aspectj 주 해 를 바탕 으로 하 는 Spring Aop 간단 한 실현

더 읽 기
2 Aspectj 주 해 를 바탕 으로 하 는 Spring Aop 간단 한 실현
Spring Aop 은 Aop 프레임 워 크 Aspectj 를 바탕 으로 이 루어 진 것 으로 Aspectj 프레임 워 크 를 완전히 확장 하고 개조 하 는 것 이 아니 라 Aspectj 안의 일부 기능 을 이용 하여 자신의 Aop 프레임 워 크 를 실현 하 는 것 이다. 그 중에서 Aspectj 가 제공 하 는 주석 에 대한 해석 을 포함한다.앞서 Spring Aop 과 Aspectj 가 실현 한 Aop 간 의 차 이 는 더 이상 언급 하지 않 겠 다 고 밝 혔 다.본 고 는 주로 Aspectj 가 제공 한 주 해 를 어떻게 이용 하여 Spring Aop 기능 을 실현 하 는 지 를 묘사 하 는데 이것 은 모두 가 Spring Aop, Aspectj 주 해 를 사용 하여 Spring Aop 을 개발 하 는 데 초보적인 인상 을 가지 도록 하 는 데 목적 을 둔다.
2.1 Aspectj 주석 지원 사용 하기
Aspectj 주석 을 사용 하여 Spring Aop 을 실현 할 때 우 리 는 먼저 Spring 이 Aspectj 주석 에 지원 하 는 기능 을 사용 해 야 합 니 다. 이것 은 설정 을 통 해 이 루어 집 니 다.스프링 설정 이 설정 파일 을 위주 로 할 때 스프링 설정 파일 에 op 관련 schema 를 도입 한 다음 을 통 해 Aspectj 주석 에 대한 지원 을 사용 할 수 있 습 니 다.
xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

	<context:annotation-config/>
	<context:component-scan base-package="com.elim.test"/>
	
    <aop:aspectj-autoproxy/>

beans>

@ Configuration 에 표 시 된 설정 클래스 를 사용 하여 설정 을 진행 할 때, 이 설정 클래스 에서 @ EnableaspectJAuto Proxy 를 사용 하여 표시 함으로써 Aspectj 주석 에 대한 지원 을 사용 할 수 있 습 니 다.
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@Configuration
@EnableAspectJAutoProxy
public class AppConfig {

}

2.2 정의 절단면 클래스
절단면 클래스 를 정의 하 는 것 은 간단 합 니 다. @ Aspect 를 사용 하여 표 시 된 클래스 만 정의 하면 됩 니 다. @Aspect 는 Spring Aop 에서 절단면 류 를 식별 하 는 표지 이지 만 @ Aspect 만 사용 하여 절단면 류 를 표시 하면 안 됩 니 다.Spring Aop 은 bean 용기 에 정 의 된 bean 에 만 작용 하기 때문에 대응 하 는 절단면 류 도 bean 용기 에 정 의 된 bean 대상 일 때 만 발견 할 수 있 습 니 다. @Aspect 는 기본적으로 Spring 을 스 캔 하여 해당 하 는 클래스 를 Spring bean 으로 예화 하 는 기능 을 가지 고 있 지 않 기 때문에 bean 용기 에서 이 bean 을 정의 해 야 합 니 다.프로필 을 통 해 정의 할 수도 있 고 @ Component 를 사용 하여 레이 블 할 수도 있 습 니 다.
@Aspect
@Component
public class MyAspect {
	
}

@ Aspect 에 표 시 된 절단면 류 를 사용 해도 일반 클래스 처럼 일반적인 속성 과 방법 을 정의 할 수 있 으 며 필요 하 다 면 일반적인 bean 으로 사용 할 수 있 습 니 다.
2.3 정의 Pointcut
Pointcut 은 절단면 류 에 필요 한 조 인 트 포 인 트 를 정의 하 는 데 사 용 됩 니 다. Spring Aop 에서 이러한 조 인 트 포 인 트 는 우리 가 절 입 해 야 할 방법 입 니 다. 전에 우리 가 Spring Aop 은 bean 방법 에 대한 절 입 만 지원 한다 고 말 했 기 때 문 입 니 다.Aspect 주석 형식 으로 정 의 된 Pointcut 의 핵심 은 @ Pointcut 주석 입 니 다. 저 희 는 Aspect 클래스 에서 값 을 되 돌려 주지 않 는 방법 을 정의 해 야 합 니 다. 방법 유형 은 임의로 정의 할 수 있 습 니 다. 그리고 이 방법 에 @ Pointcut 을 사용 하여 표 시 를 해 야 합 니 다. 이 는 Pointcut 정의 이 고 해당 하 는 방법 명 은 이 Pointcut 의 이름 을 표시 합 니 다. @Pointcut 은 value 속성 이 있 습 니 다. 보통 표현 식 입 니 다. 이 를 통 해 현재 Pointcut 에 필요 한 JoinPoint 를 지정 할 수 있 습 니 다.표현 식 은 여러 가지 로 쓸 수 있 습 니 다. 이것 은 후속 적 으로 전문 적 으로 설명 할 것 입 니 다. 보통 가장 많이 사용 하 는 것 은 execution 입 니 다. 방법의 집행 을 나타 내 는 것 입 니 다.Pointcut 의 JoinPoint 를 모든 add 방법 으로 정의 하려 면 다음 과 같이 정의 할 수 있 습 니 다.
@Aspect
@Component
public class MyAspect {

	@Pointcut("execution(* add(..))")
	private void pointcut() {}
	
}

2.4 정의 조언
Advice 는 지정 한 Pointcut 에 일치 하 는 JoinPoint 에서 실행 할 동작 을 정의 하기 위해 Pointcut 와 연결 해 야 합 니 다.Advice 는 주로 세 가지 유형 이 있 는데 before, after, around, Aspectj 는 이들 에 게 모두 해당 하 는 주 해 를 지원 합 니 다.Aspectj 주 해 를 바탕 으로 하 는 advice 정 의 는 대응 하 는 주 해 를 통 해 지 정 됩 니 다. 우 리 는 절단면 류 에서 방법 을 정의 한 다음 에 이 방법 에 대응 하 는 주 해 를 사용 하여 표시 해 야 합 니 다.대응 하 는 advice 주 해 는 모두 value 속성 이 있 습 니 다. 이 를 통 해 연 결 된 Pointcut 을 지정 해 야 합 니 다. 해당 하 는 Pointcut 은 Pointcut 이 정의 하 는 클래스 의 전체 이름 을 통 해 지정 해 야 합 니 다. 방법 명 () 을 지정 합 니 다. 현재 절단면 클래스 에서 정의 하 는 Pointcut 이 라면 해당 하 는 클래스 이름 을 생략 할 수 있 습 니 다.여 기 는 주로 before 를 예 로 들 었 습 니 다. 다음 과 같 습 니 다. 우 리 는 절단면 류 에서 하나의 방법 before 를 정 의 했 고 @ Before 주석 으로 이 방법 을 표시 하 는 동시에 연 결 된 Pointcut 을 같은 절단면 류 에서 정의 하 는 pointcut 로 지정 하 였 습 니 다.
@Aspect
@Component
public class MyAspect {

	@Pointcut("execution(* add(..))")
	private void pointcut() {}
	
	@Before("com.elim.test.spring.aop.MyAspect.pointcut()")
	private void before(JoinPoint joinPoint) {
		System.out.println(joinPoint.getTarget() + "----------------------Before---------------------");
	}
	
}

이로써 우 리 는 Spring bean 용기 에 있 는 임의의 bean 대상 의 add 방법 을 방문 하기 전에 MyAspect 절단면 류 에서 정의 하 는 before 방법 을 호출 할 것 입 니 다.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class AopTest {

	@Autowired
	private UserService userService;
	
	@Test
	public void test1() {
		User user = new User(1, "ZhangSan");
		userService.add(user);
	}
	
}

(주: 본 고 는 Spring 4.1.0 을 바탕 으로 작성 한 것 으로 2016 년 9 월 5 일 월요일 에 작성 되 었 습 니 다)

좋은 웹페이지 즐겨찾기