[TOC]

BeanDefinitionRegistryPostProcessor

  1. 当我们用Spring来管理应用,我们会让Spring来管理所有的Bean。除了注解、Java配置和XML配置的方式来创建Bean,还有另外一种方式来创建我们的BeanDefinition。
  2. 通过BeanDefinitionRegistryPostProcessor可以创建一个特别后置处理器来将BeanDefinition添加到BeanDefinitionRegistry中。它和BeanPostProcessor不同,BeanPostProcessor只是在Bean初始化的时候有个钩子让我们加入一些自定义操作;而BeanDefinitionRegistryPostProcessor可以让我们在BeanDefinition中添加一些自定义操作(对扩展开放)。
  3. 源码

      public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {
    
         /**
          * Modify the application context's internal bean definition registry after its
          * standard initialization. All regular bean definitions will have been loaded,
          * but no beans will have been instantiated yet. This allows for adding further
          * bean definitions before the next post-processing phase kicks in.
          * @param registry the bean definition registry used by the application context
          * @throws org.springframework.beans.BeansException in case of errors
          */
         void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;
    
     }
    
  4. 案例

  5. 定义bean

       public interface UserService {
           public void findByUserName(String username);
      }
    
      public class UserServiceImpl implements UserService{
          @Override
          public void findByUserName(String username) {
              System.out.println("username:"+username);
          }
      }
    
  6. 自定义处理器

      自定义一个Service注册
      @Component
      public class CustomServiceRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
    
          @Override
          public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
              RootBeanDefinition beanDefinition = new RootBeanDefinition(UserServiceImpl.class); // Service实现
              beanDefinition.setTargetType(UserService.class); // Service接口
              beanDefinition.setRole(BeanDefinition.ROLE_APPLICATION);
              registry.registerBeanDefinition("userService", beanDefinition);
          }
    
          @Override
          public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
    
          }
      }
    
  7. 扫描bean

      <context:component-scan base-package="cn.jannal.spring.bean.registry" />
    
  8. 测试

    @RunWith(SpringJUnit4ClassRunner.class)  
    @ContextConfiguration({"classpath:applicationContext-all.xml"})  
    public class App {


        @Autowired
        private UserService userService;

        @Test
        public void testFindByUserName(){
            userService.findByUserName("jananl");
        }
    }

results matching ""

    No results matching ""