首页 > 其他分享 >6. 核心容器

6. 核心容器

时间:2023-06-23 22:44:46浏览次数:24  
标签:容器 方式 BeanFactory 核心 BookDao bean ApplicationContext

这里所说的核心容器,大家可以把它简单的理解为ApplicationContext​,前面虽然已经用到过,但是并没有系统的学习,接下来咱们从以下几个问题入手来学习下容器的相关知识:

  • 如何创建容器?
  • 创建好容器后,如何从容器中获取 bean 对象?
  • 容器类的层次结构是什么?
  • BeanFactory 是什么?

1. 容器

1.1 容器的创建方式

案例中创建ApplicationContext​ 的方式为:

ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

这种方式翻译为:类路径下的 XML 配置文件

除了上面这种方式,Spring 还提供了另外一种创建方式为:

ApplicationContext ctx = new FileSystemXmlApplicationContext("applicationContext.xml");

这种方式翻译为:文件系统下的 XML 配置文件

使用这种方式,运行,会出现如下错误:

image

从错误信息中能发现,这种方式是从项目路径下开始查找applicationContext.xml​ 配置文件的,所以需要将其修改为:

ApplicationContext ctx =
new FileSystemXmlApplicationContext
("D:\\workspace\\spring\\spring_10_container\\src\\main\\resources\\applicationContext.xml");

说明:大家练习的时候,写自己的具体路径。

这种方式虽能实现,但是当项目的位置发生变化后,代码也需要跟着改,耦合度较高,不推荐使用。

1.2 Bean 的三种获取方式

方式一,就是目前案例中获取的方式:

BookDao bookDao = (BookDao) ctx.getBean("bookDao");

这种方式存在的问题是每次获取的时候都需要进行类型转换,有没有更简单的方式呢?

方式二:

BookDao bookDao = ctx.getBean("bookDao",BookDao.class);

这种方式可以解决类型强转问题,但是参数又多加了一个,相对来说没有简化多少。

方式三:

BookDao bookDao = ctx.getBean(BookDao.class);

这种方式就类似我们之前所学习依赖注入中的按类型注入。必须要确保 IOC 容器中该类型对应的 bean 对象只能有一个。

1.3 容器类层次结构

(1)在 IDEA 中双击shift​,输入 BeanFactory

image

(2)点击进入 BeanFactory 类,ctrl+h,就能查看到如下结构的层次关系

image

从图中可以看出,容器类也是从无到有根据需要一层层叠加上来的,大家重点理解下这种设计思想。

1.4 BeanFactory 的使用

使用 BeanFactory 来创建 IOC 容器的具体实现方式为:

public class AppForBeanFactory {
    public static void main(String[] args) {
        Resource resources = new ClassPathResource("applicationContext.xml");
        BeanFactory bf = new XmlBeanFactory(resources);
        BookDao bookDao = bf.getBean(BookDao.class);
        bookDao.save();
    }
}

为了更好的看出BeanFactory​ 和ApplicationContext​ 之间的区别,在 BookDaoImpl 添加如下构造函数:

public class BookDaoImpl implements BookDao {
    public BookDaoImpl() {
        System.out.println("constructor");
    }
    public void save() {
        System.out.println("book dao save ..." );
    }
}

如果不去获取 bean 对象,打印会发现:

  • BeanFactory 是延迟加载,只有在获取 bean 对象的时候才会去创建

  • ApplicationContext 是立即加载,容器加载的时候就会创建 bean 对象

  • ApplicationContext 要想成为延迟加载,只需要按照如下方式进行配置

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="
                http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
        <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"  lazy-init="true"/>
    </beans>
    

小结

这一节中所讲的知识点包括:

  • 容器创建的两种方式

    • ClassPathXmlApplicationContext[掌握]
    • FileSystemXmlApplicationContext[知道即可]
  • 获取 Bean 的三种方式

    • getBean("名称"):需要类型转换
    • getBean("名称",类型.class):多了一个参数
    • getBean(类型.class):容器中不能有多个该类的 bean 对象

    上述三种方式,各有各的优缺点,用哪个都可以。

  • 容器类层次结构

    • 只需要知晓容器的最上级的父接口为 BeanFactory 即可
  • BeanFactory

    • 使用 BeanFactory 创建的容器是延迟加载
    • 使用 ApplicationContext 创建的容器是立即加载
    • 具体 BeanFactory 如何创建只需要了解即可。

2. 核心容器总结

2.1 容器相关

  • BeanFactory 是 IoC 容器的顶层接口,初始化 BeanFactory 对象时,加载的 bean 延迟加载

  • ApplicationContext 接口是 Spring 容器的核心接口,初始化时 bean 立即加载

  • ApplicationContext 接口提供基础的 bean 操作相关方法,通过其他接口扩展其功能

  • ApplicationContext 接口常用初始化类

    • ClassPathXmlApplicationContext(常用)
    • FileSystemXmlApplicationContext

2.2 bean 相关

image

其实整个配置中最常用的就两个属性idclass

把 scope、init-method、destroy-method 框起来的原因是,后面注解在讲解的时候还会用到,所以大家对这三个属性关注下。

2.3 依赖注入相关

image

标签:容器,方式,BeanFactory,核心,BookDao,bean,ApplicationContext
From: https://www.cnblogs.com/NorthPoet/p/17500423.html

相关文章

  • 自然语言处理顶会ACL 2020会议核心要点分享
        今年受疫情影响,ACL只能举行线上虚拟会议,因此不能近距离跟行业学者们进行交流。但我任然想把我了解到的ACL的争取趋势和研究动态分享处理,因而有了这篇文章。     这些年来ACL的总体趋势    在开始讨论整个趋势之前之前,让我们先看一下ACL会议的一些总体统计数据。今......
  • 容器日志滚动清理
    cleancontainerslogs[root@k8s-master~]#dockerinfo|grepRoot//dockerrootdirDockerRootDir:/var/lib/dockercontainerlogs:/var/lib/docker/containers/container_id/xxxx.json.log#listlogssizefind/var/lib/docker/containers/-name*-json.log......
  • 2021年机器学习面试核心知识点中文版整理分享
        本资源主要是为了整理机器学习面试相关知识点的有用链接(注:目前不打算将一些基础算法的内容加入这个repo里,比如LR、SVM算法在《统计学习方法》里已经得到了很好的解释,面试时可能考到的手推公式在书里已经写的很好了,所以推荐直接看书即可)    资源整理自网络,源地址:https:......
  • Elasticsearch核心应用场景-日志优化实践
    1.背景日志领域是Elasticsearch(ES)最重要也是规模最大的应用场景之一。这得益于ES有高性能倒排索引、灵活的schema、易用的分布式架构,支持高吞吐写入、高性能查询,同时有强大的数据治理生态、端到端的完整解决方案。但原生ES在高吞吐写入、低成本存储、高性能查询等方面还有......
  • Elasticsearch核心应用场景-日志优化实践
    1.背景日志领域是Elasticsearch(ES)最重要也是规模最大的应用场景之一。这得益于ES有高性能倒排索引、灵活的schema、易用的分布式架构,支持高吞吐写入、高性能查询,同时有强大的数据治理生态、端到端的完整解决方案。但原生ES在高吞吐写入、低成本存储、高性能查询等方面还有......
  • 腾讯资深Android开发带你入门面试重点Framework,掌握更加核心的技术
    前言今天,想跟大家聊聊,Framework开发的那些事。系统应用开发,现在来说,已经开始脱离系统,单独拿出来开发,系统定制接口,已提供给应用调用,用来增强功能。原生的桌面,拨号,设置,已经没法做出差异化优势,因此都费尽心机,来进行应用深度开发。对于之前维护系统应用模块的人来讲,修修补补,真的没有什......
  • Docker容器相关命令
    容器相关命令:(1)dockerrun:创建容器并让容器出于运行状态(2)dockerpause:运行到暂停(3)dockerunpause:从暂停到运行(4)dockerstop:运行到停止(5)dockerstart:停止到运行【暂停是挂起,停止是杀死进程】(6)dockerexec进入容器执行命令(7)dockerlogs查看容器运行日志(8)dockerps查看所......
  • 人工智能核心技术与研究领域划分,最新《人工智能入门指南》开源
    经过半个多世纪的发展,人工智能技术逐步成熟,已然形成了固定的产业链。而随着近几年国家的大力支持,我国的人工智能产业规模也在不断扩大,科技人才供应吃紧,尤其是算法设计岗和应用开发岗供需比均在0.2以下,也就是说企业需要100个员工,市场却只能提供不到2个,人才的吸引和管理可谓迫在眉睫......
  • Polardb 核心存储 polarfs 是怎么进行数据存储的之核心构造(2)--译
    接上期,PolarFS主要由两层组成,一层是存储管理层,上面一层是文件系统元数据和提供文件系统API层,存储层负责所有节点的磁盘资源,并为每个数据库实例提供数据库卷。文件系统层在此基础上提供文件管理,负责文件系统元数据并发访问的互斥。下图为展示POLARFS集群中的主要组件,libpfs是一个......
  • Polardb 核心存储 polarfs 是怎么进行数据存储的(1)--译
    POLARDB数据库中有一个核心是他重新设计的存储系统,polarfs,polarfs是怎么设计的架构是怎样的,下面根据官方的一篇详细的英文文档作为翻译的目标https://www.vldb.org/pvldb/vol11/p1849-cao.pdf译PolarFS是专门为polardb设计的分布式文件系统,他具有低延迟,高可用的特点并且这款存......