From b0312fc13fab55e4930bdbdd1f371a1f13cbd116 Mon Sep 17 00:00:00 2001 From: haerong22 Date: Fri, 19 Nov 2021 20:54:37 +0900 Subject: [PATCH] spring core proxy : log trace - bean post processor --- .../com/example/proxy/ProxyApplication.java | 4 +- .../BeanPostProcessorConfig.java | 33 ++++++++++++++++ .../PackageLogTracePostProcessor.java | 39 +++++++++++++++++++ 3 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 spring-core/proxy/src/main/java/com/example/proxy/config/v4_postprocessor/BeanPostProcessorConfig.java create mode 100644 spring-core/proxy/src/main/java/com/example/proxy/config/v4_postprocessor/postprocessor/PackageLogTracePostProcessor.java diff --git a/spring-core/proxy/src/main/java/com/example/proxy/ProxyApplication.java b/spring-core/proxy/src/main/java/com/example/proxy/ProxyApplication.java index 85413bfe..950f6d98 100644 --- a/spring-core/proxy/src/main/java/com/example/proxy/ProxyApplication.java +++ b/spring-core/proxy/src/main/java/com/example/proxy/ProxyApplication.java @@ -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 { diff --git a/spring-core/proxy/src/main/java/com/example/proxy/config/v4_postprocessor/BeanPostProcessorConfig.java b/spring-core/proxy/src/main/java/com/example/proxy/config/v4_postprocessor/BeanPostProcessorConfig.java new file mode 100644 index 00000000..2f24a191 --- /dev/null +++ b/spring-core/proxy/src/main/java/com/example/proxy/config/v4_postprocessor/BeanPostProcessorConfig.java @@ -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); + } +} diff --git a/spring-core/proxy/src/main/java/com/example/proxy/config/v4_postprocessor/postprocessor/PackageLogTracePostProcessor.java b/spring-core/proxy/src/main/java/com/example/proxy/config/v4_postprocessor/postprocessor/PackageLogTracePostProcessor.java new file mode 100644 index 00000000..6bb9b000 --- /dev/null +++ b/spring-core/proxy/src/main/java/com/example/proxy/config/v4_postprocessor/postprocessor/PackageLogTracePostProcessor.java @@ -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; + } +}