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 일 월요일 에 작성 되 었 습 니 다)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.