Spring Reference 6장

A collection of 22 posts
self-invocation issue

6.6. Proxying mechanisms

Spring AOP는 JDK의 Dynamic Proxy 또는 CGLib을 사용하여 프록시를 만듭니다. 타겟이 되는 객체가 인터페이스를 하나라도 구현했다면 JDK의 Proxy를 사용할 것이고 구현한 인터페이스가 하나도 없을 경우에는 CGLib을 사용하게 됩니다. 원할 때는 명시적으로 CGLib을 사용하도록 할 수도 있지만 다음의 제약사항들이 있습니다. 1. final 메소드는 어드바이스가 적용되지 않습니다. – 오버라이딩 못하기 때문이죠. 2. CGLIB
4 min read
Schema-based AOP

6.4. Choosing which AOP declaration style to use

6.4.1. Spring AOP or full AspectJ? Spring AOP는 별도의 컴파일러나 위버가 필요 없으며 AspectJ 보다 단순합니다. 하지만 컨테이너에 의해 관리되는 bean에만 advice를 적용할 수 있고 적용되는 joinpoint가 메소드 실행 시점 뿐 입니다. 도메인 객체 또는 컨테이너에 의해 관리되지 않는 객체들에 Advice를 적용해야 하거나 더 다양한 joinpoint가 필요하다면 AspectJ를
1 min read
Schema-based AOP

Schema 기반 Introduction

Introduction 예제 [../../669] 와 동일한 예제입니다. 를 사용하였다는 것만 다르죠. 흐흣;; 새로 추가할 메소드를 가진 인터페이스와 그것을 구현한 클래스르 만듭니다. public interface TicketTracked { void incrementTicketCount(); } public class TicketTrackedImpl implements TicketTracked { static int count = 0; public void incrementTicketCount() { System.out.println(“표 ” + (++count) + ” 장 팔았다.”); } } 그리고 this()를 사용하여 포인트컷을 만들어
1 min read
Schema-based AOP

Schema 기반 Advice parameters

Advice parameters [../../665] 여기서 살펴봤던 것과 거의 동일합니다. args() 표현식을 사용하여 포인트컷을 정의합니다. movie라는 이름의 파라미터를 받는 메소드의 조인포인트를 가리키게 됩니다. 이걸 받아서 처리할 어드바이스를 만듭니다. public void veryWelcome(Movie movie){ System.out.println(“하이 ” + movie.getName() + “보려고?”); }xml 파일에 설정해 줍니다.
2 min read
Schema-based AOP

어드바이스 예제

around 어드바이스 역할을 메소드를 만듭니다. @Around 어드바이스 예제 [../../664] 의 예제와 거의 동일합니다. 메소드의 첫번째 인자로 ProceedingJoinPoint가 와야 하며 throws Throwable을 붙여줍니다. public Object aroundSellTicket(ProceedingJoinPoint pjp) throws Throwable{ System.out.println(“왔어? 영화 뭐 볼껀데?”); Ticket ticket = (Ticket) pjp.proceed(); System.out.println(“쌩큐  ” + ticket.getMovie().getName() + “잘봐!”); return
1 min read
Schema-based AOP

어드바이스에서 리턴값 받아오기

Aspect 역할을 할 클래스(이름을 Aspect로 했습니다. 꼭 그래야 하는건 아니죠;;)에 After Returning 때 weaving 될 어드바이스를 일반 메소드로 정의합니다. public class Aspect { public void welcome(){ System.out.println(“어서 오세요. 무엇을 도와드릴까요?”); } public void confirm(){ System.out.println(“확인하기”); } public void afterSellTicket(Ticket ticket){ System.out.println(“감사합니다.
1 min read
@DeclareParents

Introduction 예제

먼저 추가 할 기능의 명세서인 인터페이스가 필요하고 그것을 구현한 클래스가 필요합니다. public interface TicketTracked { void incrementTicketCount(); } public class TicketTrackedImpl implements TicketTracked { static int count = 0; public void incrementTicketCount() { System.out.println(“표 ” + (++count) + ” 장 팔았다.”); } } 그리고 어스팩트에 @DeclareParents를 사용하여 static 필드를 추가합니다. /** introduction **/ @DeclareParents(value=”aop.newStyle.domain.KeesunCinema”, defaultImpl=
1 min read
AspectJ

Advice ordering

@Aspect public class CinemaAspect { @Pointcut(“execution(aop.newStyle.domain.Ticket *.sell*(..))”) public void sellTicketPointcut() { } @Before(“sellTicketPointcut()”) public void before1(){ System.out.println(“표 팔기 전 1”); } @Before(“sellTicketPointcut()”) public void before2(){ System.out.println(“표 팔기 전 2”); } @After(“sellTicketPointcut()”) public void after1(){ System.out.println(“표 팔고 나서 1”
2 min read
advice

Advice parameters

예전에 공부할 때 여기를 공부하다가 멈췄었네요. Advice parameters 1 (2) [../../384] 드디어 따라잡았습니다. 흐흣. 1. Access to the current JoinPoint 해당 Advice가 끼어드는 joinpoint에 대한 정보를 얻어 올 수 있습니다. @Around 어드바이스를 제외한 다른 어드바이스들의 첫번째 파라미터로 JoinPoint 를 만들어 주면 됩니다. @Before(“aop.newStyle.aspect.CinemaAspect.sellTicketPointcut()”) public void
3 min read
AspectJ

6.2. @AspectJ support

@AspectJ 는 Java 5에 추가된 어노테이션을 사용하여 aspect를 정의하는 스타일을 말하며 이것은 AspectJ 라이브러리를 사용하여 AspectJ 5와 동일한 방법으로 aspect와 pointcut을 정의할 수 있습니다. 하지만 Spring AOP를 사용하여 실행하기 때문에 AspectJ의 weaver나 complier는 사용하지 않아도 됩니다. 그것들을 사용하면 AspectJ의 모든 기능을 사용할 수 있습니다. 6.2.1. Enabling @AspectJ Support
4 min read
@Around

@Around 어드바이스 예제

이전까지 사용했던 @Before와 @AfterReturning 대신 @Around 어드바이스 하나로 기존에 했던 인사말들을 모두 처리할 수 있습니다. 더불어 리턴값도 변경할 수 있으며 대상 메소드의 실행 여부도 결정할 수 있습니다. 제약조건은 어드바이스의 메소드 첫번째 인자로 ProceedingJoinPoint [http://mail.eclipse.org/aspectj/doc/next/runtime-api/org/aspectj/lang/ProceedingJoinPoint.html] 가 와야 하며 실제로는
2 min read
@AfterReturning

@AfterReturning 어드바이스 만들기

제일 간단한 @AfterrReturning 어드바이스는 다음과 같습니다. @AfterReturning(“aop.newStyle.aspect.CinemaAspect.sellTicketPointcut()”) public void thanksAdvice(){ System.out.println(“감사합니다. 다음에 또 오세요.”); }@AfterReturning 어드바이스는 대상 메소드의 리턴값을 받아 올 수 있습니다. @AfterReturning의 속성인 returning을 사용하면 됩니다. 다음과 같이 작성할 수 있습니다. @AfterReturning(pointcut=”aop.newStyle.aspect.CinemaAspect.sellTicketPointcut()”, returning=”ticket”
1 min read
AspectJ

@Aspect 붙은 클래스끼리는 상속이 안 됩니다.

이전 글을 작성하다가 문든 들은 생각(@Aspect 가 붙은 클래스들끼리 상속을 하면 포인트컷과 어드바이스를 상속할 수 있는가?)을 실험해봤습니다. //CinamaAspect @Aspect public class CinemaAspect { @Pointcut(“execution(* sellTicket(..))”) public void sellTicketPointcut() { } @Before(“aop.newStyle.aspect.ChildAspect.sellTicketPointcut()”) public void weblcomeAdvice(){ System.out.println(“안녕하세요. 어떤 영화를 보시겠습니까?”); } } //ChildAspect @Aspect public class
3 min read
AspectJ

초간단 @Pointcut 과 @Advice 예제

@Aspect public class CinemaAspect { @Pointcut(“execution(* sellTicket(..))”) public void sellTicketPointcut() { } @Before(“aop.newStyle.aspect.CinemaAspect.sellTicketPointcut()”) public void weblcomeAdvice(){ System.out.println(“안녕하세요. 어떤 영화를 보시겠습니까?”); } } 설정파일에 이 Aspect를 bean으로 등록합니다. pointcut의 이름에 해당하는 public void sellTicketPointcut() 부분에서 리턴타입은 항상 void여야 합니다. 접근지시자는 다른 Aspect에서 해당 포인트컷을 참조 할 수
1 min read
AspectJ

6.1. Introduction

선언적 트랜잭선 관리(declarative transaction management)와 같이 EJB를 대체할 만한 선언적인 엔터프라이즈 서비스를 제공하기 위해 사용하며, 이것으로 OOP를 보완 하기 위해 사용자 정의 apect를 만들어 사용할 때 유용합니다. 6.1.1. AOP concepts Aspect : 여러 객체를 관통하는 cross-concern을 구현한 것. Join Point : 프로그램이 실행되는 동안의 여러 시점들.. 그 중에서
3 min read
AOP

Aspect Oriented Programming with Spring

6.1. IntroductionAOP의 기본 개념과 Spring AOP의 기능과 목표를 이야기 합니다. Spring AOP는 Proxy 기반입니다. 6.1. Introduction [../../../../648] 6.2. @AspectJ support어노테이션을 사용하여 AspectJ를 사용하는 방법입니다. Spring AOP가 지원하는 포인트컷은 method 실행 시점뿐입니다. 6.2. @AspectJ support [../../../../654] 6.3. Schema-based AOP support6.2에서 한 내용을 어노테이션 기반이 아닌
1 min read