공부 흔적남기기

Spring BeanPostProcessor(빈 후처리기) 본문

web study/Spring

Spring BeanPostProcessor(빈 후처리기)

65살까지 코딩 2023. 12. 22. 16:51
728x90
반응형

BeanPostProcessor란? 

한국어로 그대로 번역하면 빈 후 처리기로 
스프링 빈이 생성되기 전후(초기화 전후)에 IOC 컨테이너에 빈으로 등록되기전에
빈을 intercept해서 특정로직을 처리가능하게 해주는 스프링이 지원하는 객체이다. 

주로 AOP를 사용하기위해 Proxy 객체를 생성해 IOC 컨테이너에 실제 빈 대신에 
프록시를 넣을 떄 사용한다. 
이 뿐만 아니라 다양하게 특정 빈이 초기화 되었을 때
어떤 로직을 실행한다던지 등 여러가지로 구현가능하다. 


BeanPostProcessor는 다른 빈 등록보다 선행된다.

 

예시

BeanPostProcess를 상속받아 구현 가능하다.

class LogBeanPostProcessor(
    private val packageName : String,
    private val advisor: Advisor
) : BeanPostProcessor {

    override fun postProcessAfterInitialization(bean: Any, beanName: String): Any? {

        val beanPackage = bean.javaClass.packageName

        if(beanPackage != packageName){
            return super.postProcessAfterInitialization(bean, beanName)
        }

        val proxyFactory = ProxyFactory(bean)
        proxyFactory.addAdvisor(advisor)
        val proxy = proxyFactory.getProxy()

        return super.postProcessAfterInitialization(proxy, beanName)
    }
}

구현한 BeanPostProcessor를 빈으로 등록하자

@Configuration
class LogPostProcessorConfiguration {

    @Bean
    fun logBeanPostProcessor(logService: LogServiceDirtyCode): LogBeanPostProcessor {
        return LogBeanPostProcessor("com.study.aop.item", getAdvisor(logService))
    }

    fun getAdvisor(logService: LogServiceDirtyCode): Advisor {
        val logAdvice = LogAdvice(logService)
        val pointCut = NameMatchMethodPointcut()
        pointCut.setMappedNames("creat*", "get*", "save*", "find*")
        return DefaultPointcutAdvisor(logAdvice)
    }

}

 


cf). spring aop library 를 depedency에 추가하면 @Aspect나 Advisor를 component로 등록하면 자동으로 빈후처리기가 포인트 컷을 통해 프록시를 생성한다.

728x90
반응형