spring core proxy : proxy factory
This commit is contained in:
@@ -0,0 +1,22 @@
|
||||
package com.example.proxy.common.advice;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.aopalliance.intercept.MethodInterceptor;
|
||||
import org.aopalliance.intercept.MethodInvocation;
|
||||
|
||||
@Slf4j
|
||||
public class TimeAdvice implements MethodInterceptor {
|
||||
@Override
|
||||
public Object invoke(MethodInvocation invocation) throws Throwable {
|
||||
log.info("TimeProxy 실행");
|
||||
long startTime = System.currentTimeMillis();
|
||||
|
||||
Object result = invocation.proceed();
|
||||
|
||||
long endTime = System.currentTimeMillis();
|
||||
|
||||
long resultTime = endTime - startTime;
|
||||
log.info("TimeProxy 종료 resultTime={}", resultTime);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
package com.example.proxy.proxyfactory;
|
||||
|
||||
import com.example.proxy.common.advice.TimeAdvice;
|
||||
import com.example.proxy.common.service.ConcreteService;
|
||||
import com.example.proxy.common.service.ServiceImpl;
|
||||
import com.example.proxy.common.service.ServiceInterface;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.assertj.core.api.Assertions;
|
||||
import org.junit.jupiter.api.DisplayName;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.aop.framework.ProxyFactory;
|
||||
import org.springframework.aop.support.AopUtils;
|
||||
|
||||
import static org.assertj.core.api.Assertions.*;
|
||||
|
||||
@Slf4j
|
||||
public class ProxyFactoryTest {
|
||||
|
||||
@Test
|
||||
@DisplayName("인터페이스가 있으면 JDK 동적 프록시 사용")
|
||||
void interfaceProxy() {
|
||||
ServiceInterface target = new ServiceImpl();
|
||||
ProxyFactory proxyFactory = new ProxyFactory(target);
|
||||
proxyFactory.addAdvice(new TimeAdvice());
|
||||
ServiceInterface proxy = (ServiceInterface) proxyFactory.getProxy();
|
||||
log.info("targetClass={}", target.getClass());
|
||||
log.info("proxyClass={}", proxy.getClass());
|
||||
|
||||
proxy.save();
|
||||
proxy.find();
|
||||
|
||||
assertThat(AopUtils.isAopProxy(proxy)).isTrue();
|
||||
assertThat(AopUtils.isJdkDynamicProxy(proxy)).isTrue();
|
||||
assertThat(AopUtils.isCglibProxy(proxy)).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("구체 클래스만 있으면 CGLIB 사용")
|
||||
void concreteProxy() {
|
||||
ConcreteService target = new ConcreteService();
|
||||
ProxyFactory proxyFactory = new ProxyFactory(target);
|
||||
proxyFactory.addAdvice(new TimeAdvice());
|
||||
ConcreteService proxy = (ConcreteService) proxyFactory.getProxy();
|
||||
log.info("targetClass={}", target.getClass());
|
||||
log.info("proxyClass={}", proxy.getClass());
|
||||
|
||||
proxy.call();
|
||||
|
||||
assertThat(AopUtils.isAopProxy(proxy)).isTrue();
|
||||
assertThat(AopUtils.isJdkDynamicProxy(proxy)).isFalse();
|
||||
assertThat(AopUtils.isCglibProxy(proxy)).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("ProxyTargetClass 옵션을 사용하면 인터페이스가 있어도 CGLIB 를 사용하고, 클래스 기반 프록시 사용")
|
||||
void proxyTargetClass() {
|
||||
ServiceInterface target = new ServiceImpl();
|
||||
ProxyFactory proxyFactory = new ProxyFactory(target);
|
||||
proxyFactory.setProxyTargetClass(true);
|
||||
proxyFactory.addAdvice(new TimeAdvice());
|
||||
ServiceInterface proxy = (ServiceInterface) proxyFactory.getProxy();
|
||||
log.info("targetClass={}", target.getClass());
|
||||
log.info("proxyClass={}", proxy.getClass());
|
||||
|
||||
proxy.save();
|
||||
proxy.find();
|
||||
|
||||
assertThat(AopUtils.isAopProxy(proxy)).isTrue();
|
||||
assertThat(AopUtils.isJdkDynamicProxy(proxy)).isFalse();
|
||||
assertThat(AopUtils.isCglibProxy(proxy)).isTrue();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user