当前位置: 首页 > news >正文

1、Spring底层核心原理解析

1.入门案例

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
UserService userService = (UserService) context.getBean("userService");
userService.test();

对于这三行代码应该,大部分同学应该都是比较熟悉,这是学习Spring的hello world。可是,这三行代码底层都做了什么,比如:

  1. 第一行代码,会构造一个ClassPathXmlApplicationContext对象,ClassPathXmlApplicationContext该如何理解,调用该构造方法除开会实例化得到一个对象,还会做哪些事情?
  2. 第二行代码,会调用ClassPathXmlApplicationContext的getBean方法,会得到一个UserService对象,getBean()是如何实现的?返回的UserService对象和我们自己直接new的UserService对象有区别吗?
  3. 第三行代码,就是简单的调用UserService的test()方法,不难理解。

光看这三行代码,其实并不能体现出来Spring的强大之处,也不能理解为什么需要ClassPathXmlApplicationContext和getBean()方法。对于这三行代码,你现在可以认为:如果你要用Spring,你就得这么写。就像你要用Mybatis,你就得写各种Mapper接口。

但是用ClassPathXmlApplicationContext其实已经过时了,在新版的Spring MVC和Spring Boot的底层主要用的都是AnnotationConfigApplicationContext,比如:

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
//ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
UserService userService = (UserService) context.getBean("userService");
userService.test();

可以看到AnnotationConfigApplicationContext的用法和ClassPathXmlApplicationContext是非常类似的,只不过需要传入的是一个class,而不是一个xml文件。

而AppConfig.class和spring.xml一样,表示Spring的配置,比如可以指定扫描路径,可以直接定义Bean,比如:

spring.xml中的内容为:

<context:component-scan base-package="com.zhouyu"/>
<bean id="userService" class="com.zhouyu.service.UserService"/>

AppConfig中的内容为:

@ComponentScan("com.zhouyu")
public class AppConfig {@Beanpublic UserService userService(){return new UserService();}}

所以spring.xml和AppConfig.class本质上是一样的。

目前,我们基本很少直接使用上面这种方式来用Spring,而是使用Spring MVC,或者Spring Boot,但是它们都

http://www.lryc.cn/news/134849.html

相关文章:

  • 迷路的机器人(递归回溯+动态规划两个方法实现)
  • Nacos
  • 【Linux】网络层协议:IP
  • 神经网络为什么可以学习
  • Docker基础入门:镜像、容器导入导出与私有仓库搭建
  • Go语言入门指南:基础语法和常用特性解析(上)
  • 排序算法合集
  • Vue2-全局事件总线、消息的订阅与发布、TodoList的编辑功能、$nextTick、动画与过渡
  • DP读书:鲲鹏处理器 架构与编程(八)3.1鲲鹏处理器片上系统与Taishan处理器内核架构
  • 如何使用 HOOPS Exchange SDK 和 Polygonica Bridge
  • spring异步框架使用教程
  • 【数学建模】清风数模正课3 插值算法
  • 什么是eval()?eval是用来干什么的?
  • JavaScript-console:JavaScript控制台(Console)常用方法
  • Nginx配置前后端分离
  • rabbitmq的发布确认
  • RISC-V公测平台发布· CoreMark测试报告
  • 模型微调(fine-tune)
  • 云农场种植:互联网+智慧牧场,为农业注入新的活力和创新
  • Hadoop学习一(初识大数据)
  • linux定时备份MySQL数据库循环删除前30天的备份文件
  • 不加电透明屏:在场景化应用中,有哪些特点和优点?
  • 全球公链进展| Shibarium已上线;opBNB测试网PreContract硬分叉;Sui 主网 V1.7.1 版本
  • CSS中的display属性有哪些值?它们的作用?
  • ELKstack-日志收集案例
  • 基于GPT-4和LangChain构建云端定制化PDF知识库AI聊天机器人
  • Python可视化工具分享
  • ethers.js:构建ERC-20代币交易的不同方法
  • [实践篇]13.23 QNX环境变量profile
  • HDLBits-Verilog学习记录 | Getting Started