Spring - BeanFactory与ApplicationContext介绍

news2024/11/24 13:59:27

文章目录

  • Spring Bean
  • 一、BeanFactory 快速入门
    • 1.1 BeanFactory 开发步骤
    • 1.2 DI依赖注入
  • 二、ApplicationContext快速入门
    • 2.1 入门
    • 2.2 BeanFactory 与 ApplicationContext关系
    • 2.3 BeanFactory 继承体系
    • 2.4 ApplicationContext 继承体系

Spring Bean

之前也了解过Spring Bean,但已经忘记了,之后找了一些视频,但是对Spring Bean讲解的不是很全面,现在又重新找了一些视频,对Spring Bean进行一些整理

之前做的笔记:SpringBoot——Bean管理

一、BeanFactory 快速入门

BeanFactory 是Spring整理运行当中最核心的一个对象

1.1 BeanFactory 开发步骤

BeanFactory 不是我们自己写的,是Spring提供的

image-20230602211433750

  • 导入Spring的jar包或Maven坐标
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.7</version>
        </dependency>
    </dependencies>
  • 定义UserService接口及其UserServiceImpl实现类
public class UserServiceImpl implements UserService {
}
  • 创建beans.xml配置文件,将UserServiceImpl的信息配置到该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">

    <!--class 可以明确Bean在哪-->
    <!--id 为Bean做一个唯一标识-->
    <bean id="userService" class="com.zhangjingqi.service.impl.UserServiceImpl">

    </bean>

</beans>
  • 编写测试代码,创建BeanFactory,加载配置文件,获取UserService实例对象
public class BeanFactoryTest {
    public static void main(String[] args) {
//      创建一个工厂对象
        DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
//      创建一个读取器(读取xml文件)
        XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
//      读取器读取配置文件,并给工厂
        reader.loadBeanDefinitions("beans.xml");
//      根据id获取Bean实例对象
        Object userService = beanFactory.getBean("userService");
        System.out.println(userService);
    }
}

为什么能产生UserService对象?

​ 因为我们吧UserService对象配置到配置文件中,再通过Bean工厂去加载配置文件

1.2 DI依赖注入

userService对象需要使用到userDao,我们可以将userDao对象配置到userService中

public class UserServiceImpl implements UserService {
    // BeanFactory去调用该方法,从容器中获得userDao设置到此处
    public void setUserDao(UserDao userDao) {
        System.out.println(userDao);
    }
}

以配置的方式告知兵工厂

<!--class 可以明确Bean在哪-->
<!--id 为Bean做一个唯一标识-->
<bean id="userService" class="com.zhangjingqi.service.impl.UserServiceImpl">
    <!--name属性就是set方法的名称,并且把set去掉,首字母小写-->
    <!--ref是引用,从容器中找具体需要哪个对象-->
    <property name="userDao" ref="userDao"></property>
</bean>
<!--配置UserDao-->
<bean id="userDao" class="com.zhangjingqi.dao.impl.UserDaoImpl">

</bean>

测试

注意,只创建了一个userService对象,我们下面并没有向控制台中输出东西

//      创建一个工厂对象
        DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
//      创建一个读取器(读取xml文件)
        XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
//      读取器读取配置文件,并给工厂
        reader.loadBeanDefinitions("beans.xml");
//      根据id获取Bean实例对象
        Object userService = beanFactory.getBean("userService");

但是控制台中有输出内容,输出的就是UserServiceImpl.setUserDao方法中的内容,set方法我们没有主动调用,是BeanFactory帮我们调用的

image-20230603133742901

说明

property这种配置方式,就是找的UserServiceImpl类下的set方法

<bean id="userService" class="com.zhangjingqi.service.impl.UserServiceImpl">
    <!--name属性就是set方法的名称,并且把set去掉,首字母小写-->
    <!--ref是引用,从容器中找具体需要哪个对象-->
    <property name="userDao" ref="userDao"></property>
</bean>

DI依赖注入总结

  • 定义UserDao接口及其UserDaoImpl实现类;
  • 修改UserServiceImpl代码,添加一个setUserDao(UserDao userDao)用于接收注入的对象;
  • 修改beans.xml配置文件,在UserDaoImpl的<bean>中嵌入<property>配置注入;
  • 修改测试代码,获得UserService时,setUserService方法执行了注入操作

二、ApplicationContext快速入门

2.1 入门

Spring的容器,也叫应用上下文,它底层对于Bean的操作调用的还是BeanFactory

​ 比BeanFactory更常用一些

使用ApplicationContext进行开发时,xml配置文件的名称习惯写成applicationContext.xml

public class ApplicationContextTest {
    public static void main(String[] args) {
        //AppletContext是一个接口
        //参数是一个xml配置文件
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
        Object userDao = applicationContext.getBean("userDao");
        System.out.println(userDao);
        Object userService = applicationContext.getBean("userService");
        System.out.println(userService);
    }
}

值得我们注意的是

我们下句话执行完成后,便将beans.xml配置文件中的Bean加载到了BeanFactory当中

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

我们debug一下,下图可以证明

image-20230603141202119

2.2 BeanFactory 与 ApplicationContext关系

  • BeanFactory是Spring早期接口,称为Spring的Bean工厂,ApplicationContext是后期更高级接口,称之为Spring 容器

    BeanFactory主要内部维护的功能是跟Bean产生相关的,是造Bean的

    ApplicationContext内部刨除了Bean工厂功能外,还有其他功能

  • ApplicationContext在BeanFactory基础上对功能进行了扩展,例如:监听功能、国际化功能等。BeanFactory的API更偏向底层,ApplicationContext的API大多数是对这些底层API的封装;

    ApplicationContext的API再去调用BeanFactory中的API

  • Bean创建的主要逻辑和功能都被封装在BeanFactory中,ApplicationContext不仅继承了BeanFactory,而且ApplicationContext内部还维护着BeanFactory的引用,所以,ApplicationContext与BeanFactory既有继承关系,又有融合关系。

image-20230603145647608

  • Bean的初始化时机不同,原始BeanFactory是在首次调用getBean时才进行Bean的创建,而ApplicationContext则是配置文件加载,容器一创建就将Bean都实例化并初始化好

    BeanFactory是延迟加载,getBean时才加载对象,而ApplicationContext直接将对象创建好

2.3 BeanFactory 继承体系

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

image-20230603151753907

2.4 ApplicationContext 继承体系

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

image-20230603152421170

实现类功能描述
ClassPathXmlApplicationContext加载类路径下的xml配置的ApplicationContext
FileSystemXmlApplicationContext加载磁盘路径下的xml配置的ApplicationContext
AnnotationConfigApplicationContext加载注解配置类的ApplicationContext

假如说我们现在在Spring-Web环境下,那继承体系就发生了变化

<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-web</artifactId>
   <version>5.3.7</version>
</dependency>

image-20230603153051481

实现类功能描述
XmlWebApplicationContextweb环境下,加载类路径下的xml配置的ApplicationContext
AnnotationConfigWebApplicationContextweb环境下,加载磁盘路径下的xml配置的ApplicationContext

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/605851.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高斯过程回归 | Matlab实现高斯过程回归多输入单输出预测(Gaussian Process Regression)

文章目录 效果一览文章概述研究内容程序设计参考资料效果一览 文章概述 高斯过程回归 | Matlab实现高斯过程回归多输入单输出预测(Gaussian Process Regression) 研究内容 高斯过程回归(Gaussian Process Regression,GPR)是一种基于概率模型的非参数回归方法,可以用于

mybatisplus数据权限插件学习初探 动态表名更换插件

文章目录 学习链接 mybatisplus数据权限插件学习初探前言案例建表用户表订单表 环境准备UserUserMapperUserMapper.xmlOrdersOrdersMapperOrdersMapper.xml 配置UserTypeEnumUserContextHolderCustomizeDataPermissionHandlerMybatisPlusConfig 测试测试类bossdeptManagerclerk…

Zinx框架学习 - 消息封装

Zinx - V0.5 消息封装 之前我们使用Request来保存服务器的数据&#xff0c;很显然使用[]byte来接收数据&#xff0c;没有长度也没有消息类型&#xff0c;接下来就要针对这个消息进行封装 创建消息类型 定义一个基本的message包&#xff0c;会包含消息ID、数据、数据长度三个…

路径规划算法:基于探路者优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于探路者优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于探路者优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法…

涉及float和double

文章目录 涉及float和double的问题&#xff1a;它们的存储方式&#xff1a;有效位&#xff1f; 链式结构 涉及float和double的问题&#xff1a; 它们的存储方式&#xff1a; 它们会分成小数部分和指数部分分别存储。小数部分的有效位数越多&#xff0c;精度就越高&#xff0c;…

NLP超详细新手快速入门上手篇(1)常用函数

前言 自然语言处理(NLP)是机器学习的应用之一&#xff0c;用于分析、理解和生成自然语言&#xff0c;以便人类与计算机&#xff0c;人类与人类更好的交流。自然语言处理按照任务类型可以分为分类、匹配、翻译、结构化预测、与序贯决策过程这五类。 本篇参考自TensorFlow官方文…

MyBatis 查询数据库

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录 MyBatis 是什么&#xff1f;第⼀个MyBatis查询创建数据库和表添加MyBatis框架支持设置 MyBatis 配置信息添加业务代码 查询操…

【VBA】实现批量生成二维码

系列文章 【C#】单号生成器&#xff08;编号规则、固定字符、流水号、产生业务单号&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/129129787 【C#】日期范围生成器&#xff08;开始日期、结束日期&#xff09; 本文链接&#xff1a;h…

Nginx - ​一个高性能、灵活可靠的开源Web服务器

Nginx是什么&#xff1f; Nginx是一个高性能的HTTP和反向代理web服务器&#xff0c;同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru站点&#xff08;俄文&#xff1a;Рамблер&#xff09;开发的&#xff0c;第一个公开版本0.1…

idea使用native-image打包springboot项目

native-image简介 native-image 是一个用于将 Java 程序编译为本地可执行文件的工具。它是 GraalVM 的一部分&#xff0c;GraalVM 是一个高性能的通用虚拟机&#xff0c;支持多种语言。 使用步骤 下载GraalVM 安装 GraalVM&#xff1a;首先&#xff0c;你需要安装 GraalVM。…

20230603-周六随笔

周六闲来无事&#xff0c;给新电脑装下开发环境&#xff0c;记录一下遇到的问题 git下载代码报错 报错1&#xff1a;schannel: SEC_E_UNTRUSTED_ROOT (0x80090325)解决方法&#xff1a;执行git config --system http.sslbackend openssl命令 报错2&#xff1a;SSL certifica…

【Java 8 新特性】获取对象列表中的某个属性组成的列表

文章目录 获取对象列表中的某个属性组成的列表1、用法示例2、详细案例 附录&#xff1a;Java 8 Stream 基本用法1、map2、filter3、forEach4、limit5、sorted6、并行&#xff08;parallel&#xff09;程序7、Collectors8、统计 获取对象列表中的某个属性组成的列表 1、用法示例…

高完整性系统工程(十一):Fault Tolerant Design

目录 1. INTRODUCTION TO FAULT TOLERANCE 1.2 Definitions 1.3 Two Kinds of Faults 1.4 Hardware vs Software Faults 1.4.1 Failure Curve for Hardware 1.4.2 Hardware and Software Failures 1.5 Causes of Failures 1.6 3 Ways to Class Failures 1.6.1 Tempora…

【LLM】大模型值得探索的十个研究方向

note 基础理论&#xff1a;大模型的基础理论是什么&#xff1f; 网络架构&#xff1a;Transformer是终极框架吗&#xff1f; 高效计算&#xff1a;如何使大模型更加高效&#xff1f; 高效适配&#xff1a;大模型如何适配到下游任务&#xff1f; 可控生成&#xff1a;如何实…

ChatGPT有关的模块知多少?

本文由 大侠(AhcaoZhu)原创&#xff0c;转载请声明。 链接: https://blog.csdn.net/Ahcao2008 ChatGPT有关的模块知多少&#xff1f; &#x1f9ca;摘要&#x1f9ca;ChatGPT 开发库清单 &#x1f9ca;摘要 本文介绍了基于OpenAI ChatGPT 的API 开发的python 模块库。【原创&am…

STM32cubemx定时外部模式测量10M以上频率

STM32cubemx定时外部模式测量10M以上频率 本文讲解利用定时器的外部时钟功能&#xff0c;巧妙测量高频外部信号频率。范围可以到高达30M以上。 所需工具&#xff1a; 开发板:STM32F103RCT6STM32CubeMXIDE: Keil-MDK 文章目录 STM32cubemx定时外部模式测量10M以上频率原理讲解…

【Java技术专题】「Guava开发指南」手把手教你如何进行使用Guava工具箱进行开发系统实战指南(Optional篇)

Guava相关的介绍 Guava工程包含了许多被Google的Java项目广泛依赖的核心库。我们希望通过本文档为Guava中最流行和最强大的功能提供更具可读性和解释性的说明。 本教程是中级教程&#xff0c;适合 Guava 中级开发者的进阶学习。 学习Guava前的准备工作 学习目标和计划&#xf…

Python学习笔记 - 探索集合Set

尊敬的各位&#xff0c;我是Mr.数据杨&#xff0c;非常高兴和你们一起走进Python的世界。今天&#xff0c;让我们一起探讨Python中神奇的“集合”。你们是否读过《三国演义》&#xff1f;你们应该记得那场赫赫有名的“桃园三结义”吧&#xff1f;那让我们以此为例&#xff0c;来…

Windows动态链接库的生成和使用

工程需要&#xff0c;最近在编一组Windows上的动态链接库给Python调用。之前做过Linux下C动态库的编译&#xff0c;并提供给Python调用&#xff0c;Windows下的编译跟Linux还是有些差距&#xff0c;因此花了一点时间跑通&#xff0c;在这里记录一下。 为了完整对比&#xff0c…

Hive on Spark环境搭建

Hive 引擎简介 Hive 引擎包括&#xff1a;默认 MR、tez、spark 最底层的引擎就是MR &#xff08;Mapreduce&#xff09;无需配置&#xff0c;Hive运行自带 Hive on Spark&#xff1a;Hive 既作为存储元数据又负责 SQL 的解析优化&#xff0c;语法是 HQL 语法&#xff0c;执行…