spring core proxy : log trace - bean post processor
This commit is contained in:
@@ -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.v3_proxyfactory.ProxyFactoryConfigV1;
|
||||
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.ThreadLocalLogTrace;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
@@ -21,7 +22,8 @@ import org.springframework.context.annotation.Import;
|
||||
//@Import(DynamicProxyBasicConfig.class)
|
||||
//@Import(DynamicProxyFilterConfig.class)
|
||||
//@Import(ProxyFactoryConfigV1.class)
|
||||
@Import(ProxyFactoryConfigV2.class)
|
||||
//@Import(ProxyFactoryConfigV2.class)
|
||||
@Import(BeanPostProcessorConfig.class)
|
||||
@SpringBootApplication(scanBasePackages = "com.example.proxy.app")
|
||||
public class ProxyApplication {
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user