前言
在 Java 的 Spring 框架中,依赖注入和控制反转是其核心概念,而 BeanFactory 和 ApplicationContext 是实现这些概念的两个重要接口。理解它们之间的关系以及如何使用它们,对于构建健壮的 Spring 应用至关重要。
BeanFactory 是 Spring 框架中最基本的容器,负责管理对象的创建和生命周期。而 ApplicationContext 则是 BeanFactory 的一个更高级的拓展,提供了更多的功能和灵活性,比如国际化支持、事件传播和 AOP(面向切面编程)等。本文将深入探讨这两个接口的快速入门指南,以及它们之间的关系和区别。
Spring概述
-Spring框架概述
spring是一个开源的轻量级Java开发应用框架,可以简化企业级应用开发。Spring解决了开发者在JavaEE开发中遇到的许多常见的问题,提供了功能强大lOC、AOP及Web MVC等功能。是当前企业中Java开发几乎不能缺少的框架之一。Spring的生态及其完善,不管是Spring哪个领域的解决方案都是依附于在Spring
Framework基础框架的。
Spring官网
Spring Framework技术栈展示:

- Data Access:数据访问Data Integration:数据集成
- Web:Web开发
- AOP:面向切面编程Aspects:AOP思想实现
- Core Container:核心容器
- Test:单元测试与集成测试
BeanFactory快速入门
BeanFactory的开发步骤:

- 导入Spring的jar包或Maven坐标;
- 定义UserService接口及其UserServicelmpl实现类;
- 创建beans.xml配置文件,将UserServicelmpl的信息配置到该xml中;
- 编写测试代码,创建BeanFactory,加载配置文件,获取UserService实例对象。
(1)导入对应的maven坐标
java
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.7</version>
</dependency>

(2)创建UserService接口,并创建对应的实现类UserServiceImpl
java
package com.itheima.service;
public interface UserService {
}
java
package com.itheima.service.impl;
import com.itheima.service.UserService;
public class UserServiceImpl implements UserService {
}
(3)在resource文件下常见xml文件beans.xml,并将将UserServicelmpl的信息配置到该xml中
java
<?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="userService" class="com.itheima.service.impl.UserServiceImpl"></bean>
</beans>
< bean>标签:
- 用于定义一个 Spring Bean。在这个例子中,定义了一个名为 userService 的 Bean。
- id 属性指定了 Bean 的唯一标识符,可以在应用程序中通过这个 ID 来引用此 Bean。
- class 属性指明了这个 Bean 所对应的具体实现类,这里是 com.itheima.service.impl.UserServiceImpl。
(4)编写测试代码
java
package com.itheima.test;
import com.itheima.service.UserService;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
public class BeanFactory {
public static void main(String[] args) {
//创建工厂对象
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
//创建读写器(读xml文件)
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
//读写配置文件给工厂
reader.loadBeanDefinitions("beans.xml");
//根据id获取Bean对象
UserService userService = (UserService)beanFactory.getBean("userService");
System.out.println(userService);
}
}
运行结果:

我们需要创建数据层Dao层对应的接口UserDao和实现类UserDaoImpl
java
package com.itheima.dao;
public interface UserDao {
}
package com.itheima.dao.impl;
import com.itheima.dao.UserDao;
public class UserDaoImpl implements UserDao {
}
并在beans.xml文件中配置对应的bean
xml
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean>
因为服务层UserService是需要调用数据处理层UserDao,所以UserServide需有有一个方法setUserDao
java
public class UserServiceImpl implements UserService {
//BeanFactory需要调用该方法,从容器中获取UserDao设置到此处
public void setUserDao(UserDao userDao){
System.out.println("BeanFactory需要调用该方法,从容器中获取UserDao设置到此处:"+userDao);
}
}
xml
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
< property>标签:
- 用于配置 Bean 的属性。在这个例子中,userDao 是 UserServiceImpl 类中的一个属性。
- name 属性指明要注入的属性名称。
- ref 属性指定另一个 Bean 的 ID,即在这里 userDao 是另一个 Bean 的 ID,应当已经在 Spring 上下文中定义。
测试代码:
java
UserService userService = (UserService)beanFactory.getBean("userService");
UserDao userDao = (UserDao) beanFactory.getBean("userDao");
运行结果如下:

上面使用BeanFactory完成了IloC思想的实现,下面去实现以下DI依赖注入:
1)定义UserDao接口及其UserDaolmpl实现类;
2)修改UserServicelmpl代码,添加一个setUserDao(UserDaouserDao)用于接收注入的对象;
3)修改beans.xml配置文件,在UserDaolmpl的< bean>中嵌入< property>配置注入;
4)修改测试代码,获得UserService时,setUserService方法执行了注入操作。
ApplicationContext快速入门
ApplicationContext称为Spring容器,内部封装了BeanFactory,比BeanFactory功能更丰富更强大,使用ApplicationContext进行开发时,xml配置文件的名称习惯写成applicationContext.xml
java
//创建ApplicationContexL,加载配置文件,实例化容器
ApplicationContext applicationcontext =
new ClassPathxmlApplicationContext( "applicationContext.xml");
//根据beanName获得容器中的Bean实例
UserService userService = (UserService) applicationContext.getBean("userservice");
System.out.println(userService);
测试代码如下:
java
package com.itheima.test;
import com.itheima.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ApplicationContextTest {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
UserService userService =(UserService) applicationContext.getBean("userService");
System.out.println(userService);
}
}
运行结果如下:

BeanFactory与ApplicationContext的关系
1 BeanFactory是Spring的早期接口,称为Spring的Bean工厂,ApplicationContext是后期更高级接口,称之为Spring容器;
2 ApplicationContext在BeanFactory基础上对功能进行了扩展,例如:监听功能、国际化功能等。BeanFactory的API更偏向底层,ApplicationContext的API大多数是对这些底层API的封装;
3 Bean创建的主要逻辑和功能都被封装在BeanFactory中,ApplicationContext不仅继承了BeanFactory,而且ApplicationContext内部还维护着BeanFactory的引用,所以,ApplicationContext与BeanFactory既有继承关系,又有融合关系。
4 Bean的初始化时机不同,原始BeanFactory是在首次调用getBean时才进行Bean的创建,而ApplicationContext恻是配置文件加载,容器一创建就将Bean都实例化并初始化好。


BeanFactory的继承体系
BeanFactory是核心接口,项目运行过程中肯定有具体实现参与,这个具体实现就是DefaultListableBeanFactory,而ApplicationContext内部维护的Beanfactory的实现类也是它。

Applicationontext继承体系
只在Spring基础环境下,即只导入spring-context坐标时,此时ApplicationContext的继承体系

只在Spring基础环境下,常用的三个ApplicationContext作用如下:

总结
在 Spring 框架中,BeanFactory 和 ApplicationContext 是两个重要的接口,它们分别承担着不同的角色。BeanFactory 提供了基本的 bean 管理功能,而 ApplicationContext 则在此基础上增加了丰富的功能,使开发者能够更高效地构建复杂的应用。了解它们的关系和使用场景,有助于开发者在实际项目中做出更合适的选择。希望本文能够为您提供一个清晰的快速入门指南,帮助您更好地理解和使用 Spring 框架。