Spring核心容器

Spring核心容器是Spring框架的一个重要部分,它提供了一个容器,用于创建和管理应用程序中的对象。该容器可以通过依赖注入来实现对象之间的解耦。

Spring核心容器的主要特点包括:

  1. 容器:它是Spring应用程序中的核心部分,负责实例化、配置和管理应用程序中的对象。
  2. Bean定义:Spring核心容器使用Bean定义来描述应用程序中的对象。Bean定义包括对象的类型、属性和依赖关系等信息。
  3. 依赖注入:Spring核心容器利用依赖注入来解决对象之间的依赖关系。通过依赖注入,容器可以自动将对象所依赖的其他对象注入到它们中。
  4. 生命周期管理:Spring核心容器管理对象的生命周期,包括对象的创建、初始化和销毁等过程。
  5. AOP支持:Spring核心容器提供了对面向切面编程的支持,可以通过配置来实现横切关注点的统一处理。

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

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

文章目录

    • 1 环境准备
    • 2 容器
      • 2.1 容器的创建方式
      • 2.2 Bean的三种获取方式
      • 2.3 容器类层次结构
      • 2.4 BeanFactory的使用
    • 3 核心容器总结
      • 3.1 容器相关
      • 3.2 bean相关
      • 3.3 依赖注入相关

1 环境准备

在学习和解决上述问题之前,先来准备下案例环境:

  • 创建一个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 容器

2.1 容器的创建方式

案例中创建ApplicationContext的方式为:

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

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

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

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

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

使用这种方是从项目路径下开始查找applicationContext.xml配置文件的,所以需要将其修改为:

ApplicationContext ctx = new FileSystemXmlApplicationContext("D:\\workspace\\spring\\spring_10_container\\src\\main\\resources\\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

img

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

img

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

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>

小结

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

  • 容器创建的两种方式

  • ClassPathXmlApplicationContext[掌握]

  • FileSystemXmlApplicationContext[知道即可]

  • 获取Bean的三种方式

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

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

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

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

3 核心容器总结

这节中没有新的知识点,只是对前面知识的一个大总结,共包含如下内容:

3.1 容器相关

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

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

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

  • ApplicationContext接口常用初始化类

    • ClassPathXmlApplicationContext(常用)
    • FileSystemXmlApplicationContext

3.2 bean相关

img

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

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

3.3 依赖注入相关

img

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring核心容器Spring框架中最核心的部分,提供了管理和组织应用程序中组件的功能。它包含了一系列的模块,如文本、图片等各种资源文件,同时提供了应用程序所需的各种组件,如BeanFactory、ApplicationContext等。 首先,Spring核心容器提供了BeanFactory接口,用于对Java对象(也即Bean)进行管理和配置的工厂。通过配置文件或注解的方式,我们可以定义Bean的属性和依赖关系,从而使用容器来获取已经创建好的Bean实例。BeanFactory接口负责创建和管理这些Bean,同时也负责销毁它们。 其次,Spring核心容器还提供了ApplicationContext接口,它是BeanFactory的子接口,提供了更多的功能。ApplicationContext可以从多种来源(比如文件系统、数据库、网络等)加载配置信息,并管理Bean的生命周期。除了BeanFactory的所有功能,ApplicationContext还支持国际化、事件发布、资源管理等更高级的功能。 另外,Spring核心容器还包括了一些辅助模块,如AOP(面向切面编程)、ORM(对象关系映射)等。这些模块可以与核心容器无缝集成,提供更强大、更灵活的功能。例如,通过AOP,我们可以在不修改原有代码的情况下,为应用程序添加事务、日志等横切关注点。而通过ORM,我们可以方便地将Java对象映射到数据库中的表。 总结来说,Spring核心容器Spring框架最为重要的组成部分,它提供了BeanFactory和ApplicationContext两个接口,用于管理和组织应用程序中的组件。同时,它还包括了一些辅助模块,如AOP和ORM,以提供更多的功能支持。使用Spring核心容器,我们可以简化应用程序的开发、配置和管理,提高代码的可重用性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vⅤ_Leon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值