Spring 创建Bean的几种形式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring 创建Bean的几种形式相关的知识,希望对你有一定的参考价值。

参考技术A

Spring IOC 是 Spring 最重要也是最基础的两个特性之一(另外一个是 AOP ,现不在讨论)。Spring 框架的实现控制反转(IoC)的原则,也被称为依赖注入(DI)。过程对象定义它们的依赖关系,也就是说,他们使用的其它对象,只能通过构造函数参数,参数工厂方法或对象实例上设置的属性构造或从工厂回来后的方法。然后容器注入这些依赖项时创建bean。这个过程从根本上是反,因此得名“控制反转(IoC),控制实例化 bean 本身或者它的位置依赖关系通过使用直接建设类,或者一个Service Locator模式等机制。

而创建 Spring 可以通过以下几种方式:

这是从Spring最开始就支持的一种bean的配置方式。
定义实体类:

User.java ,用户类,拥有简单属性int,String类型以及复杂的对象引用Car.

Car.java

配置文件:

测试类:

定义注解Bean.

配置文件:

测试类:

通过Class来定义Bean对象。

测试类:

properties配置文件

定义实体类,并通过@ConfigurationProperties注解指定在配置文件中的前缀。

工具类:

Spring boot 启动类:并通过@EnableConfigurationProperties指定可以使用properites来实例化bean的对象类型。

测试类:

Spring-- Ioc 容器Bean实例化的几种场景

Bean实例化的几种场景

 

1BeanDefinitionRegistryPostProcessor实例化:标准BeanFactoryPostProcessor的扩展,BeanFactoryPostProcessor的作用是用来进一步定义注册的BeanDefinitionIoC容器本质就是Bean管理,所以BeanFactoryPostProcessor本身也是Bean,要对BeanFactoryPostProcessorBeanDefinition进一步定义就通过BeanDefinitionRegistryPostProcessor进行注册,BeanDefinitionRegistryPostProcessor及其子类是Ioc容器最实例化的一类Bean。它们在ConfigurableApplicationContextApplicationContext子接口)实现类调用refresh()方法调用invokeBeanFactoryPostProcessors(beanFactory);方法时就被实例化。

 

2BeanFactoryPostProcessor实例化:仅次于BeanDefinitionRegistryPostProcessor被实例化。它们在同一个方法进行实例化,只是顺序有先后。

 

  1. PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(  
  2. ConfigurableListableBeanFactorybeanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors)  


3BeanPostProcessorss实例化BeanPostProcessorsIoc容器Bean管理的扩展点,定义了Bean实例化前后的回调方法,那它实例化肯定是得比普通的Bean早。ConfigurableApplicationContext.registerBeanPostProcessors(beanFactory)方法负责对BeanPostProcessors进行实例化。实际上实例化BeanPostProcessor的类是PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory,this);

 

4MessageSource类型Bean实例化:对应refresh()调用的initMessageSource();

 

5ApplicationEventMulticaster(事件广播)类型Bean实例化:负责ApplicationEvent事件广播的beanrefresh()调用initApplicationEventMulticaster();进行实例化。这个Bean是不需要进行配置的,但它通用是在Ioc容器内,而且还是单例的。

 

6AbstractApplicationContext类的子类可能会实例化个性化的Beanrefresh()调用onRefresh();方法做这个事情。

 

7ApplicationListener类型Bean实例化:ApplicationEventMulticaster负责事件广播,它得注册广播对象,所有ApplicationListener都会在registerListeners();实例化。

 

1~7对应的Bean都是一些特殊的Bean,除6是由子类决定,其他的都是按照类型进行实例化,实例化调用的方法是:BeanFactoryString[] getBeanNamesForType(Class<?> type, booleanincludeNonSingletons, boolean allowEagerInit);方法,并且这些Bean设置lazy-init是无效的,设置singleton也是无效的

 

8、非lazy-initsingletonBean实例化:调用inishBeanFactoryInitialization(beanFactory);

 

  1. protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {  
  2.         // 有容器转换服务bean时先实例化这种Bean  
  3.         if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&  
  4.                 beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {  
  5.             beanFactory.setConversionService(  
  6.                     beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));  
  7.         }  
  8.   
  9.         // 实例化LoadTimeWeaverAware类型Bean  
  10.         String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);  
  11.         for (String weaverAwareName : weaverAwareNames) {  
  12.             getBean(weaverAwareName);  
  13.         }  
  14.   
  15.         // 停止使用临时类加载器  
  16.         beanFactory.setTempClassLoader(null);  
  17.   
  18.         // 缓存容器中所有注册的BeanDefinition元数据,以防被修改  
  19.         beanFactory.freezeConfiguration();  
  20.   
  21.         // 实例化剩余的所有非lazy-init singleton Bean  
  22.         beanFactory.preInstantiateSingletons();  
  23.     }  

 

9、其他Bean实例化场景:a.上述1-8对应的Bean实例化依赖其他Bean时,那个Bean同时被实例化(这个在分析createBean()说明);b.延迟实例化的singleton Bean在第一次通过getBean()主动实例化它时实例化;c.prototype每次调用getBean()时都实例化;其他Scope的在它的生命周期内第一次通过getBean()主动实例化时实例化。


以上是关于Spring 创建Bean的几种形式的主要内容,如果未能解决你的问题,请参考以下文章

spring Bean装配的几种方式简单介绍

spring初识--bean的几种注册方式

spring初识--bean的几种注册方式

spring获取bean的几种方式

spring笔记--依赖注入之针对不同类型变量的几种注入方式

spring中产生bean的几种方式