티스토리 뷰
Spring/Spring AOP
Spring : AOP with Java Config - Method Parameter 접근
Korean Eagle 2020. 5. 13. 15:46728x90
1. 이 포스트는 Spring : AOP with Java Config 시리즈의 연속이다.
2. 종종 어떤 메소드를 실행 전후에 해당 메소드의 parameter에 접근해 데이터를 참조하거나 수정할 필요가 있다.
3. Apect 클래스에서 method argument에 접근하는 방법은 java reflect를 이용한 JoinPoint Aspectj 클래스를 사용한다.
3-1 이 예제는 복잡함을 줄이기 위해 @Order를 설정한 직전 포스트의 Aspect클래스를 사용하지 않는다.
3-2 JoinPoint클래스를 advice 메소드의 parameter로 설정하여 호출 대상 메소드의 정보를 받아온다.
3-2-1 Java reflect를 사용하기 때문에 해당 클래스에 관련 메타데이터 정보를 JoinPoint에서 가져올 수 있다.
3-2-2 getSignature 메소드를 통해 메소드 이름 정보를 받아올 수 있다.
3-2-3 getArgs 메소드를 통해서 타겟 메소드의 arguement를 받아 올 수 있다.
3-2-3-1 받아온 argument는 Object 배열로 받아와 세부정보를 사용할 수 있다.
// point cut 설정 클래스
@Aspect
@Component
public class AopExpressions {
@Pointcut(value = "execution(* pe.pilseong.spring_aop_review.dao.*.*(..))")
public void forDAOPackage() {}
@Pointcut(value = "execution(* pe.pilseong.spring_aop_review.dao.*.get*(..))")
public void getter() {}
@Pointcut(value = "execution(* pe.pilseong.spring_aop_review.dao.*.set*(..))")
public void setter() {}
@Pointcut(value = "forDAOPackage() && !(getter() || setter())")
public void forDAOPackageNoGetterSetter() {}
}
// point cut 사용 Aspect 클래스
@Aspect
@Component
public class LoggingAspect {
@Before(value = "pe.pilseong.spring_aop_review.aspect.AopExpressions.forDAOPackageNoGetterSetter()")
public void beforeAdvice(JoinPoint joinPoint) {
System.out.println("\nExecuting in beforeAdvice @Before advice on forDAOPackage() && !(getter() || setter())");
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
System.out.println("Method :: " + methodSignature.toString());
System.out.println("-- Method arguments start ");
for (Object arg: joinPoint.getArgs()) {
if (arg instanceof Account) {
Account account = (Account) arg;
System.out.println("Account name :: " + account.getName());
System.out.println("Account level :: " + account.getLevel());
} else {
System.out.println(arg.toString());
}
}
// Object[] args = joinPoint.getArgs();
// Arrays.stream(args).forEach(System.out::println);
System.out.println("-- Method arguments end");
}
}
// 실행 클래스
public class App {
public static void main(String[] args) {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(JavaConfig.class);
AccountDAO accountDAO = context.getBean("accountDAO", AccountDAO.class);
accountDAO.getAccount();
Account account = new Account();
account.setName("Pilseong");
account.setLevel("Admin");
accountDAO.addAccount(account, true);
MembershipDAO membershipDAO = context.getBean("membershipDAO", MembershipDAO.class);
membershipDAO.membership();
context.close();
}
}
// 실행 결과
class pe.pilseong.spring_aop_review.dao.AccountDAO: getAccount() with No Parameter. Doing my DB work: getting an account
Executing in beforeAdvice @Before advice on forDAOPackage() && !(getter() || setter())
Method :: void pe.pilseong.spring_aop_review.dao.AccountDAO.addAccount(Account,boolean)
-- Method arguments start
Account name :: Pilseong
Account level :: Admin
true
-- Method arguments end
class pe.pilseong.spring_aop_review.dao.AccountDAO: addAccount() with Account, boolean Parameter. Doing my DB work: Adding an account
Executing in beforeAdvice @Before advice on forDAOPackage() && !(getter() || setter())
Method :: void pe.pilseong.spring_aop_review.dao.MembershipDAO.membership()
-- Method arguments start
-- Method arguments end
class pe.pilseong.spring_aop_review.dao.MembershipDAO: membership() with No parameter. Doing my DB work: membership method is doing something
728x90
'Spring > Spring AOP' 카테고리의 다른 글
Spring : AOP with Java Config - @AfterReturning return data 수정 (0) | 2020.05.13 |
---|---|
Spring : AOP with Java Config - @AfterRetuning advice (0) | 2020.05.13 |
Spring : AOP with Java Config - Aspect 실행 순서 설정 (0) | 2020.05.13 |
Spring : AOP with Java Config - Combining Pointcut Expression (0) | 2020.05.12 |
Spring : AOP with Java Config - @Pointcut annotation (0) | 2020.05.12 |
댓글
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
- 도커 개발환경 참고
- AWS ARN 구조
- Immuability에 관한 설명
- 자바스크립트 멀티 비동기 함수 호출 참고
- WSDL 참고
- SOAP 컨슈머 참고
- MySql dump 사용법
- AWS Lambda with Addon
- NFC 드라이버 linux 설치
- electron IPC
- mifare classic 강의
- go module 관련 상세한 정보
- C 메모리 찍어보기
- C++ Addon 마이그레이션
- JAX WS Header 관련 stackoverflow
- SOAP Custom Header 설정 참고
- SOAP Custom Header
- SOAP BindingProvider
- dispatcher 사용하여 설정
- vagrant kvm으로 사용하기
- git fork, pull request to the …
- vagrant libvirt bridge network
- python, js의 async, await의 차이
- go JSON struct 생성
- Netflix Kinesis 활용 분석
- docker credential problem
- private subnet에서 outbound IP 확…
- 안드로이드 coroutine
- kotlin with, apply, also 등
- 안드로이드 초기로딩이 안되는 경우
- navigation 데이터 보내기
- 레이스 컨디션 navController
- raylib
TAG
- Security
- 설정하기
- hibernate
- jsp
- 하이버네이트
- Many-To-Many
- mapping
- 로그인
- XML
- 매핑
- 스프링
- Angular
- Spring
- spring boot
- Validation
- one-to-many
- 스프링부트
- form
- Rest
- login
- RestTemplate
- MYSQL
- one-to-one
- 자바
- 설정
- WebMvc
- 상속
- crud
- 외부파일
- Spring Security
250x250