Spring에서 빈 교체

7206 단어 springjava
외부 패키지에서 가져온 빈의 메서드를 재정의해야 하지만 동일한 빈 이름을 유지해야 하는 상황이 있습니다. BeanFactoryPostProcessor를 사용하여 애플리케이션 시작 중에 빈 정의를 대체하여 이를 달성할 수 있습니다.

다음은 외부 패키지의 서비스입니다.

@Service
public class Ant implements Animal{
    private String animalName;

    public Ant() {
        this.animalName = "ant from original registration";
    }

    @Override
    public void setAnimalName(String animalName) {
        this.animalName = animalName;
    }

    @Override
    public String getAnimalName() {
        return animalName;
    }
}


이를 대체하기 위해 AntBeanFactoryPostProcessor를 구현하는 BeanFactoryPostProcessor를 생성합니다. 먼저 원래 bean 정의를 제거하고 새 정의로 등록합니다.

@Configuration
public class MyBeanConfig {
    @Bean
    public AntBeanFactoryPostProcessor antBeanFactoryPostProcessor() {
        return new AntBeanFactoryPostProcessor();
    }
}

public class AntBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
        // remove original bean definition
        ((DefaultListableBeanFactory) configurableListableBeanFactory).removeBeanDefinition("ant");

        GenericBeanDefinition genericBeanDefinition = new GenericBeanDefinition();
        genericBeanDefinition.setBeanClass(Ant.class);
        genericBeanDefinition.getPropertyValues().add("animalName", "ant from BeanFactoryPostProcessor");

        ((DefaultListableBeanFactory) configurableListableBeanFactory)
                .registerBeanDefinition("ant", genericBeanDefinition);
    }
}


그런 다음 교체가 유효한지 확인할 수 있습니다.

@SpringBootApplication
public class DependencyInjectionApplication {

    public static void main(String[] args) {
        ApplicationContext applicationContext = SpringApplication.run(DependencyInjectionApplication.class, args);

        System.out.println("\n----- BeanFactoryPostProcessor register bean: ant");
        Ant ant = applicationContext.getBean("ant", Ant.class);
        System.out.println(ant.getAnimalName());
    }
}


우리는 다음과 같은 결과를 얻을 것입니다:



here에서 BeanFactoryPostProcessor에 대한 세부 정보를 볼 수 있습니다.

좋은 웹페이지 즐겨찾기