在解决上述问题之前,先来准备下环境:
最终创建好的项目结构如下:
编辑
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选项
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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 ,就能查看到如下结构的层次关系
编辑
从图中可以看出,容器类也是从无到有根据需要一层层叠加上来的。
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对象,打印会发现:
3.1 容器相关
BeanFactory是IoC容器的顶层接口,初始化BeanFactory对象时,加载的bean延迟加载
ApplicationContext接口是Spring容器的核心接口,初始化时bean立即加载
ApplicationContext接口提供基础的bean操作相关方法,通过其他接口扩展其功能
ApplicationContext接口常用初始化类
ClassPathXmlApplicationContext(常用)
FileSystemXmlApplicationContext
3.2 bean相关
编辑
其实整个配置中最常用的就两个属性 id 和 class 。
3.3 依赖注入相关