spring core proxy : log trace - bean post processor

This commit is contained in:
haerong22
2021-11-19 20:54:37 +09:00
parent ae8a400691
commit b0312fc13f
3 changed files with 75 additions and 1 deletions

View File

@@ -8,6 +8,7 @@ import com.example.proxy.config.v2_dynamicproxy.DynamicProxyBasicConfig;
import com.example.proxy.config.v2_dynamicproxy.DynamicProxyFilterConfig; import com.example.proxy.config.v2_dynamicproxy.DynamicProxyFilterConfig;
import com.example.proxy.config.v3_proxyfactory.ProxyFactoryConfigV1; import com.example.proxy.config.v3_proxyfactory.ProxyFactoryConfigV1;
import com.example.proxy.config.v3_proxyfactory.ProxyFactoryConfigV2; import com.example.proxy.config.v3_proxyfactory.ProxyFactoryConfigV2;
import com.example.proxy.config.v4_postprocessor.BeanPostProcessorConfig;
import com.example.proxy.trace.logtrace.LogTrace; import com.example.proxy.trace.logtrace.LogTrace;
import com.example.proxy.trace.logtrace.ThreadLocalLogTrace; import com.example.proxy.trace.logtrace.ThreadLocalLogTrace;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
@@ -21,7 +22,8 @@ import org.springframework.context.annotation.Import;
//@Import(DynamicProxyBasicConfig.class) //@Import(DynamicProxyBasicConfig.class)
//@Import(DynamicProxyFilterConfig.class) //@Import(DynamicProxyFilterConfig.class)
//@Import(ProxyFactoryConfigV1.class) //@Import(ProxyFactoryConfigV1.class)
@Import(ProxyFactoryConfigV2.class) //@Import(ProxyFactoryConfigV2.class)
@Import(BeanPostProcessorConfig.class)
@SpringBootApplication(scanBasePackages = "com.example.proxy.app") @SpringBootApplication(scanBasePackages = "com.example.proxy.app")
public class ProxyApplication { public class ProxyApplication {

View File

@@ -0,0 +1,33 @@
package com.example.proxy.config.v4_postprocessor;
import com.example.proxy.config.AppV1Config;
import com.example.proxy.config.AppV2Config;
import com.example.proxy.config.v3_proxyfactory.advice.LogTraceAdvice;
import com.example.proxy.config.v4_postprocessor.postprocessor.PackageLogTracePostProcessor;
import com.example.proxy.trace.logtrace.LogTrace;
import lombok.extern.slf4j.Slf4j;
import org.springframework.aop.Advisor;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.aop.support.NameMatchMethodPointcut;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Slf4j
@Configuration
@Import({AppV1Config.class, AppV2Config.class})
public class BeanPostProcessorConfig {
@Bean
public PackageLogTracePostProcessor logTracePostProcessor(LogTrace logTrace) {
return new PackageLogTracePostProcessor("com.example.proxy.app", getAdvisor(logTrace));
}
private Advisor getAdvisor(LogTrace logTrace) {
NameMatchMethodPointcut pointcut = new NameMatchMethodPointcut();
pointcut.setMappedNames("request*", "order*", "save*");
LogTraceAdvice advice = new LogTraceAdvice(logTrace);
return new DefaultPointcutAdvisor(pointcut, advice);
}
}

View File

@@ -0,0 +1,39 @@
package com.example.proxy.config.v4_postprocessor.postprocessor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.aop.Advisor;
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
@Slf4j
public class PackageLogTracePostProcessor implements BeanPostProcessor {
private final String basePackage;
private final Advisor advisor;
public PackageLogTracePostProcessor(String basePackage, Advisor advisor) {
this.basePackage = basePackage;
this.advisor = advisor;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
log.info("beanName={} bean={}", beanName, bean.getClass());
// 프록시 적용 대상 여부 체크
// 프록시 적용 대상이 아니면 원본을 그대로 진행
String packageName = bean.getClass().getPackage().getName();
if (!packageName.startsWith(basePackage)) {
return bean;
}
// 프록시 대상이면 프록시를 만들어서 변환
ProxyFactory proxyFactory = new ProxyFactory(bean);
proxyFactory.addAdvisor(advisor);
Object proxy = proxyFactory.getProxy();
log.info("create proxy: target={} proxy={}", bean.getClass(), proxy.getClass() );
return proxy;
}
}