Spring的简单使用及内部实现原理

在现代的Java应用程序开发中,Spring Framework已经成为了不可或缺的工具之一。它提供了一种轻量级的、基于Java的解决方案,用于构建企业级应用程序和服务。本文将介绍Spring的简单使用方法,并深入探讨其内部实现原理。

首先,让我们看一下Spring的简单使用示例:

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
UserService userService = (UserService) context.getBean("userService");
userService.test();

在这个示例中,我们使用了AnnotationConfigApplicationContext来加载应用程序的配置类AppConfig,并通过context.getBean()方法获取了一个名为userService的Bean,最后调用了其test()方法。

Spring的配置方式 在过去,我们通常使用XML文件来配置Spring应用程序,如下所示:

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

而现在,我们更倾向于使用Java配置类来进行配置,如下所示:

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

AppConfig类替代了传统的XML配置文件,成为了Spring的配置方式。它通过注解的方式告诉Spring在哪里扫描需要管理的Bean,并通过@Bean注解来声明Bean。

Spring容器的创建方式

不同的Spring项目可能会使用不同的ApplicationContext来创建Spring容器:

在传统的Spring项目中,我们使用ClassPathXmlApplicationContext来加载XML配置文件。

在SpringMVC项目中,我们使用XmlWebApplicationContext来加载XML配置文件。

而在SpringBoot项目中,则更常见地使用AnnotationConfigApplicationContext来加载Java配置类。

Bean的创建过程

Spring在创建Bean的过程中,会经历以下几个步骤:

扫描并解析配置类,得到需要管理的Bean的信息。
根据Bean的信息,实例化Bean对象并进行依赖注入。
执行Bean的生命周期回调方法,如BeanNameAware、BeanClassLoaderAware等。
执行@PostConstruct注解标注的初始化方法。
执行InitializingBean接口的afterPropertiesSet()方法。
如果需要进行AOP,生成代理对象并执行AOP逻辑。

AOP的实现原理

AOP(面向切面编程)是Spring框架的一个重要功能,它通过动态代理实现了横切关注点的功能。

Spring判断一个Bean是否需要进行AOP的大致流程如下:

找出所有的切面Bean。
遍历切面中的方法,查看是否有@Before、@After等注解。
判断方法的Pointcut(定义了方法全限定名)是否与当前Bean的类匹配。 如果匹配,则表示当前Bean需要进行AOP。
Spring使用cglib进行AOP时,会生成一个代理类,并在代理类中重写被代理类的方法,在执行代理方法时,会先执行切面逻辑,然后再调用被代理方法。

Spring事务管理

Spring的事务管理功能是企业级应用程序开发中的重要组成部分。通过@Transactional注解,我们可以将一个方法标记为需要事务管理的方法。

Spring事务的代理对象执行方法时,会依次执行以下步骤:

判断当前方法是否存在@Transactional注解。
如果存在,则创建数据库连接并开启事务。
执行业务逻辑代码,即调用被代理方法。
如果执行过程中发生异常,则回滚事务;否则提交事务。
需要注意的是,Spring事务只有在被代理对象调用时才会生效,直接调用方法可能会导致事务失效。

以上就是对Spring的简单使用及内部实现原理的介绍,希望能对您理解Spring框架有所帮助!如果有任何疑问或建议,欢迎留言讨论。

本文由 mdnice 多平台发布

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

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

相关文章

mysql8.0使用MGR实现高可用

一、三节点MGR集群的安装部署 1. 安装准备 准备好下面三台服务器&#xff1a; IP端口角色192.168.150.213306mgr1192.168.150.223306mgr2192.168.150.233306mgr3 配置hosts解析 # cat >> /etc/hosts << EOF 192.168.150.21 mgr1 192.168.150.22 mgr2 192.168…

Windows环境下的调试器探究——硬件断点

与软件断点与内存断点不同&#xff0c;硬件断点不依赖被调试程序&#xff0c;而是依赖于CPU中的调试寄存器。 调试寄存器有7个&#xff0c;分别为Dr0~Dr7。 用户最多能够设置4个硬件断点&#xff0c;这是由于只有Dr0~Dr3用于存储线性地址。 其中&#xff0c;Dr4和Dr5是保留的…

java中容器继承体系

首先上图 源码解析 打开Collection接口源码&#xff0c;能够看到Collection接口是继承了Iterable接口。 public interface Collection<E> extends Iterable<E> { /** * ...... */ } 以下是Iterable接口源码及注释 /** * Implementing this inte…

makefileGDB使用

一、makefile 1、make && makefile makefile带来的好处就是——自动化编译&#xff0c;一旦写好&#xff0c;只需要一个make命令&#xff0c;整个工程完全自动编译&#xff0c;极大的提高了软件开发的效率 下面我们通过如下示例来进一步体会它们的作用&#xff1a; ①…

使用 Python 实现一个飞书/微信记账机器人,酷B了!

Python飞书文档机器人 今天的主题是&#xff1a;使用Python联动飞书文档机器人&#xff0c;实现一个专属的记账助手&#xff0c;这篇文章如果对你帮助极大&#xff0c;欢迎你分享给你的朋友、她、他&#xff0c;一起成长。 也欢迎大家留言&#xff0c;说说自己想看什么主题的…

代码随想录第天 78.子集 90.子集II

LeetCode 78 子集 题目描述 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&…

LeetCode 2581.统计可能的树根数目:换根DP(树形DP)

【LetMeFly】2581.统计可能的树根数目&#xff1a;换根DP(树形DP) 力扣题目链接&#xff1a;https://leetcode.cn/problems/count-number-of-possible-root-nodes/ Alice 有一棵 n 个节点的树&#xff0c;节点编号为 0 到 n - 1 。树用一个长度为 n - 1 的二维整数数组 edges…

debian/ubuntu 编译安装nginx php

debian/ubuntu 编译安装nginx php tar -zxvf nginx-1.9.9.tar.gz apt-get install libpcre3 libpcre3-dev ./configure --prefix/work/nginx-1.9.9 --with-pcre make make install service iptables stop #关闭防火墙, 可能不需要 修改nginx运行用户为tboqi 抱着log目录可…

【通信基础知识】完整通信系统的流程图及各模块功能详解

2024.2.29 抱歉最近在写毕设大论文&#xff0c;因此没有太多时间更新。然而&#xff0c;在写论文的过程中&#xff0c;发现自己对通信系统的了解还不够全明白&#xff0c;因此差了一些硕博论文总结了一个完整的通信系统流程图。若有不对的地方请多多指正//部分内容有参考ChatGP…

【Elasticsearch管理】网络配置

文章目录 HTTP高级网络设置高级TCP设置 TransportTCP传输概要文件Transport跟踪 线程池fixed线程池fixed_auto_queue_sizescaling处理器设置 HTTP Elasticsearch只在默认情况下绑定到本地主机。对于运行本地开发服务器(如果在同一台机器上启动多个节点&#xff0c;甚至可以运行…

YOLOv7基础 | 第2种方式:简化网络结构之yolov7.yaml(由104层简化为30层)

前言:Hello大家好,我是小哥谈。通过下载YOLOv7源码可知,原始的yolov7.yaml文件是拆开写的,比较混乱,也不好理解,并且为后续改进增添了很多困难。基于此种情况,笔者就给大家介绍一种将yolov7.yaml文件简化的方法,将104层简化为30层,并且参数量和计算量和原来是一致的,…

内存占用构造方法

#使用虚拟内存构造内存消耗 mkdir /tmp/memory mount -t tmpfs -o size5G tmpfs /tmp/memory dd if/dev/zero of/tmp/memory/block #释放消耗的虚拟内存 rm -rf /tmp/memory/block umount /tmp/memory rmdir /tmp/memory #内存占用可直接在/dev/shm目录下写文件

《极客时间 - 左耳听风》【文章笔记个人思考】

《极客时间 - 左耳听风》原文链接&#xff1a;https://time.geekbang.org/column/intro/100002201?tabcatalog 10 | 如何成为一个大家愿意追随的Leader&#xff1f; 10 | 如何成为一个大家愿意追随的Leader&#xff1f; 这里的Leader是在技术上取得优势&#xff0c;而不是行政…

2024年2月个人工作生活总结

本文为 2024年2月工作生活总结。 研发编码 一些警告修正记录 这个月修正了个人所负责的工程警告&#xff0c;这些警告其实是前人的代码遗留的&#xff0c;我续写的代码&#xff0c;除printf函数的%d、%ld格式&#xff0c;都在写的过程中改了。 下面记录一些典型的警告及应对…

NLP(一)——概述

参考书: 《speech and language processing》《统计自然语言处理》 宗成庆 语言是思维的载体&#xff0c;自然语言处理相比其他信号较为特别 word2vec用到c语言 Question 预训练语言模型和其他模型的区别? 预训练模型是指在大规模数据上进行预训练的模型&#xff0c;通常…

测试环境搭建整套大数据系统(七:集群搭建kafka(2.13)+flink(1.13.6)+dinky(0.6)+iceberg)

一&#xff1a;搭建kafka。 1. 三台机器执行以下命令。 cd /opt wget wget https://dlcdn.apache.org/kafka/3.6.1/kafka_2.13-3.6.1.tgz tar zxvf kafka_2.13-3.6.1.tgz cd kafka_2.13-3.6.1/config vim server.properties修改以下俩内容 1.三台机器分别给予各自的broker_id…

git操作学习记录,简单易上手

配置git 的账户邮箱 $ git config --global user.name "Firstname Lastname" $ git config --global user.email "your_emailexample.com"代码回溯 git rest --hard [commit哈希值]git log命令只能查看以当前状态为终点的历史日志 git reflog命令&#x…

Python+neo4j构建豆瓣电影知识图谱

文章目录 数据来源数据整理导入节点和关系导入使用Subgraph批量导入节点和关系 多标签实体和实体去重 数据来源 http://www.openkg.cn/dataset/douban-movie-kg 该网址拥有丰富的中文知识图谱数据集&#xff0c;OpenKG(Open Knowledge Graph)&#xff0c;可供研究人员使用研究…

【golang】25、图片操作

用 “github.com/fogleman/gg” 可以画线, 框 用 “github.com/disintegration/imaging” 可以变换颜色 一、渲染 1.1 框和字 import "github.com/fogleman/gg"func DrawRectangles(inPath string, cRects []ColorTextRect, fnImgNameChange FnImgNameChange) (st…

Python爬虫——Urllib库-3

目录 ajax的get请求 获取豆瓣电影第一页的数据并保存到本地 获取豆瓣电影前十页的数据 ajax的post请求 总结 ajax的get请求 获取豆瓣电影第一页的数据并保存到本地 首先可以在浏览器找到发送数据的接口 那么我们的url就可以在header中找到了 再加上UA这个header 进行请…