Spring Ioc Bean是什么?

在Spring中,那些组成你应用程序的主体及由Spring Ioc容器所管理的对象,都被称之为bean。
简单来讲,bean就是Spring容器的初始化、配置及管理的对象。
除此之外,bean就与应用程序中的其他对象没有什么区别了。而bean定义以及bean相互间的依赖关系将通过配置元数据来描述。
org.springframework.beans.factory.BeanFactory是Spring Ioc容器的实际代表者,Ioc容器负责容纳此前所描述的bean,并对bean进行管理。

BeanFactory是什么?

BeanFactory是一个顶层接口,是最基本的Bean容器。Spring使用BeanFactory来生成,配置和管理Bean。
IOC:Spring Bean容器 - 图1
ApplicationContext是BeanFactory的子类,它比BeanFactory提供了更加丰富的功能。
平时常用的Bean容器还有3个,它们都是ApplicationContext的子类,如图所示。 ClassPathXmlApplicationContext主要用在在类路径加载xml文件的场景,FileSystemXmlApplicationContext主要用在在文件系统加载xml文件的场景,XMLWebApplicationContext主要用在在Web中加载xml文件的场景。
BeanFactory和ApplicationContext在Bean加载方面有什么不同呢?
BeanFactory是延迟加载。
BeanFactory初始化完成后,并不加载任何Bean,只有在第一次获取Bean时,BeanFactory才会加载该Bean。而ApplicationContext会在启动后主动加载好单例Bean,这样,从ApplicationContext中获取Bean时效率更高。

BeanDefinition是什么?

spring bean的建模对象。
Spring 将管理的对象称之为 Bean,容器会先实例化 Bean,然后自动注入,实例化的过程就需要依赖 BeanDefinition
BeanDefinition 用于保存 Bean 的相关信息,包括属性、构造方法参数、依赖的 Bean 名称及是否单例、延迟加载等,它是实例化 Bean 的原材料,Spring 就是根据 BeanDefinition 中的信息实例化 Bean。

实例

时序图
image.png
创建一个BeanDefinition

  1. public class BeanDefinition {
  2. private Object bean;
  3. public BeanDefinition(Object bean) {
  4. this.bean = bean;
  5. }
  6. public Object getBean() {
  7. return bean;
  8. }
  9. }

创建BeanFactory

  1. public class BeanFactory {
  2. // 容器
  3. private Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>();
  4. public Object getBean(String name) {
  5. return beanDefinitionMap.get(name).getBean();
  6. }
  7. // 加入容器管理
  8. public void registerBeanDefinition(String name, BeanDefinition beanDefinition) {
  9. beanDefinitionMap.put(name, beanDefinition);
  10. }
  11. }

创建UserService

  1. public class UserService {
  2. public void queryUserInfo(){
  3. System.out.println("查询用户信息");
  4. }
  5. }

创建测试类ApiTest

  1. public class ApiTest {
  2. @Test
  3. public void test_BeanFactory(){
  4. // 1.初始化 BeanFactory
  5. BeanFactory beanFactory = new BeanFactory();
  6. // 2.注入bean
  7. BeanDefinition beanDefinition = new BeanDefinition(new UserService());
  8. beanFactory.registerBeanDefinition("userService", beanDefinition);
  9. // 3.获取bean
  10. UserService userService = (UserService) beanFactory.getBean("userService");
  11. userService.queryUserInfo();
  12. }
  13. }

结果

  1. 查询用户信息

参考链接:https://www.jb51.net/article/154278.htm