第三讲:ApplicationContext的实现

这里写目录标题

  • 一、前文回顾
  • 二、基础代码准备
  • 三、基于XML的ClassPathXmlApplicationContext
    • 1. 创建spring-config.xml配置文件
    • 2. 指定配置文件的路径
  • 四、基于注解的AnnotationConfigApplicationContext
    • 1. 新增一个配置类
    • 2.指定配置类信息
  • 五、基于注解和ServletWebServer应用容器支持的ApplicationContext
    • 1. 内嵌一个基于Servlet技术的Web容器
    • 2. Web的核心(DispatcherServlet)
    • 3. 关联Web容器和DispatcherServlet
    • 4. 注册一个Controller

一、前文回顾

在上一篇文章中,我们使用的一直是DefaultListableBeanFactory,他只是一个Bean工厂,不会自动运行,所有的功能都需要我们手动去调用,比如:注册BeanDefinition调用AnnotationConfigUtils.registerAnnotationConfigProcessors(beanFactory)去注册处理器往beanFactory里添加Bean后置处理器等操作。

但实际上,ApplicationContext的实现类会帮我们去做这些事情(refresh())。因此,我们一般使用到的都是ApplicationContext的实现类。

接下来,我们来看几个ApplicationContext的实现类。

二、基础代码准备

/*** 测试ApplicationContext实现类** @Author linqibin* @Date 2023/8/20 18:51* @Email 1214219989@qq.com*/
public class AcImplApplication {public static void main(String[] args) {// TODO coding here}static class Bean01{public Bean01() {System.out.println("Bean01构造函数~~~~");}}static class Bean02{private Bean01 bean01;public Bean02() {System.out.println("Bean02构造函数");}public Bean01 getBean01() {return bean01;}}}

三、基于XML的ClassPathXmlApplicationContext

该方式运行Spring是非常经典的,SSM时代用的就是ClassPathXmlApplicationContext

1. 创建spring-config.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="bean01" class="com.linqibin.spring.impl.AcImplApplication.Bean01"/><bean id="bean02" class="com.linqibin.spring.impl.AcImplApplication.Bean02"><property name="bean01" ref="bean01"/></bean>
</beans>

2. 指定配置文件的路径

/*** 基于配置文件的ApplicationContext实现类*/
public static void testClassPathXmlApplicationContext() {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");Arrays.stream(context.getBeanDefinitionNames()).forEach(System.out::println);// 获取注入的beanBean02 bean02 = (Bean02) context.getBean("bean02");System.out.println(bean02.getBean01());
}

然后在main()调用testClassPathXmlApplicationContext()

在这里插入图片描述

可以观察到,只要创建ClassPathXmlApplicationContext对象,就几乎把前文的功能实现了。

但BeanDefinitionNames的输出却只有两个,相比之下少了几个处理器的BeanDefinition。

这是因为基于XML方式默认不支持使用注解,只需在xml文件中加入如下配置,就能引入这些后置处理器的BeanDefinition。

<context:annotation-config/>

重新运行:
在这里插入图片描述

四、基于注解的AnnotationConfigApplicationContext

AnnotationConfigApplicationContext是比较新的注解,非web应用的Springboot使用的就是该实现。需要指定一个配置类作为入口。

1. 新增一个配置类

@Configuration
static class Config {@Beanpublic Bean01 bean01() {return new Bean01();}@Beanpublic Bean02 bean02(Bean01 bean01) {Bean02 bean02 = new Bean02();bean02.setBean01(bean01);return bean02;}
}

2.指定配置类信息

/*** 基于注解文件的ApplicationContext实现类*/
public static void testAnnotationConfigApplicationContext() {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);Arrays.stream(context.getBeanDefinitionNames()).forEach(System.out::println);// 获取注入的beanBean02 bean02 = (Bean02) context.getBean("bean02");System.out.println(bean02.getBean01());
}

运行结果如下图,在BeanDefinitionNames中还额外多了一个BeanDefinition,因为配置类本身也会被管理。

在这里插入图片描述

五、基于注解和ServletWebServer应用容器支持的ApplicationContext

AnnotationConfigServletWebServerApplicationContext是web应用使用的ApplicationContext。需要配置一些Web组件,并将配置文件作为参数启动。

1. 内嵌一个基于Servlet技术的Web容器

/*** 启动内嵌的Tomcat* @return*/
@Bean
public TomcatServletWebServerFactory tomcatServletWeb() {return new TomcatServletWebServerFactory();
}

2. Web的核心(DispatcherServlet)

/*** 需要有前端调度器* @return*/
@Bean
public DispatcherServlet dispatcherServlet() {return new DispatcherServlet();
}

3. 关联Web容器和DispatcherServlet

/*** 将前面两者关联起来* @param dispatcherServlet* @return*/
@Bean
public RegistrationBean dispatcherRegistrationBean(DispatcherServlet dispatcherServlet) {return new DispatcherServletRegistrationBean(dispatcherServlet, "/");
}

4. 注册一个Controller

如果Bean的名称是/开头,并且返回值是Controller,那么他就是一个控制器方法。

@Bean("/hello")
public Controller helloController() {return (request, response) -> {response.getWriter().write("hello");return null;};
}

创建容器

new AnnotationConfigServletWebServerApplicationContext(WebConfig.class);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vXkRMJm7-1692543018162)(/d/40p3th3zf4tt?f=0)]

内嵌的Tomcat成功运行并监听了8080端口,打开浏览器访问指定路径:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Azure虚拟网络对等互连

什么是Azure虚拟网络对等互联 Azure虚拟网络对等互联&#xff08;Azure Virtual Network peering&#xff09;是一种连接两个虚拟网络的方法&#xff0c;使得这两个虚拟网络能够在同一地理区域内进行通信。它通过私有IP地址在虚拟网络之间建立网络连接&#xff0c;不论是在同一…

Linux命令200例:head用于显示文件的开头部分(常用)

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &…

LVS 负载均衡集群

集群 集群&#xff08;Cluster&#xff09;是一组相互连接的计算机或服务器&#xff0c;它们通过网络一起工作以完成共同的任务或提供服务。集群的目标是通过将多台计算机协同工作&#xff0c;提高计算能力、可用性、性能和可伸缩性&#xff0c;适用于大量高并发的场景。 集群…

消息中间件的选择:RabbitMQ是一个明智的选择

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; MQ&#xff08;Message Queue&#xff09; MQ&#xff08;消息队列&#xff09;是一种用于在应用程序之间进行异步通信的技术&#xff1b;允许应用程序通过发送和接收…

【物联网无线通信技术】NFC从理论到实践(FM17XX)

NFC&#xff0c;全称是Near Field Communication&#xff0c;即“近场通信”&#xff0c;也叫“近距离无线通信”。NFC诞生于2004年&#xff0c;是基于RFID非接触式射频识别技术演变而来&#xff0c;由当时的龙头企业NXP(原飞利浦半导体)、诺基亚以及索尼联合发起。NFC采用13.5…

【记录】Python3|selenium4 极速上手入门(Windows)

环境&#xff1a;Windows 版本&#xff1a;python3&#xff0c;selenium 4.11.2 文章目录 1 装ChromeEdge其他浏览器 2 运行报错RequestsDependencyWarning: urllib3 (1.26.9) or chardet (3.0.4) doesn‘t match a supported version打开了浏览器&#xff0c;但是没有显示网页…

linux 安装 kibana

首先下载 kibana https://www.elastic.co/cn/downloads/kibana 然后上传到linux /usr/local 目录下解压安装 修改config/kibana.yml 配置文件&#xff0c;将elasticsearch.hosts 然后再nginx 中做一个端口映射&#xff0c;实现在浏览器中输入后xxxx:5602 nginx 可以将请求转发…

SPSS--如何使用分层分析以及分层分析案例分享

分层分析&#xff1a;将资料按某个或某些需要控制的变量的不同分类进行分层&#xff0c;然后再估计暴露因子与某结局变量之间关系的一种资料分析方法。 分层分析的最重要的用途是评估和控制混杂因子所致的混杂偏倚。通过按混杂因子分层&#xff0c;可使每层内的两个比较组在所控…

从零做软件开发项目系列之二——需求调研

在接到软件开发任务之后&#xff0c;第一件要做的事情就是进行需求调研工作&#xff0c;基于前期的沟通以及合同向用户了解具体需求&#xff0c;从而有针对性地开展后续工作。整个调研过程分为调研准备&#xff0c;调研实施&#xff0c;需求分析。 1 调研准备 俗话说&#x…

go语言恶意代码检测系统--对接前端可视化与算法检测部分

Malware Detect System 1 产品介绍 恶意代码检测系统。 2 产品描述 2.1 产品功能 功能点详细描述注册账号未注册用户注册成为产品用户&#xff0c;从而具备享有产品各项服务的资格登录账号用户登录产品&#xff0c;获得产品提供的各项服务上传恶意样本用户可以将上传自己的…

leetcode 279. 完全平方数

2023.8.18 与零钱兑换相似&#xff0c;本题属于完全背包问题&#xff1a;完全平方数为物品&#xff0c;整数n为背包。 直接上代码&#xff1a; class Solution { public:int numSquares(int n) {vector<int> dp(n1 , INT_MAX);dp[0] 0;for(int i1; i*i<n; i){for(in…

九耶丨阁瑞钛伦特-Spring boot与Spring cloud 之间的关系

Spring Boot和Spring Cloud是两个相互关联的项目&#xff0c;它们可以一起使用来构建微服务架构。 Spring Boot是一个用于简化Spring应用程序开发的框架&#xff0c;它提供了自动配置、快速开发的特性&#xff0c;使得开发人员可以更加轻松地创建独立的、生产级别的Spring应用程…

高效实用小工具之Everything

一&#xff0c;简介 有时候我们电脑文件较多时&#xff0c;想快速找到某个文件不是一件容易的事情&#xff0c;实用windows自带的搜素太耗时&#xff0c;效率不高。今天推荐一个用来搜索电脑文件的小工具——Everything&#xff0c;本文将介绍如何安装以及使用everything&…

FPGA中锁存器(latch)、触发器(flip-flop)以及寄存器(register)详解

文章目录 1 定义1.1 锁存器&#xff08;latch&#xff09;1.2 触发器&#xff08;flip-flop&#xff09;1.3 寄存器&#xff08;register&#xff09; 2 比较2.1 锁存器&#xff08;Latch&#xff09;危害即产生原因2.2 寄存器和锁存器的区别2.3 锁存器和触发器的区别 3 结构3.…

如何将常用的jdbc方法封装起来???

你是否还在为每次新建项目连接数据库而烦恼&#xff1f;&#xff1f;&#xff1f;&#xff08;教你一次代码&#xff0c;简单完成每次连接&#xff09; 1.建立maven项目 还没下载安装或者不会建立maven项目的可以看这里哦&#xff1a;maven的下载安装与配置环境变量&#xff0…

主机防护的重要性和方式

01 主机防护的重要性 主机防护是网络安全的重要组成部分。在互联网时代&#xff0c;网络攻击成为了一种常见的威胁&#xff0c;而主机防护则是保护计算机系统免受网络攻击的重要手段。 主机防护可以防范各种网络攻击&#xff0c;如病毒、木马、黑客攻击等&#xff0c;从而保…

如何利用 ChatGPT 进行自动数据清理和预处理

推荐&#xff1a;使用 NSDT场景编辑器助你快速搭建可二次编辑的3D应用场景 ChatGPT 已经成为一把可用于多种应用的瑞士军刀&#xff0c;并且有大量的空间将 ChatGPT 集成到数据科学工作流程中。 如果您曾经在真实数据集上训练过机器学习模型&#xff0c;您就会知道数据清理和预…

《Kubernetes部署篇:Ubuntu20.04基于外部etcd+部署kubernetes1.24.16集群(多主多从)》

一、架构图 如下图所示: 二、环境信息 1、部署规划 主机名K8S版本系统版本内核版本IP地址备注k8s-master-631.24.16Ubuntu 20.04.5 LTS5.15.0-69-generic192.168.1.63master节点 + etcd节点k8s-master-641.24.16Ubuntu 20.04.5 LTS5.15.0-69-generic192.168.1.64master节点 + …

【算法刷题之数组篇(1)】

目录 1.leetcode-59. 螺旋矩阵 II&#xff08;题2.题3相当于二分变形&#xff09;2.leetcode-33. 搜索旋转排序数组3.leetcode-81. 搜索旋转排序数组 II(与题目2对比理解)&#xff08;题4和题5都是排序双指针&#xff09;4.leetcode-15. 三数之和5.leetcode-18. 四数之和6.leet…

ByteV“智农”平台--数字乡村可视化

“智农”平台基于自主可控的数字孪生技术、物联网技术、大数据技术&#xff0c;构建全流程的新型农业一体化管理平台&#xff0c;围绕产运销管理全流程&#xff0c;实现生产->存储->包装->运输->销售的全链条管理。融合农业数据管理、农业数据预警显示、多维数据综…