public class BeanPostProcessorTest {
@Test
void basicConfig() {
ApplicationContext ac = new AnnotationConfigApplicationContext(BeanPostProcessorConfig.class);
//beanA 이름으로 B 객체가 빈으로 등록된다.
B b = ac.getBean("beanA", B.class);
b.helloB();
//A는 빈으로 등록되지 않는다.
assertThrows(NoSuchBeanDefinitionException.class, () -> ac.getBean(A.class));
}
@Slf4j
@Configuration
static class BeanPostProcessorConfig {
@Bean(name = "beanA")
public A a() {
return new A();
}
@Bean
public AToBPostProcessor helloPostProcessor() {
return new AToBPostProcessor();
}
}
@Slf4j
static class A {
public void helloA() {
log.info("hello A");
}
}
@Slf4j
static class B {
public void helloB() {
log.info("hello B");
}
}
@Slf4j
static class AToBPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
log.info("beanName={}", beanName, bean);
if (bean instanceof A) {
return new B();
}
return bean;
}
}
}
- BeanPostProcessor로 beanA의 이름으로 B를 반환한다. 실무에서는 AspectJ 를 많이 쓴다.
'개발이 좋아서 > Spring이 좋아서' 카테고리의 다른 글
AOP - 구현 (0) | 2024.12.31 |
---|---|
AOP - 개념 (0) | 2024.12.31 |
포인트컷, 어드바이스, 어드바이저 (0) | 2024.12.30 |
프록시 팩토리 (0) | 2024.12.30 |
JDK 동적 프록시, CGLIB (0) | 2024.12.30 |