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

Spring基本概念与使用

文章目录

  • 一、Spring概念
    • 1.容器
    • 2.IoC
    • 3.DI
    • 4.Ioc与DI的关系
  • 二、Spring创建与使用
    • 1.Maven
    • 2.添加Spring框架支持
      • 注:国内的Maven源配置
    • 3.简单实例
      • (1)创建一个Bean对象。
      • (2)将Bean对象存储到Spring当中
      • (3)从spring中读取到Bean对象。
        • a)先得到Spring上下文对象。
          • ApplicationContext与BeanFactory的关系
        • b)从Spring中取出bean对象
  • 四、简单的将对象存储到Spring中
    • 1.五大类注解
      • 命名规则
      • 为什么需要五个类注解?
      • 五大类注解用途(重点)
    • 2.方法注解
      • @Bean
  • 五、更加简单的对象注入
    • 1.属性注入
    • 2.Setter注入
    • 3.构造方法注入
    • @Autowired与@Resource的关系
  • 六、Bean的作用域与Spring的生命周期
    • 1.Bean的作用域
      • Lombok
      • Bean作用域分类
    • 2.Spring的执行流程
    • 3.Bean生命周期


一、Spring概念

Spring是一个开源框架,是一个包含了众多工具方法的IoC容器。可以用来将Bean对象放入和取出。

1.容器

之前接触过的容器:
List/Map:数据存储容器。
Tomcat:Web容器。

2.IoC

IoC(Inversion of Control)控制反转,把创建对象的权利交给容器,对象的实例不再由调用者来创建,而是由容器来创建,容器会负责控制程序之间的关系,而不是由调用者的程序代码直接控制。控制权由应用代码转移带了容器,控制权发生了反转,这就是控制反转。
Spring也是一个容器,是一个IoC(Inversion of Control)容器。

3.DI

DI(依赖注入):动态的将某个类引入当前类的行为/机制。

例如:构造一辆车需要框架,框架需要底盘,底盘需要轮胎,制造轮胎需要知道轮胎的大小,如果需要改变轮胎的大小或者其他竖向属性,需要改动每一个与之有依赖的对象,高耦合;而当前的方法,直接将轮胎对象注入底盘,底盘对象注入框架,框架对象注入车,在需要改动轮胎大小等属性的时候,只需要在轮胎对象中修改即可,而底盘和框架对象则不需要再有变动,这样子降低了耦合度。
在这里插入图片描述

以前方法:在这里插入图片描述

现在方法 :
在这里插入图片描述

4.Ioc与DI的关系

IoC是“目标”也是一种思想,DI是具体的实现。例如:今天我想去吃一顿那好的,这是一种目标和思想(IoC),最后我今天吃了烤肉,这就是DI。

二、Spring创建与使用

1.Maven

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.添加Spring框架支持

在pom.xml中注入依赖,并点击Maven的刷新按钮。
在这里插入图片描述

    <dependencies><!-- https://mvnrepository.com/artifact/org.springframework/spring-context --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.3.RELEASE</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-beans --><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>5.2.3.RELEASE</version></dependency></dependencies>

注:国内的Maven源配置

在这里插入图片描述在这里插入图片描述

3.简单实例

创建一个普通类的main方法运行Spring框架。

(1)创建一个Bean对象。

(2)将Bean对象存储到Spring当中

a)在resources下创建一个spring配置文件。
在这里插入图片描述

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">
</beans>

b)将Bean对象配置到spring配置文件中。
在这里插入图片描述
在这里插入图片描述

(3)从spring中读取到Bean对象。

a)先得到Spring上下文对象。

方式一:

//1.先得到 Spring 对象ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");

方式二:BeanFactory

BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
ApplicationContext与BeanFactory的关系

相同点:
1.都可以得到Spring上下文对象;
2.都是来自Spring的顶级接口。
不同点:
1.继承关系和功能:ApplicationContext属于BeanFactory的子类;BeanFactory只有最基础访问Bean的能力,而ApplicationContext除了拥有BeanFactory功能之外,还包含了更多的功能,如:国际化支持、资源访问、事件传播等。
2.性能:ApplicationContext加载方式是将Bean对象一次性加载,所以在后面访问Bean对象时很快(饿汉模式);BeanFactory需要某个Bean时,采取加载Bean对象,所以它在执行Bean获取时,比较慢。

b)从Spring中取出bean对象

方式一:根据 bean 的名称(标识)获取bean对象

        //根据 bean 的名称(标识)获取bean对象User user = (User) context.getBean("user");//取user

方式二:根据 bean 类型获取 bean

		//根据 bean 类型获取 bean,多个bean时会报错User user3 = context.getBean(User.class);

方式三:根据 bean名称 + bean类型 获取bean

		User user4 = context.getBean("user",User.class);

在这里插入图片描述
在这里插入图片描述

        //1.先得到 Spring 对象ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");//2.从Spring中取出bean对象User user = (User) context.getBean("user");//3.使用Bean(可选)System.out.println(user.sayHi());

在这里插入图片描述

四、简单的将对象存储到Spring中

1.五大类注解

命名规则

在这里插入图片描述
命名规则:如果第一个字母和第二个字母不为大写,则命名为将首字母小写;否则,命名为原类名。

为什么需要五个类注解?

(1)通过类注解可以了解当前类的用户(例如:车牌前有地域的划分等)。
(2)功能有细微不同。

五大类注解用途(重点)

(1)@Controller(控制器):归属于业务逻辑层,用来控制用户的行为,它用来检查用户参数的有效性。

(2)@Service(服务):归属于服务层,调用持久化类实现响应的功能。(不直接和数据库交互,它类似于控制中心)

(3)@Repository(仓库):归属于持久层,是直接和数据库进行交互的,通常每一个表都会对应一个@Repository。

(4)@Configuration(配置):归属于配置层,是用来配置当前项目的一些信息的。

(5)@Component(组件):归属于公共工具类,提供某些公共方法。

注:@Component是除了它自己的其他四个类的父类。

2.方法注解

存对象到Spring中方法二。

@Bean

@Bean:将当前修饰方法的方法对象存储到Spring当中。
(1)@Bean要与五大类配合使用;
(2)获取Bean时如果没有给注入的Bean进行命名,则直接用方法名获取;如果使用了name属性命名,则需要用设置的方法名进行获取。
(3)给@Bean设置了name属性之后,实验原方法名就不能获取对象了,只能使用设置的名称才能获取。
在这里插入图片描述
在这里插入图片描述

注:@Bean注解一定要配合5大类注解一块使用,否则是无效的方法注解。

五、更加简单的对象注入

@Autowired
@Resource

1.属性注入

使用属性注入的方式获取Bean
在这里插入图片描述
优点:实现简单。
缺点:
       (1)不可注入一个不可变(final)的对象,一般final修饰的属性要么直接赋值,要么在构造方法中初始化。
       (2)只适用于IoC容器。
       (3)更容易违背单一性原则。(针对类级别,写法简单,更容易犯错)

2.Setter注入

在这里插入图片描述

优点:更加符合单一设计原则。(针对对象方法级别,写法麻烦,用的时候才会去写)
缺点:
       (1)不能注入不可变对象。
       (2)注入对象可被修改。(由于set方法是普通方法,可重复调用,被调用时存在被修改的危险)

3.构造方法注入

构造方法注入是Spring官方从4.x之后推荐的注入方式。

在这里插入图片描述

优点:
(1)可以注入一个不可变对象.
(2)注入的对象不会被修改。
         a)加了final修饰符。
         b)构造方法就是随着类加载只执行一次的(不像set有可能执行多次被修改的风险)
(3)注入的对象会被完全初始化。
(4)通用性更好。

总结:日常开发中,使用属性注入实现更简单的读取Bean,依然是主流的方式。

@Autowired与@Resource的关系

相同点:都是用来实现依赖注入的。
不同点:
       (1)功能支持不同:@Autowired支持属性注入、setter注入、构造方法注入;@Resource支持属性、setter注入,但不支持构造方法注入。

       (2)出身不同:@Autowired来自Spring框架;而@Resource来自于JDK。

       (3)参数支持不同:@Resource支持更多的参数设置;而@Autowired只支持required参数。

1.@Resource的属性注入与@Autowired的属性注入对比:
在这里插入图片描述
2.setter注入方法都差不多。

六、Bean的作用域与Spring的生命周期

1.Bean的作用域

Bean作用域:Bean在整个Spring框架(项目)中的某种行为模式。

Lombok

lombok:简化Java开发的一个工具,为了更简单的替代Java中必要代码的一种实现工具。
lombok使用:
1.在项目中引用lombok。
(1)在pom.xml中添加依赖。

        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version><scope>provided</scope></dependency>

(2)在setting->plugingz中下载lombok插件。

在这里插入图片描述
@Data==>@Setter+@Getter+@ToString

Bean作用域分类

(1)singleton:单例模式。(默认作用域)作用于IoC容器。
默认UserBean的作用域为@Scope(“singleton”)
在这里插入图片描述在这里插入图片描述
(2)prototype:原型模式(多例模式)
@Scope(“prototype”)
在这里插入图片描述
(3)request:请求作用域。
(4)session:会话作用域。->类似多线程中的ThreadLocal
(5)application:全局作用域。作用于servlet容器,应用在Spring MVC中。
(6)websocket:应用在Spring WebSocket中。

2.Spring的执行流程

(1)启动容器(启动项目)
(2)读取配置文件,初始化。
        a)使用xml直接注册bean;
        b)配置bean跟(扫描)路径。
(3)将bean存储到spring中,通过类注解进行扫描和装配。
(4)将bean从spring读取出来,装配到响应的类。

3.Bean生命周期

生命周期指的是一个对象从诞生到销毁的整个生命过程,我们把这个过程就叫做一个
对象的生命周期。Bean的生命周期分为以下5大部分:在这里插入代码片
(1)实例化(对应JVM中的“加载”),从无到有,将字节码转换成内存中的对象,只是分配了内存。
(2)设置属性(Bean注入和装配)
(3)初始化:
        a)各种通知;
        b)初始化的前置工作;
        c)进行初始化工作(使用注解@PostConstruct初始化、使用(xml)init-method初始化);
        d)初始化的后置工作。
(4)使用Bean;
(5)销毁Bean。
在这里插入图片描述
实例化-》设置属性-》初始化
在这里插入图片描述

相关文章:

Spring基本概念与使用

文章目录一、Spring概念1.容器2.IoC3.DI4.Ioc与DI的关系二、Spring创建与使用1.Maven2.添加Spring框架支持注&#xff1a;国内的Maven源配置3.简单实例&#xff08;1&#xff09;创建一个Bean对象。&#xff08;2&#xff09;将Bean对象存储到Spring当中&#xff08;3&#xff…...

安恒信息java实习面经

目录1.Java ME、EE、SE的区别&#xff0c;Java EE相对于SE多了哪些东西&#xff1f;2.jdk与jre的区别3.说一下java的一些命令&#xff0c;怎么运行一个jar包4.简单说一下java数据类型及使用场景5.Map跟Collection有几种实现&#xff1f;6.面向对象的特性7.重载和重写的区别8.重…...

第八章:枚举类与注解

第八章&#xff1a;枚举类与注解 8.1&#xff1a;枚举类的使用 ​ 类的对象只有有限个&#xff0c;确定的。我们称此类为枚举类。当需要定义一组常量是&#xff0c;强烈建议使用枚举类。如果枚举类中只有一个对象&#xff0c;则可以作为单例模式的实现方式。 如何定义枚举类 …...

Ceph介绍

分布式存储概述 常用的存储可以分为DAS、NAS和SAN三类 DAS&#xff1a;直接连接存储&#xff0c;是指通过SCSI接口或FC接口直接连接到一台计算机上&#xff0c;常见的就是服务器的硬盘NAS&#xff1a;网络附加存储&#xff0c;是指将存储设备通过标准的网络拓扑结构&#xff…...

remove 和 erase 的区别

remove 和 erase 的区别 以容器vector来说明remove和erase的区别 在STL中&#xff0c;vector容器也提供了remove()和erase()函数&#xff0c;用于从vector中删除元素。虽然这两个函数都可以实现删除元素的功能&#xff0c;但是它们之间还是有一些区别的。 remove() remove(…...

NFTScan:怎么使用 NFT API 开发一个 NFT 数据分析平台?

对很多开发者来说&#xff0c;在 NFT 数据海洋中需要对每个 NFT 进行索引和筛选是十分困难且繁琐的&#xff0c;NFT 数据获取仍是一大问题。而数据平台提供的 API 使得开发者可以通过接口获取区块链上 NFT 的详细信息&#xff0c;并对其进行分析、处理、统计和可视化。在本篇文…...

ECOLOY直接更换流程表单后导致历史流程中数据为空白的解决方案

用户反馈流历史流程打开是空白了没有内容。 一、问题调查分析&#xff1a; 工作流“XX0204 员工培训协议审批流程”workflowId37166产生的7个具体流程中&#xff0c;创建日期为2021年的4个具体流程原先引用的数据库表单应该是“劳动合同签订审批表”(formtable_main_190)&…...

mysql中的共享锁,排他锁,间隙锁,意向锁及死锁机制

一、前言&#xff08;以下均为读完 高性能Mysql第四版 后的个人理解&#xff0c;建议阅读&#xff0c;挺不错的&#xff09;在写锁机制前先简单贴出mysql InnoDB引擎中的事务特性与隔离级别&#xff1a;事务的ACID标准(1)原子性-atomicity&#xff1a;一个事务作为一个不可分割…...

SpringBoot整合MybatisPlus

文章目录前言一、MybatisPlus是什么&#xff1f;二、使用步骤1.导入依赖2.编写配置文件3.编写Controller和实体类4.编写持久层接口mapper5.启动类加包扫描注解6.测试总结前言 本篇记录一下SpringBoot整合MybatisPlus 一、MybatisPlus是什么&#xff1f; MyBatis-Plus&#xff…...

中电金信Gien享汇・大数据专题|金融行业数据架构及模型演进

本期嘉宾 陈子刚 中电金信商业分析事业部华南区总经理 毕业于复旦大学&#xff0c;硕士研究生&#xff1b;拥有16年以上金融行业商业智能领域从业经验&#xff1b;曾就职于中国工商银行、Teradata、东亚银行&#xff0c;服务于平安银行、广发银行、招商银行、广东农信、招商…...

Cadence Allegro 导出Design Cross Section报告详解

⏪《上一篇》   🏡《上级目录》   ⏩《下一篇》 目录 1,概述2,Design Cross Section作用3,Design Cross Section示例4,Component Report导出方法4.1,方法14.2,方法2B站关注“硬小二”浏览更多演示视频 1,概述 <...

【LeetCode】剑指 Offer 23. 链表中环的入口节点 p139 -- Java Version

题目链接&#xff1a;https://leetcode.cn/problems/c32eOV/ 1. 题目介绍&#xff08;23. 链表中环的入口节点&#xff09; 给定一个链表&#xff0c;返回链表开始入环的第一个节点。 从链表的头节点开始沿着 next 指针进入环的第一个节点为环的入口节点。如果链表无环&#x…...

LeetCode-96. 不同的二叉搜索树

题目来源 96. 不同的二叉搜索树 递归 1.我们要知道二叉搜索树的性质&#xff0c;对于一个二叉搜索树&#xff0c;其 【左边的节点值 < 中间的节点值 < 右边的节点值】&#xff0c;也就是说&#xff0c;对于一个二叉搜索树&#xff0c;其中序遍历之后形成的数组应该是一…...

JavaWeb基础

Servlet 是在服务器上运行的小程序。这个词是在 Java applet的环境中创造的&#xff0c;Java applet 是一种当作单独文件跟网页一起发送的小程序&#xff0c;它通常用于在客户端运行&#xff0c;结果得到为用户进行运算或者根据用户互作用定位图形等服务。服务器上需要一些程序…...

C++基础了解-03-C++变量类型

C变量类型 一、变量类型 变量其实只不过是程序可操作的存储区的名称。C 中每个变量都有指定的类型&#xff0c;类型决定了变量存储的大小和布局&#xff0c;该范围内的值都可以存储在内存中&#xff0c;运算符可应用于变量上。 变量的名称可以由字母、数字和下划线字符组成。…...

树莓派4b——通过mjpg-streamer使用摄像头

参考博文&#xff1a;(51条消息) 树莓派4b如何打开摄像头_树莓派打开摄像头_会飞的小东的博客-CSDN博客(51条消息) 树莓派4B &#xff08;系统版本11&#xff0c;bullseye&#xff09;更换清华源_树莓派更换清华源_ASSSSHION的博客-CSDN博客这个坑踩了我一星期&#xff0c;找各…...

MySQL运维篇之读写分离

04、读写分离 4.1、介绍 读写分离&#xff0c;简单地说是把对数据库的读和写操作分开&#xff0c;以对应不同的数据库服务器。主数据库提供写操作&#xff0c;从数据库提供读操作&#xff0c;这样能有效地减轻单台数据库的压力。 通过Mycat即可轻易实现上述功能&#xff0c;…...

windows程序最小化到托盘并显示提示信息

windows程序最小化到托盘并显示提示信息背景干货直接上代码解析控制窗口显示初始化托盘添加第一条消息更新界面结束啦背景 有些时候需要程序在最小化的时候可以看到程序进度&#xff0c;甚至需要完全关闭界面&#xff0c;只留下托盘显示&#xff0c;这篇文章就是在这个背景下诞…...

使字符串平衡的最少删除次数(简单动态规划)

给你一个字符串 s &#xff0c;它仅包含字符 a 和 b​​​​ 。 你可以删除 s 中任意数目的字符&#xff0c;使得 s 平衡 。当不存在下标对 (i,j) 满足 i < j &#xff0c;且 s[i] b 的同时 s[j] a&#xff0c;此时认为 s 是 平衡 的。 请你返回使 s 平衡 的 最少 删除次…...

linux网络广播使用

广播使用的特殊的IP地址: 最后一位是255时的IP地址是给广播预留的IP地址, 如:192.168.1.255 UDP服务器在广播数据时,数据报使用的地址不是UDP服务器地址,而是广播地址 如:UDP服务器地址是:192.168.1.110 UDP服务器广播数据时使用地址是:192.168.1.255 UDP数据包发送给交换机…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...

c# 局部函数 定义、功能与示例

C# 局部函数&#xff1a;定义、功能与示例 1. 定义与功能 局部函数&#xff08;Local Function&#xff09;是嵌套在另一个方法内部的私有方法&#xff0c;仅在包含它的方法内可见。 • 作用&#xff1a;封装仅用于当前方法的逻辑&#xff0c;避免污染类作用域&#xff0c;提升…...

vue3 daterange正则踩坑

<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...