-
스프링 AOP: @AOPSPRING/스프링프레임워크 핵심개념 2021. 5. 29. 17:12
Spring AOP를 시작하기 위해서는 아래와 같이 의존성을 추가해야 한다.
<dependency> <groupId>org.spring.framwork.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
@Aspect을 통해 Aspect로 정의하고 Component 등록을 한다.
@Component @Aspect public class PerfAspect { // 1. com.springaop로 시작하는 패키지의 EventService 클래스의 모든 메서드에 적용 //@Around("execution(* com.springaop..*.EventService.*(..))") // 2. 아래 PerfLogging 어노테이션이 적용된 곳만 적용 @Around("@annotation(PerfLogging)") // 3. 해당 Bean의 모든 메서드에 적용 // @Around("bean(simpleEventService)") public Object logPerf(ProceedingJoinPoint pjp) throws Throwable { long begin = System.currentTimeMillis(); Object retVal = pjp.proceed(); System.out.println(System.currentTimeMillis() - begin); return retVal; } // simpleEventService의 모든 Method 실행 전에 hello method가 실행 @Before("bean(simpleEventService)") public void hello() { System.out.println("hello"); } }
@Service public class SimpleEventService implements EventService { // PerfLogging 어노테이션이 붙은 메서드만 Aspect에 등록된 Advice를 실행 @PerfLogging @Override public void createEvent() { long begin = System.currentTimeMillis(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Created an event"); } @PerfLogging @Override public void publishEvent() { long begin = System.currentTimeMillis(); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Published an event"); } @PerfLogging @Override public void deleteEvent() { System.out.println("Delete an event"); } }
@Documented @Target(ElementType.METHOD) @Retention(RetentionPolicy.CLASS) // Retention은 아래 Annotation을 얼마나 유지할 것인가를 의미 // CLASS file까지 Annotation 정보를 유지 (일반적으로) public @interface PerfLogging { }
어드바이스 정의
- @Before
- @AfterReturning
- @AfterThrowing
- @Around
'SPRING > 스프링프레임워크 핵심개념' 카테고리의 다른 글
Spring AOP: 프록시 기반 AOP (0) 2021.05.29 스프링 AOP : 개념 (0) 2021.05.29 SPEL(스프링 Expresssion Language) (0) 2021.05.23 데이터 바인딩 추상화 : Converter와 Formatter (0) 2021.05.23 데이터 바인딩 추상화: PropertyEditor (0) 2021.05.19