IoC 基础
BeanFactory 和 ApplicationContext 区别
“BeanFactory 是 Spring 框架中 IoC 容器的顶层接口,它只是用来定义一些基础功能,定义一些基础规范,而 ApplicationContext 是它的一个子接口,所以 ApplicationContext 是具备 BeanFactory 提供的全部功能。”
通常,我们称 BeanFactory 为 Spring IoC 容器,ApplicationContext 是容器的高级接口,比 BeanFactory 拥有更多功能,例如国际化支持和资源访问等。
BeanFactory
- 是 Spring 框架的核心接口,提供了最基本的 IoC 容器功能
- 主要用于延迟初始化(懒加载)bean
- 适合用于资源受限的环境(例如:移动设备、嵌入式系统)
- 实现类:DefaultListableBeanFactory
ApplicationContext
- 是 BeanFactory 的子接口,提供了更多的功能
- 适合大型企业级应用,提供事件发布、国际化支持等高级功能
- 实现类:ClassPathXmlApplicationContext、FileSystemXmlApplicationContext 等
使用场景
BeanFactory 场景:
- 用于资源受限的环境或测试场景
- 如果应用程序不需要 ApplicationContext 的高级功能,BeanFactory 是更轻量级的选择
ApplicationContext 场景:
- 用于企业级应用,支持国际化、事件监听、AOP 等高级功能
- 推荐在大部分 Spring 应用中使用
启动 IoC 容器
Java 环境
ClassPathXmlApplicationContext:从类的根路径下加载配置文件(推荐使用)FileSystemXmlApplicationContext:从磁盘路径上加载配置文件AnnotationConfigApplicationContext:纯注解模式下启动 Spring 容器
Web 环境
XML 方式
修改 webapp 下的 WEB-INF 下的 web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
配置类方式
从配置类启动容器:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<context-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>wzk.SpringConfig</param-value>
</context-param>
<!--使用监听器启动Spring的IOC容器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
所需 Maven 依赖
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.12.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.1.12.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.1.12.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.13</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.12.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.1.12.RELEASE</version>
</dependency>