本文转自http://412887952-qq-com.iteye.com/blog/2301642
平时开发时,可能遇到自定义的一个bean需要注入spring 中进行管理,spring boot提供了一个接口,改接口就是BeanDefinitionRegistryPostProcessor,提供了进行注册bean的方法;详细使用如下:
定义一个需要注入到spring 中的bean:
public class ShanhyA{ public void display() { System.out.println("dispalyA"); } }
bean注入到spring核心:定义BeanDefinitionRegistryPostProcessor接口实现类:
/** * 实例化bean并注册到spring中进行管理 * @author 红薯 * */ @Configuration public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor{ //bean的名称生成器 private BeanNameGenerator beanNameGenerator =new AnnotationBeanNameGenerator(); /** * 先执行postProcessBeanDefinitionRegistry方法 * 在执行postProcessBeanFactory方法 */ @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory arg0) throws BeansException { System.out.println("postProcessBeanFactory"); } @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { //进行注入bean registerBean(registry, "ShanyA", ShanhyA.class); registerBean(registry, "SharyB", ShanHyB.class); System.out.println("postProcessBeanDefinitionRegistry"); } /** * 公共注册的方法 * @param registry * @param name * @param beanClass */ private void registerBean(BeanDefinitionRegistry registry,String name,Class<?> beanClass){ AnnotatedBeanDefinition annotatedBeanDefinition = new AnnotatedGenericBeanDefinition(beanClass); //可以自动生成name String beanName = (name != null?name:this.beanNameGenerator.generateBeanName(annotatedBeanDefinition, registry)); //bean注册的holer类. BeanDefinitionHolder beanDefinitionHolder = new BeanDefinitionHolder(annotatedBeanDefinition, beanName); //使用bean注册工具类进行注册. BeanDefinitionReaderUtils.registerBeanDefinition(beanDefinitionHolder, registry); } }
测试类:
在使用@Resource 或者 @Autowired并指定@Qualifier 也可以进行bean的注入
@RestController public class TestController { @Resource(name="ShanyA") private ShanhyA shanhyA; //或者是下面
@Autowired @Qualifier("ShanyA") private ShanHyB shanHyB; @RequestMapping("test") @ResponseBody public int testchange(){ shanhyA.display(); shanHyB.display(); return 1; }
}
注意:不管是@Resource(name="xxx")或者是@Autowrid@Qualifier("XXX"),xxx所指向的是核心类进行注入bean的name名称,否则是找不到注入的bean的