把一个bean注册到spring容器,一般有3个方法可以实现: 我们开发的类,如果想注册到spring容器,让spring来完成实例化,常用方式如下: 1. xml中通过bean节点来配置; 2. 使用@Service、@Controller、@Conponent等注解; 3.使用bean自定义注册工厂处理器
可以参考下面它的执行核心原理和步骤
boolean reiterate = true; while (reiterate) { reiterate = false; //查出所有实现了BeanDefinitionRegistryPostProcessor接口的bean名称 postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false); for (String ppName : postProcessorNames) { //前面的逻辑中,已经对实现了PriorityOrdered和Ordered的bean都处理过了,因此通过processedBeans过滤,processedBeans中没有的才会在此处理 if (!processedBeans.contains(ppName)) { //根据名称和类型获取bean BeanDefinitionRegistryPostProcessor pp = beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class); //把已经调用过postProcessBeanDefinitionRegistry方法的bean全部放在registryPostProcessors中 registryPostProcessors.add(pp); //把已经调用过postProcessBeanDefinitionRegistry方法的bean的名称全部放在processedBeans中 processedBeans.add(ppName); //执行此bean的postProcessBeanDefinitionRegistry方法 pp.postProcessBeanDefinitionRegistry(registry); //改变退出while的条件 reiterate = true; } } } //registryPostProcessors中保存了所有执行过postProcessBeanDefinitionRegistry方法的bean, //现在再来执行这些bean的postProcessBeanFactory方法 invokeBeanFactoryPostProcessors(registryPostProcessors, beanFactory); //regularPostProcessors中保存的是所有入参中带来的BeanFactoryPostProcessor实现类,并且这里面已经剔除了BeanDefinitionRegistryPostProcessor的实现类,现在要让这些bean执行postProcessBeanFactory方法 invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);下面看一下如何把自定义的bean通过它注册到spring容器中
下面把这个bean注册到spring容器
@Component public class CustomizeBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor { @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException { //打印当前堆栈信息 Utils.printTrack("execute postProcessBeanDefinitionRegistry"); //创建一个bean的定义类的对象,bean类型是CalculateServiceImpl RootBeanDefinition helloBean = new RootBeanDefinition(CalculateServiceImpl.class); //bean的定义注册到spring环境 beanDefinitionRegistry.registerBeanDefinition("calculateService", helloBean); } @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException { //打印当前堆栈信息 Utils.printTrack("execute postProcessBeanFactory"); } }这样后面就可以使用了,等于给bean加了个名字...
