第三讲:ApplicationContext的实现

news2024/11/28 7:07:35

这里写目录标题

  • 一、前文回顾
  • 二、基础代码准备
  • 三、基于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端口,打开浏览器访问指定路径:

在这里插入图片描述

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

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

相关文章

剑指offer全集系列(1)

目录 JZ3 数组中重复的数字 JZ4 二维数组中的查找 JZ5 替换空格 JZ6 从尾到头打印链表 JZ18 删除链表的节点 JZ22 链表中倒数最后k个结点 题目为剑指offer top100题目, 欢迎大家来学习&#x1f618; JZ3 数组中重复的数字 数组中重复的数字_牛客题霸_牛客网在一个长度为…

centos7安装virtualbox

在线安装 vi /etc/yum.repos.d/virtualbox.repo&#xff0c;复制后将下面内容编辑保存。 [virtualbox] nameOracle Linux / RHEL / CentOS-$releasever / $basearch - VirtualBox baseurlhttp://download.virtualbox.org/virtualbox/rpm/el/$releasever/$basearch enabled1 …

DeFINE:用于神经序列建模的深度分解输入令牌嵌入

一、说明 DeFINE&#xff0c;是华盛顿大学和艾伦人工智能开发的自然语言处理工具&#xff0c;可以处理的范围是&#xff1a;NLP、语言模型、LM、神经机器翻译、NMT、变压器、变压器-XL等&#xff1b;本文对token-bedding进行生成。 借助DeFINE&#xff0c;Transformer-XL可以在…

RHCE——三、远程连接服务器

远程连接服务器 一、远程连接服务器1、概念2、功能3、分类文字接口图形接口 二、文字接口连接服务器:三、连接加密技术简介密钥解析 四、SSH工作过程1、版本协商阶段2、密钥和算法协商阶段3、认证阶段(两种认证方法) 五、SSH服务配置1、安装ssh2、配置文件分析 六、ssh实验1、实…

Linux系统简介

文章目录 1. UNIX与Linux发展史1.1 UNIX发展史1.2 Linux发展史1.2.1 Linux内核版本1.2.2 Linux主要发行版本 2. 开源软件简介2.1 典型的开源软件2.2 开源软件的特点2.3 支撑互联网的开源技术 3. Linux应用领域3.1 基于Linux的企业服务器3.2 嵌入式应用3.3 Linux在电影娱乐业 4.…

在线SHA1加密工具--在线获取哈希值又称摘要

具体请前往&#xff1a; 在线计算Sha1摘要工具

使用open cv进行角度测量

使用open cv进行角度测量 用了一点初中数学的知识&#xff0c;准确度&#xff0c;跟鼠标点的准不准有关系&#xff0c;话不多说直接上代码 import cv2 import mathpath "test.jpg" img cv2.imread(path) pointsList []def mousePoint(event, x, y, flags, param…

Python批量爬虫下载PDF文件代码实现

本文的背景是&#xff1a;大学关系很好的老师问我能不能把Excel中1000个超链接网址对应的pdf文档下载下来。虽然可以手动一个一个点击下载&#xff0c;但是这样太费人力和时间了。我想起了之前的爬虫经验&#xff0c;给老师分析了一下可行性&#xff0c;就动手实践了。    没…

第一讲:BeanFactory和ApplicationContext接口

BeanFactory和ApplicationContext接口 1. 什么是BeanFactory?2. BeanFactory能做什么&#xff1f;3.ApplicationContext对比BeanFactory的额外功能?3.1 MessageSource3.2 ResourcePatternResolver3.3 EnvironmentCapable3.4 ApplicationEventPublisher 4.总结 1. 什么是BeanF…

docker的资源控制及数据管理

docker的资源控制及docker数据管理 一.docker的资源控制 1.CPU 资源控制 1.1 资源控制工具 cgroups&#xff0c;是一个非常强大的linux内核工具&#xff0c;他不仅可以限制被 namespace 隔离起来的资源&#xff0c; 还可以为资源设置权重、计算使用量、操控进程启停等等。 …

面试汇总-testcase

朋友圈点赞的测试用例 功能测试 1点赞后是否显示结果 2.点赞后是否可以取消; 3.点赞取消后是否可以重复点赞; 4.共同好友点赞后&#xff0c;是否有消息提醒; 5.非共同好友点赞后&#xff0c;是否有消息提醒; 6.点击点赞人昵称&#xff0c;是否可以跳转到他/她的主页; 7.自己能…

对象头的结构

一、对象头的结构(32位虚拟机) 1、普通对象 普通对象头占用64 bits &#xff0c;其中Mark word占32 bits &#xff0c;Klass Words 占32bits。Klass Words 可以理解为指针&#xff0c;指向类对象。Mark Word下面会详解。 2、数组对象 数组对象增加了4个字节的空间&#xff0c;…

百度许少辉著Baidu《乡村振兴战略下传统村落文化旅游设计》图书馆新书通报

百度许少辉著Baidu《乡村振兴战略下传统村落文化旅游设计》图书馆新书通报

【C语言学习】二维数组

二维数组 int[3][5];//通常理解为a是一个3行5列的矩阵二维数组的遍历 for(i0; i<3; i){for(j0; j<5; j){a[i][j] i*j;} }

删除链表中的节点(力扣)

目录 题目&#xff1a; 看着花里胡哨&#xff0c;小卡拉米四行代码秒杀&#xff01; 示例&#xff1a; 思路&#xff1a; 代码&#xff1a; 题目&#xff1a; 看着花里胡哨&#xff0c;小卡拉米四行代码秒杀&#xff01; 示例&#xff1a; 思路&#xff1a; 把后一个节点的…

多线程实现与管理

进程与线程 进程 &#xff1a; 进程是操作系统进行资源分配的最小单位&#xff0c;每执行一个程序、一条命令操作系统都会启动一个进程&#xff0c;进程是一个程序的执行过程&#xff0c;当程序启动时&#xff0c;操作系统会把进程的代码加载到内存中&#xff0c;并为新进程分配…

Python爬虫——scrapy_日志信息以及日志级别

日志级别&#xff08;由高到低&#xff09; CRITICAL&#xff1a; 严重错误 ERROR&#xff1a; 一般错误 WARNING&#xff1a; 警告 INFO&#xff1a; 一般警告 DEBUG&#xff1a; 调试信息 默认的日志等级是DEBUG 只要出现了DEBUG或者DEBUG以上等级的日志&#xff0c;那么这些…

开集输出和开漏输出

​​​​​​ 首先指明一下以下8中GPIO输入输出模式&#xff1a; GPIO_Mode_AIN 模拟输入&#xff1b; GPIO_Mode_IN_FLOATING 浮空输入&#xff1b; GPIO_Mode_IPD 下拉输入&#xff1b; GPIO_Mode…

JVM面试题-2

1、有哪几种垃圾回收器&#xff0c;各自的优缺点是什么&#xff1f; 垃圾回收器主要分为以下几种&#xff1a;Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1&#xff1b; Serial:单线程的收集器&#xff0c;收集垃圾时&#xff0c;必须stop the worl…