第三讲: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);
    // 获取注入的bean
    Bean02 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 {

    @Bean
    public Bean01 bean01() {
        return new Bean01();
    }

    @Bean
    public 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);
    // 获取注入的bean
    Bean02 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端口,打开浏览器访问指定路径:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Endnote在线链接pubmed的时候报错12057:不能连接到吊销服务器,或者未能获得最终响应?

​嘎嘎嘎问题如下&#xff1a; 解决办法&#xff1a; 打开控制面板: ok,完了之后再去EndNote就不会出现此问题了。&#xff08;有的可能需要重启电脑&#xff0c;重启EndNote才会生效&#xff09;

Docker 网络之 ipvlan 和 macvlan

Docker ipvlan 和 macvlan 引言 本文讲解了Docker 网络模式中的 ipvlan 和 macvlan 的区别,目前自己在生产环境中使用的 ipvlan 模式非常问题.也解决了实际业务问题. IPvlan L2 mode example ipvlan 无需网卡混杂模式 , 运行如下命令后可以生成一个 vlan 子接口 , 会和主网卡…

Ajax介绍

1.与服务器进行数据交换&#xff1a;通过 Ajax 可以给服务器发送请求&#xff0c;并获取服务器响应的数据。 2.异步交互&#xff1a;可以在 不重新加载整个页面 的情况下&#xff0c;与服务器交换数据并 更新部分网页 的技术&#xff0c;如&#xff1a; 搜索联想、用户名是否可…

SpringMVC之异常处理

SpringMVC之异常处理 异常分为编译时异常和运行时异常&#xff0c;编译时异常我们trycatch捕获&#xff0c;捕获后自行处理&#xff0c;而运行时异常是不可预期的&#xff0c;就需要规范编码来避免&#xff0c;在SpringMVC中&#xff0c;不管是编译异常还是运行时异常&#xff…

【教程】华南理工大学校园网登录抓包和协议模拟

每次手动登录特别麻烦&#xff0c;而且时不时断一下&#xff0c;因此搞个脚本让它定时监测、断开重连比较方便。这里不讲这个脚本怎么写&#xff0c;只记录一下登录时的抓包内容。 蒜了&#xff0c;直接上解析吧&#xff0c;也不复杂&#xff0c;相信大家一目了然。 目录 抓包…

JavaScript中的变量声明方式有哪些?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 变量声明方式var 声明&#xff08;ES5及以前&#xff09;let 声明&#xff08;ES6以后&#xff09;const 声明&#xff08;ES6以后&#xff09; ⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者…

Docker自学:利用FastAPI建立一个简单的web app

环境配置&#xff1a;下载Docker Desktop 文件一&#xff1a;main.py from typing import Unionfrom fastapi import FastAPIimport uvicornapp FastAPI()app.get("/") def read_root():return {"Hello": "World"}app.get("/items/{item…

vs2022配置opencv进行监控 c++

下载opencv文件 下载好的目录结构是 以上就是用到的文件和目录 在vs2022配置 最后&#xff1a;此处运行提示找不到 opencv_world480.dll 解决办法&#xff1a;直接从 复制到windows下

【ElasticSearch】一键安装ElasticSearch与Kibana以及解决遇到的问题

目录 一、安装ES 二、安装Kibana 三、遇到的问题 一、安装ES 按顺序复制即可 docker network create es-net # 创建网络 docker pull images:7.12.1 # 拉取镜像 mkdir -p /root/es/data # 创建数据卷 mkdir -p /root/es/plugins # 创建数据卷 chmod 777 /root/es/** # 设置权…

基于Java+SpringBoot+Vue的学校田径运动会管理系统【源码+论文+演示视频+包运行成功】

博主介绍&#xff1a;✌擅长Java、微信小程序、Python、Android等&#xff0c;专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 Java项目精品实战案…

RT-Thread 的环形缓冲区 ---- 镜像指示位

可以看一下这篇我写的博客&#xff0c;了解一下大概&#xff1a; RingBuffer 环形缓冲区----镜像指示位_呵呵哒(&#xffe3;▽&#xffe3;)"的博客-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/132340883?spm1001.2014.3001.5501 【回顾】缓冲区…

Linux:shell脚本:基础使用(5)《正则表达式-sed工具》

sed是一种流编辑器&#xff0c;它是文本处理中非常中的工具&#xff0c;能够完美的配合正则表达式使用&#xff0c;功能不同凡响。 处理时&#xff0c;把当前处理的行存储在临时缓冲区中&#xff0c;称为“模式空间”&#xff08;pattern space&#xff09;&#xff0c;接着用s…

微服务概述-7

Shiro 框架 Shiro 是一个用于 Java 应用程序的安全框架。它提供了身份验证、授权、加密和会话管理等功能&#xff0c;可以帮助开发人员构建安全可靠的应用程序。 Java 中针对权限管理常见的有 2 个著名的框架&#xff1a;spring security 和 shiro shiro 基本概念 credentia…

AI引擎助力,CamScanner智能高清滤镜开启扫描新纪元!

文章目录 ⭐ 写在前面⭐ 突破图像处理难点&#xff1a;扫描全能王的独特优势⭐ 耳听为虚&#xff0c;眼见为实⭐ 产品背后的主要核心&#xff1a;AI-Scan助力⭐ 深度学习助力智能文档处理的国际化进程⭐ 品味智能文档处理的轻松与精准 ⭐ 写在前面 在数字化快速发展的今天&…

AE-卡通人物解说动画视频的制作

目录 1.导入卡通人物图片和音频文件 2.新建合成 3.在卡通人物图片上添加效果和表达式 4.在音频文件上添加效果和表达式 5.将卡通人物中的 CC Split2 中分割1 表达式链接到滑块中 6.卡通人物根据音频文件自动匹配口型。 AE制作卡通人物解说视频&#xff0c;卡通人物口型根据…

服务监控平台:SpringBoot Admin入门应用

前言 在日常工作中&#xff0c;我们需要有一款监控平台来帮助我们管理服务&#xff0c;监控服务是否宕机、服务运行指标&#xff08;内存、虚拟机、线程、请求等&#xff09;、监控日志、管理服务&#xff08;服务下线&#xff09;等&#xff0c;SpringBoot Admin作为一款开源…

分布式 | 如何搭建 DBLE 的 JVM 指标监控系统

本篇文章采用 Docker 方式搭建 Grafana Prometheus 实现对 DBLE 的 JVM 相关指标的监控系统。 作者&#xff1a;文韵涵 爱可生 DBLE 团队开发成员&#xff0c;主要负责 DBLE 需求开发&#xff0c;故障排查和社区问题解答。 本文来源&#xff1a;原创投稿 爱可生开源社区出品&a…

湘潭大学 湘大 XTU OJ 1217 A+B VII 题解(非常详细)

链接 1217 题目 题目描述 小明非常高兴你能帮他处理那些罗马数字&#xff0c;他想学着自己写罗马数字&#xff0c;但是他不知道自己到底写对了没有。 请你帮他写个程序&#xff0c;能正确地将10进制数字转换成罗马数字&#xff0c;以便他能进行核对。 罗马数字是使用字母组…

《修图大杀器》PS beta 25.0最新版安装(无需魔法)和Draggan(拖拽式修图)安装

个人网站&#xff1a;https://tianfeng.space 文章目录 psbeta下载安装1.注册2.安装ps beta2.安装神经网络滤镜3.使用 Draggan下载安装 psbeta下载安装 链接&#xff1a;https://pan.baidu.com/s/1XbxSAFoXh0HDz6YbkrAzDg 提取码&#xff1a;e8pn 1.注册 https://account.a…

chatGPT-对话爱因斯坦

引言 阿尔伯特爱因斯坦&#xff08; 1879年 3 月 14 日 – 1955 年 4 月 18 日&#xff09;是一位出生于德国的理论物理学家&#xff0c;被广泛认为成为有史以来最伟大、最有影响力的科学家之一。他以发展相对论而闻名&#xff0c;他还对量子力学做出了重要贡献&#xff0c;因…