• Bean Factory 和 ApplicationContext 谁才是 Spring IOC 容器-10


    Spring IOC 容器

    • Bean Factory 和 ApplicationContext 谁才是 Spring IOC 容器?

      package org.xiaoge.thinking.in.spring.ioc.overview.dependency.injection;
      
      import org.springframework.beans.factory.BeanFactory;
      import org.springframework.beans.factory.ListableBeanFactory;
      import org.springframework.beans.factory.ObjectFactory;
      import org.springframework.context.ApplicationContext;
      import org.springframework.context.ConfigurableApplicationContext;
      import org.springframework.context.support.ClassPathXmlApplicationContext;
      import org.springframework.core.env.Environment;
      import org.xiaoge.thinking.in.spring.ioc.overview.annotation.Super;
      import org.xiaoge.thinking.in.spring.ioc.overview.domain.User;
      import org.xiaoge.thinking.in.spring.ioc.overview.repository.UserRepository;
      
      import java.util.Map;
      
      /**
       * 注意: 依赖注入/依赖查找 它们的来源并不是一个
       * 依赖注入示例 看 UserRepository
       *  1. 名称集合注入: util:list
       *  2. 类型集合注入: autowire
       *  3. 注入内部bean: users
       *  4. 注入非内建bean: BeanFactory
       *  5. 延迟注入: ObjectFactory
       *
       * @Classname DependencyInjectionDemo
       * @Date 2022/10/17 14:56
       * @Created by ZhangXiao
       * @Description TODO
       */
      public class DependencyInjectionDemo {
      
          public static void main(String[] args) {
              // 配置xml配置文件
              // 启动spring应用上下文
              ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:META-INF/dependency-injection-context.xml");
      
              // 依赖来源一: 自定义Bean
              UserRepository userRepository = applicationContext.getBean("userRepository", UserRepository.class);
      
              // 依赖来源二: 容器内建依赖
              System.out.println(userRepository.getBeanFactory());
      
              // 依赖来源三: 容器内建Bean
              Environment environment = applicationContext.getBean(Environment.class);
              System.out.println("获取 Environment 类型的 Bean: " + environment);
      
              whoIsIoCContainer(applicationContext, userRepository);
      
          }
      
          /**
           * ApplicationContext/BeanFactory 谁才是Ioc容器
           *
           * 1. BeanFactory这个接口提供了一些高级配置的机制, 能够来管理这些对象
           * 2. ApplicationContext是BeanFactory的一个子接口
           *      特性:
           *          1. 简化了和spring aop的整合
           *          2. 消息资源的一个处理(国际化支持)
           *          3. 事件的发布
           *          4. 应用级别的一些上下文比如说WebApplication在web使用场景上面
           *      总而言之BeanFactory是提供一个配置的框架, 并且是一个基本功能, 所以BeanFactory是一个基本容器 而 ApplicationContext 是它的一个超集
           *
           * @param applicationContext
           * @param userRepository
           */
          public static void whoIsIoCContainer(ApplicationContext applicationContext, UserRepository userRepository) {
      
              // ConfigurableApplicationContext <- ApplicationContext <- BeanFactory
      
              // 这个表达式为什么会不成立
              System.out.println(userRepository.getBeanFactory() == applicationContext);
      
              // ApplicationContext 就是 BeanFactory
          }
      
      }
      
      
      
      /*
      	运行结果								                                       org.springframework.beans.factory.support.DefaultListableBeanFactory@22f71333: defining beans [user,objectFactory,superUser,userRepository]; root of factory hierarchy
      
      	获取 Environment 类型的 Bean: StandardEnvironment {activeProfiles=[], defaultProfiles=[default], propertySources=[PropertiesPropertySource {name='systemProperties'}, SystemEnvironmentPropertySource {name='systemEnvironment'}]}
      
      	false
      */
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48
      • 49
      • 50
      • 51
      • 52
      • 53
      • 54
      • 55
      • 56
      • 57
      • 58
      • 59
      • 60
      • 61
      • 62
      • 63
      • 64
      • 65
      • 66
      • 67
      • 68
      • 69
      • 70
      • 71
      • 72
      • 73
      • 74
      • 75
      • 76
      • 77
      • 78
      • 79
      • 80
      • 81
      • 82
      • 83
      • 84
      • 85
      • 86

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SX74COlE-1667361419483)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221102112749409.png)]

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lr4rNBzJ-1667361419484)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221102112819003.png)]

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jq8yaQwy-1667361419484)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221102113021845.png)]

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h64Ep7J7-1667361419485)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221102113039495.png)]

    • 相当于是代理对象getBean, 我们可以看出DefaultListableBeanFactory是一个组合对象

  • 相关阅读:
    leetcode 93: 复原IP地址 (面试常考)
    uni-app 中如何实现数据组件间传递?
    macos利用picgo、typora自动上传图片到chevereto私有图床
    电镀含镍废水如何回收镍?电镀废水除镍的工艺方法有哪些?
    深入浅出JavaScript之原型链&继承
    B. Inflation-Educational Codeforces Round 103 (Rated for Div. 2)
    比亚迪、吉利、蔚来等将出席2023第四届中国新能源汽车热管理峰会
    项目部署java
    【Matlab】数据插值
    spring如何处理多数据源
  • 原文地址:https://blog.csdn.net/zsx1314lovezyf/article/details/127649202