Spring之旅 - 记录学习 Spring 框架的过程和经验(一)BeanFactory和ApplicationContext入门和关系

前言

在 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的开发步骤:

  1. 导入Spring的jar包或Maven坐标;
  2. 定义UserService接口及其UserServicelmpl实现类;
  3. 创建beans.xml配置文件,将UserServicelmpl的信息配置到该xml中;
  4. 编写测试代码,创建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 框架。

相关推荐
凌冰_2 小时前
Thymeleaf 访问域对象
java·开发语言
白露与泡影2 小时前
Java单元测试、集成测试,区别
java·单元测试·集成测试
Kapaseker2 小时前
如何写出高性能的Java Stream
android·java
野生风长2 小时前
从零开始的C语言:文件操作与数据管理(下)(fseek,ftell,rewind,文件的编译和链接)
android·java·c语言·开发语言·visual studio
Ahuuua2 小时前
Spring 事务传播行为详解
数据库·sql·spring
武子康2 小时前
Java-210 Spring AMQP 整合 RabbitMQ:JavaConfig 注解配置、RabbitTemplate 发送/同步接收与坑位速查
xml·java·spring·消息队列·rabbitmq·java-rabbitmq·mq
小句2 小时前
MyBatis源码学习
学习·mybatis
五阿哥永琪2 小时前
java基础 异常(Exception和Error)
java·开发语言
im_AMBER2 小时前
Leetcode 84 水果成篮 | 删除子数组的最大得分
数据结构·c++·笔记·学习·算法·leetcode·哈希算法