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

  • 如何创建容器?

  • 创建好容器后,如何从容器中获取bean对象?

  • 容器类的层次结构是什么?

  • BeanFactory是什么?

一、环境准备

在解决上述问题之前,先来准备下环境:

  • 创建一个Maven项目

  • pom.xml添加Spring的依赖

    <dependencies>
       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-context</artifactId>
           <version>5.2.10.RELEASE</version>
       </dependency>
    </dependencies>
  • resources下添加applicationContext.xml

    <?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"/>
    </beans>
  • 添加BookDao和BookDaoImpl类

    public interface BookDao {
       public void save();
    }
    public class BookDaoImpl implements BookDao {
       public void save() {
           System.out.println("book dao save ..." );
      }
    }
  • 创建运行类App

    public class App {
       public static void main(String[] args) {
           ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
           BookDao bookDao = (BookDao) ctx.getBean("bookDao");
           bookDao.save();
      }
    }

最终创建好的项目结构如下:

二、容器

2.1 容器的创建方式

案例中创建ApplicationContext的方式为:

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

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

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

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

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

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

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

说明:大家练习的时候,写自己的具体路径。这种方式虽能实现,但是当项目的位置发生变化后,代码也需要跟着改,耦合度较高,不推荐使用。

2.2 Bean的三种获取方式

方式一,就是上面代码中获取的方式:

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

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

方式二:

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

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

方式三:

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

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

2.3 容器类层次结构

(1)在IDEA中双击shift,输入BeanFactory,如果没找到的话请勾选Include non-project items选项

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

从图中可以看出,容器类也是从无到有根据需要一层层叠加上来的。

2.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();
  }
}

为了更好的看出BeanFactoryApplicationContext之间的区别,在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>

三、核心容器总结

3.1 容器相关

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

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

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

  • ApplicationContext接口常用初始化类

    • ClassPathXmlApplicationContext(常用)

    • FileSystemXmlApplicationContext

3.2 bean相关

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

3.3 依赖注入相关

最新文章

  1. intelligencia.urlrewriter使用
  2. ASP.NET MVC 上传大文件时404
  3. wamp
  4. YCbCr;YUV;RGB
  5. Case 架构的实际应用-2
  6. 445port入侵具体解释
  7. Linux 命令 - ss: 查看套接字统计信息
  8. poj2186Popular Cows(强连通分量)
  9. Spring 教程(一)
  10. iOS 事件处理机制与图像渲染过程
  11. poj3468 A Simple Problem with Integers(线段树模板 功能:区间增减,区间求和)
  12. php相关书籍视频
  13. python 爬取w3shcool的JQuery的课程并且保存到本地
  14. 模拟uClinux系统调用
  15. 基本 SQL 之增删改查(一)
  16. Java中的String,StringBuilder,StringBuffer
  17. mac开发环境搭建篇(2)--brew与mysql
  18. C#-事件(十八)
  19. C#设计模式之7:适配器模式
  20. Charles手机抓包设置&amp;无法打开火狐网页设置

热门文章

  1. 最大数maxnumber - 题解【树状数组】
  2. mmdetection训练出现nan
  3. HTML续集
  4. jmeter脚本编写
  5. redis的zset数据结构:跳表
  6. Mybatis Plus之内置Mapper实践
  7. Django学习——图书相关表关系建立、基于双下划线的跨表查询、聚合查询、分组查询、F查询、Q查询、admin的使用、使用脚本调用Django、Django查看源生sql
  8. Spring注解开发_Spring容器创建概述
  9. kNN-准备数据
  10. 深入C++06:深入掌握OOP最强大的机制