[TOC]
BeanDefinitionRegistryPostProcessor
- 当我们用Spring来管理应用,我们会让Spring来管理所有的Bean。除了注解、Java配置和XML配置的方式来创建Bean,还有另外一种方式来创建我们的BeanDefinition。
- 通过BeanDefinitionRegistryPostProcessor可以创建一个特别后置处理器来将BeanDefinition添加到BeanDefinitionRegistry中。它和BeanPostProcessor不同,BeanPostProcessor只是在Bean初始化的时候有个钩子让我们加入一些自定义操作;而BeanDefinitionRegistryPostProcessor可以让我们在BeanDefinition中添加一些自定义操作(对扩展开放)。
源码
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; }
案例
定义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); } }
自定义处理器
自定义一个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 { } }
扫描bean
<context:component-scan base-package="cn.jannal.spring.bean.registry" />
测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:applicationContext-all.xml"})
public class App {
@Autowired
private UserService userService;
@Test
public void testFindByUserName(){
userService.findByUserName("jananl");
}
}