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
    */
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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是一个组合对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

只因为你温柔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值