Spring boot创建bean并注入到spring 中

本文转自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;
}

}

扫描二维码关注公众号,回复: 844376 查看本文章

注意:不管是@Resource(name="xxx")或者是@Autowrid@Qualifier("XXX"),xxx所指向的是核心类进行注入bean的name名称,否则是找不到注入的bean的

猜你喜欢

转载自blog.csdn.net/qq_34125349/article/details/77726191