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

Spring基础知识

1 简介

官网:https://spring.io/projects,Spring发展到今天已经形成了一种开发生态圈,Spring提供了若干个项目,每个项目用于完成特定的功能。

Spring Framework是最底层的框架,是其他项目的根基。

Spring Boot

Spring MVC

Spring Cloud

Spring Framework系统架构图:

Core Container:核心容器,用来管理对象(Beans)

AOP:面向切面编程,依赖于Core Container实现。Aspects实现了AOP思想。

Data Access:数据访问

Data Integration:数据集成,支持JDBC、MyBatis

Web:Web开发

Test:单元测试

2 IOC/DI

2.1 核心概念

使用对象时,由主动new对象转换为由外部提供对象,对象的创建控制权由程序内部转移到外部,这种思想就是控制反转IOC(Inversion of Control),可以降低代码耦合度,这里说的外部就是Spring容器,由Spring容器创建控制对象,Spring容器创建、管理的对象统称为bean。在IOC容器内将有依赖关系的bean进行关系绑定(DI)。

2.2 IOC入门

  1. 导入spring-context坐标

<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.10.RELEASE</version>
</dependency>
  1. 定义spring管理的类(接口)

  1. 创建applicationContext.xml 并配置对应类作为spring管理的bean

<?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 class="dao.impl.BookDaoImpl" id="bookDao"/><bean id="bookService" class="service.impl.BookServiceImpl"/>
</beans>
  1. 初始化IOC容器,通过容器获取bean

    public static void main(String[] args) {//获取IOC容器ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");//获取Bean对象//BookDao bookDao = (BookDao) applicationContext.getBean("bookDao");BookService bookService = (BookService) applicationContext.getBean("bookService");}

2.3 DI入门

  1. 删除使用new方式创建对象的代码

  1. 提供依赖对象对应的setter方法供IOC容器设置值

public class BookServiceImpl implements BookService {private BookDao bookDao;public void setBookDao(BookDao bookDao) {this.bookDao = bookDao;}@Overridepublic void save() {System.out.println("book service save");bookDao.save();}
}public class BookDaoImpl implements BookDao {@Overridepublic void save() {System.out.println("book dao save");}
}
  1. 在配置文件中配置service和dao的依赖关系

<?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 class="dao.impl.BookDaoImpl" id="bookDao"/><bean id="bookService" class="service.impl.BookServiceImpl"><!-- property标签表示配置当前bean的属性name表示配置哪一个具体的属性ref表示参照哪一个bean--><property name="bookDao" ref="bookDao"/></bean>
</beans>

2.3 bean基础配置

2.3.1 id和class

2.3.2 name别名配置

Bean可以起多个名称,通过name属性,可配置多个别名。

2.3.3 scope作用范围

控制容器造的对象是单例还是非单例的。Spring默认创建的bean是单例的,通过scope属性控制bean是单例方式创建还是非单例方式创建。

2.4 bean实例化方式

2.4.1 无参构造方法实例化

使用无参构造方法实例化bean(最常用)

2.4.2 静态工厂实例化bean

public class OrderDaoFactory {public static OrderDao getOrderDao() {return new OrderDaoImpl();}
}public class OrderDaoImpl implements OrderDao {@Overridepublic void save() {System.out.println("OrderDaoImpl save");}
}
<bean id="orderDao" class="factory.OrderDaoFactory" factory-method="getOrderDao"/>

了解即可。

2.4.3 实例工厂与factory-bean

public class UserDaoFactory {public UserDao getUserDao() {return new UserDao();}
}public class UserDao {public void save() {System.out.println("UserDao save");}
}
<bean id="userFactory" class="factory.UserDaoFactory"/>
<bean id="userDao" factory-bean="userFactory" factory-method="getUserDao"/>

了解即可。

2.4.4 FactoryBean实例化bean

public class UserDaoFactoryBean implements FactoryBean<UserDao> {/*** 创建对象的方法,用来得到bean实例* @return* @throws Exception*/@Overridepublic UserDao getObject() throws Exception {return new UserDao();}/*** 用来得到bean类型* @return*/@Overridepublic Class<?> getObjectType() {return UserDao.class;}/*** 控制创建的是否是单例对象,不复写的话默认是单例* @return*/@Overridepublic boolean isSingleton() {return FactoryBean.super.isSingleton();}
}public class UserDao {public void save() {System.out.println("UserDao save");}
}

applicationContext.xml中配置:

<bean id="userDao" class="factory.UserDaoFactoryBean"/>

调用:

       //获取IOC容器ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");//获取Bean对象UserDao userDao = (UserDao) applicationContext.getBean("userDao");userDao.save();

重点掌握

2.5 bean的生命周期

2.5.1 init-method、destroy-method

public class BookDaoImpl implements BookDao {public BookDaoImpl() {System.out.println("book dao is running");}//对象创建后的初始化操作public void init() {System.out.println("init");}@Overridepublic void save() {System.out.println("book dao save");}//容器关闭前实例销毁操作public void destroy() {System.out.println("destroy");}
}
<bean class="dao.impl.BookDaoImpl" id="bookDao" init-method="init" destroy-method="destroy"/>

调用:

 //获取IOC容器ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");//获取Bean对象BookDao bookDao = (BookDao) applicationContext.getBean("bookDao");applicationContext.registerShutdownHook();//注册关闭钩子bookDao.save();applicationContext.close();

2.5.2 InitializingBean、DisposableBean

public class BookServiceImpl implements BookService , InitializingBean, DisposableBean {private BookDao bookDao;public void setBookDao(BookDao bookDao) {this.bookDao = bookDao;}@Overridepublic void save() {System.out.println("book service save");bookDao.save();}@Overridepublic void destroy() throws Exception {}//setter方法先被调用,afterPropertiesSet后被调用。constructor->setter->afterPropertiesSet->业务方法->destroy@Overridepublic void afterPropertiesSet() throws Exception {}

了解即可。

相关文章:

Spring基础知识

1 简介官网&#xff1a;https://spring.io/projects&#xff0c;Spring发展到今天已经形成了一种开发生态圈&#xff0c;Spring提供了若干个项目&#xff0c;每个项目用于完成特定的功能。Spring Framework是最底层的框架&#xff0c;是其他项目的根基。Spring Boot Spring MVC…...

proxy代理与reflect反射

proxy代理与reflect 在这之前插入一个知识点arguments&#xff0c;每个函数里面都有一个arguments&#xff0c;执行时候不传默认是所有参数&#xff0c;如果传了就是按顺序匹配&#xff0c;箭头函数没有 代理函数 代理对象也就是生成一个替身&#xff0c;然后这个替身处理一切的…...

机器视觉 多模态学习11篇经典论文代码以及解读

此处整理了深度学习&#xff0d;机器视觉&#xff0c;最新的发展方向&#xff0d;多模态学习&#xff0c;中的11篇经典论文&#xff0c;整理了相关解读博客和对应的Github代码&#xff0c;看完此系列论文和博客&#xff0c;相信你能快速切入这个方向。每篇论文、博客或代码都有…...

Redis过期删除策略

目录引出Redis过期删除策略Redis的两种过期策略&#xff1a;定期删除 惰性删除定期删除惰性删除Redis两种过期删除策略存在的问题Redis缓存淘汰策略Redis中的LRU和LFU算法1、LRU&#xff08;Least Recently Userd最近最少使用&#xff09;LFU 算法的引入2、LFU&#xff08;lea…...

数据流分析之def-use链分析

数据流分析之def-use链分析引言1 相关概念2 算法2.1 算法规则2.2 算法流程2.3 算法优化3 举例引言 编译过程中&#xff0c;知道函数中每个指令引用的变量(或虚拟寄存器)来自于前面的哪一次赋值是很有必要的。例如llvm中对store/load转phi优化&#xff0c;就需要准确知道该信息…...

【0175】【内存上下文】如何利用context_freelists[]来彻底释放MemoryContext中分配的所有内存(8 - 2)

文章目录 1. MemoryContext 删除的另一种形式1.1 context_freelists[] 数组1.1.1 context_freelists[0] 和 context_freelists[1] 的意义1.1.2 context_freelists[0] 和 context_freelists[1] 各自功能示意图1.2 context_freelists[] 各成员在删除context时的初始化情况1.2.1 c…...

Redis实战—黑马点评(一) 登录篇

Redis实战 — 黑马点评&#xff08;一&#xff09; 登录篇 来自黑马的redis课程的笔记 【黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目】 目录Redis实战 — 黑马点评&#xff08;一&#xff09; 登录篇1. 项目…...

建造者模式-搭建Qt窗口案例

文章目录logging日志输出子线程设计模式可视化插件类界面设计呼吸灯实现综合案例实现本综合案例&#xff0c;应用到如下的知识点。logging日志输出 自定义日志记录器&#xff0c;实现将日志输出到指定的控件中。 # 自定义日志记录器类子线程 threading实现子线程及Qt中的子线…...

*from . import _imaging as core : ImportError: DLL load failed: 找不到指定的模块

错误提示如上。为了解决这个问题&#xff0c;首先参考了解决 from . import _imag…模块。. 首先尝试了彻底卸载pillow&#xff1a;conda uninstall pillow &#xff1b; pip uninstall pillow 然后重装 pip install pillow&#xff0c;发现问题仍然没有解决。 并且尝试了windo…...

关于尚硅谷Hadoop-报错解决方案日志

以后都会将学习Hadoop中遇到的问题写到这里&#xff0c;供自己参考&#xff0c;能帮到大家更好SecondaryNameNode未启动解决办法&#xff1a;可能是端口被占用&#xff08;我没遇到&#xff09;hadoop104未在/etc/hosts配置映射路径我在hadoop104的/etc/hosts 添加了所有hadoop…...

前端高频面试题-HTML和CSS篇(二)

&#x1f4bb; 前端高频面试题-HTML和CSS篇&#xff08;二&#xff09; &#x1f3e0;专栏&#xff1a;前端面试题 &#x1f440;个人主页&#xff1a;繁星学编程&#x1f341; &#x1f9d1;个人简介&#xff1a;一个不断提高自我的平凡人&#x1f680; &#x1f50a;分享方向…...

神经网络损失函数分布可视化神器

论文名称和地址&#xff1a;Visualizing the Loss Landscape of Neural Netshttps://arxiv.org/pdf/1712.09913.pdf1.1 背景和动机作者主要想研究几个问题&#xff1a;为什么我们能够最小化高度非凸神经损失函数&#xff1f;为什么得到的最小值这个结果具有泛化性&#xff1f;不…...

ansible的部署与命令模块

目录 一、ansible的概述 1、ansible简介 2、ansible特点 3、官方网站 4、ansible的模块组成 5、ansible的工作机制 二、ansible部署 1、ansible的安装 三、ansible的命令行模块 1、command模块 2、shell模块 3、cron模块 4、user模块 5、group模块 6、copy模块 7…...

开发人员与测试人员关系的理解

在软件开发中都会有开发人员&#xff08;以下简称开发&#xff09;和测试人员&#xff08;以下简称测试&#xff09;&#xff0c;在一些小型公司可能并没有测试&#xff0c;仅仅是开发兼任测试。在这里我仅针对于有专业的测试和专业的开发的项目。 每个公司应该都有考核机制&am…...

直面原理:5 张图彻底了解 Android TextToSpeech 机制

ChatGPT 如此火爆&#xff0c;但它的强悍在于 NLU&#xff08;自然语言理解&#xff09;、DM&#xff08;对话管理&#xff09;和 NLG &#xff08;自然语言生成&#xff09;这三块&#xff0c;而 Recognition 识别和 TTS 播报这两块是缺失的。假使你的 App 接入了 ChatGPT&…...

Ruby Socket 编程

Ruby提供了两个级别访问网络的服务&#xff0c;在底层你可以访问操作系统&#xff0c;它可以让你实现客户端和服务器为面向连接和无连接协议的基本套接字支持。 Ruby 统一支持应用程序的网络协议&#xff0c;如FTP、HTTP等。 不管是高层的还是底层的。ruby提供了一些基本类&a…...

Vue3+ElementPlus+koa2实现本地图片的上传

一、示例图二、实现过程利用Koa2书写提交图片的后台接口这个模块是我写的项目中的其中一个板块——上传图片&#xff0c;这个项目的后台接口主要是是使用了后端的Koa2框架&#xff0c;前端小伙伴想要试着自己书写一些增删改查的接口可以从这个入手&#xff0c;Koa2用来了解后端…...

常见漏洞之 Fastjson

数据来源 01 Fastjson相关介绍 》Fastjson概述 》Fastjson历史漏洞 02 Fastson的识别与漏洞发现 》Fastjson寻找 》Fastjson漏洞发现&#xff08;利用 dnslog&#xff09; 03 修复建议 建议1&#xff1a;使用fastjson1.2.83版本&#xff1b; Github地址&#xff1a;https:…...

绕过Nginx Host限制

目录绕过Nginx Host限制SNI第三种方法&#xff1a;总结绕过Nginx Host限制 SNI SNI&#xff08;Server Name Indication&#xff09;是 TLS 的扩展&#xff0c;这允许在握手过程开始时通过客户端告诉它正在连接的服务器的主机名称。 作用&#xff1a;用来解决一个服务器拥有…...

Visual Studio 2022 常用快捷键,记录一下别忘记~

Visual Studio 2022 常用快捷键&#xff0c;记录一下别忘记~ CtrlEC 注释代码 CtrlEU 取消注释代码 CtrlED 格式化全部代码 CtrlShiftA 新建类 CtrlRG 删除无效Using CtrlH 批量替换 CtrlG 跳转到指定行 CtrlEE 在交互窗口中运行选中代码(很实用) AltEnter 快速引用 …...

告别手动Dockerfile!io.fabric8插件如何用Maven配置自动生成镜像(附Spring Boot实战)

告别手动Dockerfile&#xff01;io.fabric8插件如何用Maven配置自动生成镜像&#xff08;附Spring Boot实战&#xff09; 在Java生态中&#xff0c;容器化部署已成为现代应用交付的标准方式。传统做法要求开发者同时维护Dockerfile和构建脚本&#xff0c;这种割裂的配置方式不仅…...

Python+Spark+Hadoop商品评论数据分析可视化系统+情感分析 大数据毕业设计

1、项目介绍 技术栈&#xff1a; Python语言、Django框架、MySQL数据库 、Echarts可视化、情感分析、HTML商品评论数据分析可视化系统是基于Python语言和Django框架开发的一个Web应用程序。它的主要功能是对商品评论数据进行分析&#xff0c;并将分析结果通过Echarts可视化库展…...

基于.NET 11 与C# 14的高性能安全客户端应用开发

基于.NET 11 与C# 14的高性能安全客户端应用开发 前言 在客户端应用开发领域&#xff0c;性能与安全始终是关键指标。随着.NET 11 和 C# 14 的推出&#xff0c;开发者拥有了更强大的工具来构建高性能且安全可靠的客户端应用。这些新技术不仅提升了应用的运行效率&#xff0c;还…...

Midscene.js终极指南:3步让AI帮你自动操作任何界面

Midscene.js终极指南&#xff1a;3步让AI帮你自动操作任何界面 【免费下载链接】midscene Let AI be your browser operator. 项目地址: https://gitcode.com/GitHub_Trending/mid/midscene Midscene.js是一个AI驱动的跨平台自动化工具&#xff0c;让你用自然语言就能控…...

汉字拼音转换工具选型与实战指南:用pinyinjs解决多场景字符处理难题

汉字拼音转换工具选型与实战指南&#xff1a;用pinyinjs解决多场景字符处理难题 【免费下载链接】pinyinjs 一个实现汉字与拼音互转的小巧web工具库&#xff0c;演示地址&#xff1a; 项目地址: https://gitcode.com/gh_mirrors/pi/pinyinjs 在数字化产品开发中&#xf…...

别再死记硬背了!用‘快递寄送’和‘跨国通话’的比喻,5分钟搞懂OSI七层模型与TCP/IP五层模型

快递与越洋电话&#xff1a;用生活场景拆解网络分层模型 想象一下&#xff0c;你网购的商品从深圳工厂到北京家门口&#xff0c;要经过打包、装车、跨省运输、本地配送多个环节——这和网络数据传输的层层封装如出一辙。而当你给海外亲友视频通话时&#xff0c;双方手机自动协商…...

BERT文本分割-中文模型企业应用:内容平台文档结构化

BERT文本分割-中文模型企业应用&#xff1a;内容平台文档结构化 1. 引言&#xff1a;为什么需要文本分割技术 在日常工作中&#xff0c;我们经常会遇到这样的情况&#xff1a;会议记录、访谈稿、讲座内容等长篇口语文字材料缺乏段落结构&#xff0c;阅读起来十分困难。这些由…...

ComfyUI-WanVideoWrapper:AI视频生成性能优化的终极指南

ComfyUI-WanVideoWrapper&#xff1a;AI视频生成性能优化的终极指南 【免费下载链接】ComfyUI-WanVideoWrapper 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-WanVideoWrapper 在AI视频生成领域&#xff0c;显存限制和部署复杂性一直是开发者面临的核心挑…...

实战对比:Vamana/HNSW/NSG三大图算法在百维向量搜索中的性能差异

百维向量搜索实战&#xff1a;Vamana/HNSW/NSG三大图算法性能横评 在当今数据爆炸的时代&#xff0c;高效处理高维向量搜索已成为推荐系统、图像识别和自然语言处理等领域的核心技术瓶颈。面对百维甚至更高维度的向量数据&#xff0c;传统暴力搜索方法早已力不从心&#xff0c;…...

从像素到对象:如何用HANet和SNUNet搞定遥感影像中的‘小目标’与‘不平衡’难题?

从像素到对象&#xff1a;HANet与SNUNet在遥感影像小目标检测中的实战解析 当洪水退去后的灾损评估卫星图上&#xff0c;那些被冲毁的农舍屋顶往往只占据几个像素&#xff1b;在城市违建监测中&#xff0c;新增的违章建筑可能只是高分辨率影像中的微小色块。这些"小目标&q…...