前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >6. 核心容器

6. 核心容器

作者头像
捞月亮的小北
发布2023-12-01 10:10:29
1080
发布2023-12-01 10:10:29
举报
文章被收录于专栏:捞月亮的小北

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

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

1. 容器

1.1 容器的创建方式

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

代码语言:javascript
复制
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

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

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

代码语言:javascript
复制
ApplicationContext ctx = new FileSystemXmlApplicationContext("applicationContext.xml");

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

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

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

代码语言:javascript
复制
ApplicationContext ctx =
new FileSystemXmlApplicationContext
("D:\\workspace\\spring\\spring_10_container\\src\\main\\resources\\applicationContext.xml");

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

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

1.2 Bean 的三种获取方式

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

代码语言:javascript
复制
BookDao bookDao = (BookDao) ctx.getBean("bookDao");

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

方式二:

代码语言:javascript
复制
BookDao bookDao = ctx.getBean("bookDao",BookDao.class);

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

方式三:

代码语言:javascript
复制
BookDao bookDao = ctx.getBean(BookDao.class);

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

1.3 容器类层次结构

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

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

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

1.4 BeanFactory 的使用

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

代码语言:javascript
复制
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 添加如下构造函数:

代码语言:javascript
复制
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 要想成为延迟加载,只需要按照如下方式进行配置

代码语言:javascript
复制
<?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 相关

其实整个配置中最常用的就两个属性id和class。

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

2.3 依赖注入相关

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-06-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 容器
    • 1.1 容器的创建方式
      • 1.2 Bean 的三种获取方式
        • 1.3 容器类层次结构
          • 1.4 BeanFactory 的使用
          • 2. 核心容器总结
            • 2.1 容器相关
              • 2.2 bean 相关
                • 2.3 依赖注入相关
                相关产品与服务
                容器服务
                腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档