Ensure single instance of a spring managed bean

后端 未结 3 1187
执笔经年
执笔经年 2021-01-16 13:05

I have created a spring aspect to handle Retry mechanism. I have also created a Retry annotation. Following is the code for Retry annotation and an aspect which processes th

3条回答
  •  旧巷少年郎
    2021-01-16 13:43

    I found a way to do this :) Ref: Going Beyond DI I registered a BeanDefinitionRegistryPostProcessor in my root context, this will ensure that there is only one BeanDefinition of my desired class.

    package test;
    
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
    import org.springframework.beans.factory.support.BeanDefinitionRegistry;
    import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
    
    import com.xx.xx.xx.xx.xx.RetryInterceptor;
    
    public class TestBeanFacotryPostProcessor implements BeanDefinitionRegistryPostProcessor {
    
        @Override
        public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        }
    
        @Override
        public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
            String[] definitionNames = registry.getBeanDefinitionNames();
            for (int i = 0, j = 0; i < definitionNames.length; i++) {
                Class clazz;
                try {
                    clazz = Class.forName(registry.getBeanDefinition(definitionNames[i]).getBeanClassName());
                    if (RetryInterceptor.class == clazz && j++ > 0) {
                        registry.removeBeanDefinition(definitionNames[i]);
                    }
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

提交回复
热议问题