일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
Tags
- ipfs bean
- spring mongoTemplate
- kotiln const
- java 1238
- 백준 2252 줄세우기
- java 1509
- kotiln const val
- nodejs rabbitmq
- javav 1676
- java 파티
- spring mongodb switch
- Spring ipfs
- 백준 연결요소 자바
- 자바 백준 팩토리얼 개수
- 안정해시
- kotiln functional interface
- 익명 객체 @transactional
- mongodb lookup
- 백준 1504 java
- 자바 1676
- spring mongoTemplate switch
- java 팩토리얼 개수
- java 백준 1509
- ipfs singletone
- Java Call By Refernce
- rabbitmq 싱글톤
- spring mongodb
- 백준 특정한 최단 경로
- 전략 패턴이란
- go
Archives
- Today
- Total
공부 흔적남기기
프록시 팩토리 | Advice | Pointcut 본문
728x90
반응형
프록시 팩토리란
Spring에서 지원하는 프록시 생성해주는 클래스로
프록시를 사용할 구현체(타겟)과 Advice, PointCut을 지정해서 프록시를 생성할 수 있다.
만약 타겟이 interface라면 jdk dynamic proxy를 생성하고
타겟이 구현체라면 cglib를 생성한다.
둘중에 하나만 사용하도록 설정도 가능하다.
최근 spring은 cglib를 기본값으로 사용하고 있다.
Advice란
Advice란 프록시 로직을 의미한다 (로그, 캐싱, 권한 확인)
Pointcut이란
Advice를 지정할 패키지,클래스,메소드 범위이다.
즉 Advice(로직) PointCut(범위)를 생성하고 ProxyFactory에 넘겨주면 알맞게 proxy를 생성해준다.
참고로 Advice와 PointCut을 합쳐 만든 객체 Advisor를 주로 사용한다.
예시
Advice 만들고
class LogAdvice(
private val logService: LogServiceDirtyCode
) : MethodInterceptor{
override fun invoke(invocation: MethodInvocation): Any? {
val method = invocation.method
val className = method.declaringClass.name
val methodName = method.name
var trace: Trace? = null
return runCatching {
trace = logService.begin(className + methodName)
invocation.proceed()
}.onSuccess {
logService.finish(trace!!)
}.onFailure {
logService.execption(trace!!, it)
throw it
}.getOrThrow()
}
}
PointCut과 생성한 Advice를 통해 Advisor를 만들고
private fun getAdvisor(logService: LogServiceDirtyCode): Advisor {
val pointCut = NameMatchMethodPointcut()
pointCut.setMappedNames("creat*", "get*", "save*", "find*")
return DefaultPointcutAdvisor(pointCut, LogAdvice(logService))
}
ProxyFactory에 타겟과 advisor를 통해 프록시를 만들고 프록시를 대신 빈에 등록한다.
@Bean
fun itemController(logService: LogServiceDirtyCode): ItemController {
val proxyFactory = ProxyFactory(ItemControllerRealSubject(itemService(logService)))
proxyFactory.addAdvisor(getAdvisor(logService))
return proxyFactory.getProxy() as ItemController
}
728x90
반응형