Skip to content

Commit 5a57c5d

Browse files
committed
빈 후처리기 - 적용
1 parent 0de9384 commit 5a57c5d

File tree

3 files changed

+78
-1
lines changed

3 files changed

+78
-1
lines changed

proxy/src/main/java/hello/proxy/ProxyApplication.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@
88
import hello.proxy.config.v2_dynamicproxy.DynamicProxyFilterConfig;
99
import hello.proxy.config.v3_proxyfactory.ProxyFactoryConfigV1;
1010
import hello.proxy.config.v3_proxyfactory.ProxyFactoryConfigV2;
11+
import hello.proxy.config.v4_postprocessor.BeanPostProcessorConfig;
1112
import hello.proxy.trace.logtrace.LogTrace;
1213
import hello.proxy.trace.logtrace.ThreadLocalLogTrace;
14+
import org.springframework.beans.factory.config.BeanPostProcessor;
1315
import org.springframework.boot.SpringApplication;
1416
import org.springframework.boot.autoconfigure.SpringBootApplication;
1517
import org.springframework.context.annotation.Bean;
@@ -19,7 +21,9 @@
1921
//@Import({InterfaceProxyConfig.class, ConcreteProxyConfig.class})
2022
//@Import(DynamicProxyFilterConfig.class)//dynamic proxy
2123
//@Import(ProxyFactoryConfigV1.class)//dynamic proxy
22-
@Import(ProxyFactoryConfigV2.class)//dynamic proxy
24+
//@Import(ProxyFactoryConfigV2.class)//dynamic proxy
25+
@Import(BeanPostProcessorConfig.class)//dynamic proxy
26+
2327
@SpringBootApplication(scanBasePackages = "hello.proxy.app") //주의
2428
public class ProxyApplication {
2529
public static void main(String[] args) {
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package hello.proxy.config.v4_postprocessor;
2+
3+
import hello.proxy.config.AppV1Config;
4+
import hello.proxy.config.AppV2Config;
5+
import hello.proxy.config.v3_proxyfactory.advice.LogTraceAdvice;
6+
import hello.proxy.config.v4_postprocessor.postprocessor.PackageLogTracePostProcessor;
7+
import hello.proxy.trace.logtrace.LogTrace;
8+
import lombok.extern.slf4j.Slf4j;
9+
import org.springframework.aop.Advisor;
10+
import org.springframework.aop.support.DefaultPointcutAdvisor;
11+
import org.springframework.aop.support.NameMatchMethodPointcut;
12+
import org.springframework.context.annotation.Bean;
13+
import org.springframework.context.annotation.Configuration;
14+
import org.springframework.context.annotation.Import;
15+
16+
@Slf4j
17+
@Configuration
18+
@Import({AppV1Config.class, AppV2Config.class})
19+
public class BeanPostProcessorConfig {
20+
21+
@Bean
22+
public PackageLogTracePostProcessor logTracePostProcessor(LogTrace logTrace){
23+
return new PackageLogTracePostProcessor("hello.proxy.app",getAdvisor(logTrace));
24+
}
25+
26+
private Advisor getAdvisor(LogTrace logTrace) {
27+
//pointcut
28+
NameMatchMethodPointcut pointcut = new NameMatchMethodPointcut();
29+
pointcut.setMappedNames("request*", "order*", "save*");
30+
//advice
31+
LogTraceAdvice advice = new LogTraceAdvice(logTrace);
32+
return new DefaultPointcutAdvisor(advice);
33+
}
34+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package hello.proxy.config.v4_postprocessor.postprocessor;
2+
3+
import lombok.extern.slf4j.Slf4j;
4+
import org.springframework.aop.Advisor;
5+
import org.springframework.aop.framework.ProxyFactory;
6+
import org.springframework.beans.BeansException;
7+
import org.springframework.beans.factory.config.BeanPostProcessor;
8+
9+
@Slf4j
10+
public class PackageLogTracePostProcessor implements BeanPostProcessor {
11+
12+
private final String basePackage;
13+
private final Advisor advisor;
14+
15+
public PackageLogTracePostProcessor(String basePackage, Advisor advisor) {
16+
this.basePackage = basePackage;
17+
this.advisor = advisor;
18+
}
19+
20+
@Override
21+
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
22+
log.info("param beanName={} name={}", beanName, bean.getClass());
23+
//프록시 적용 대상 여부 체크
24+
//프록시 적용 대상이 아니면 원본을 그대로 진행
25+
String packageName = bean.getClass().getPackageName();
26+
if(!packageName.startsWith(basePackage)){
27+
return bean;
28+
}
29+
30+
// 프록시 대상이면 프록시를 만들어서 반환
31+
ProxyFactory proxyFactory = new ProxyFactory(bean);
32+
proxyFactory.addAdvisor(advisor);
33+
34+
Object proxy = proxyFactory.getProxy();
35+
log.info("create proxy: target={] proxy={}", bean.getClass(), proxy.getClass());
36+
return proxy;
37+
//return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
38+
}
39+
}

0 commit comments

Comments
 (0)