Java开发----IOC之核心容器

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

一、环境准备

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

  • 创建一个Maven项目
  • pom.xml添加Spring的依赖
  • org.springframework spring-context 5.2.10.RELEASE
  • resources下添加applicationContext.xml
  • 添加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(); } }

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

Java开发----IOC之核心容器_第1张图片

编辑

二、容器

2.1 容器的创建方式

案例中创建 ApplicationContext 的方式为:

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

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

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

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

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

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

image.png

编辑

从错误信息中能发现,这种方式是从项目路径下开始查找 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选项

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yMhgESTa-1657800930426)(https://upload-images.jianshu.io/upload_images/28142708-74d8f8edaa047bfb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

编辑

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

Java开发----IOC之核心容器_第2张图片

编辑

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

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

为了更好的看出 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要想成为延迟加载,只需要按照如下方式进行配置

三、核心容器总结

3.1 容器相关

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

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

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

  • ApplicationContext接口常用初始化类

  • ClassPathXmlApplicationContext(常用)

  • FileSystemXmlApplicationContext

3.2 bean相关

Java开发----IOC之核心容器_第3张图片

编辑

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

3.3 依赖注入相关

Java开发----IOC之核心容器_第4张图片

你可能感兴趣的:(java,java,spring,mybatis,golang,架构)