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

Spring核心

Spring Framework

  • Spring的两个核心
    • IOC控制反转
      • IOC容器
      • 依赖注入DI
      • IOC容器实现
      • 注解管理Bean
        • Bean对象定义
        • Bean对象获取
    • AOP面向切面编程
  • 添加依赖
  • 入门案例
    • 注解
    • 通过Spring创建Java bean对象
  • xml管理Bean案例
    • main下创建bean.XMl文件
  • DI依赖注入案例
    • 创建Spring配置文件 bean-di.xml
  • 注解管理Bean案例

Spring的两个核心

IOC控制反转

  • Inverse of Control的简写,为 控制反转,指是将对象的创建和管理交由Spring框架来完成,而不是由开发人员手动创建和管理

  • 即:反转资源获取方向,把自己创建资源、向环境索取资源的方式变为环境自动将资源准备好,我们享受资源注入

IOC容器

  • IoC容器是用来实现IoC思想的一个工具或者说技术手段

  • 它能够自动扫描应用程序中的对象,将它们实例化,并自动注入它们所需要的依赖对象,使应用程序的开发人员能够更加专注于业务逻辑的实现,而不用关心对象的创建和管理。Spring通过IoC容器来管理所有的Java对象的实例化和初始化,控制着对象与对象之间的依赖关系

依赖注入DI

  • DI (Dependency Injection):依赖注入,依赖注入实现了控制反转的思想,是指Spring创建对象的过程中,将对象依赖属性通过配置进行注入
  • 所以 IoC 是一种控制反转的思想,而依赖注入 DI 是对 IoC 的一种具体实现
  • Bean管理:指Bean对象的创建,以及Bean对象中属性的赋值

IOC容器实现

Spring中的IoC容器就是IoC思想的一个落地产品实现。IoC容器中管理的组件也叫做bean。在创建bean之前,首先需要创建IoC容器,Spring提供了IoC容器的两种实现方式

  • BeanFactory
    这是IoC容器的基本实现,是Spring内部使用的接口,面向Spring本身,不提供给开发人员使用。

  • ApplicationContext
    BeanFactory的子接口,提供了更多高级特性,面向Spring的使用者,几乎所有场合都使用 ApplicationContext,而不使用底层的BeanFactory。

ApplicationContext的主要实现类

类型说明
AnnotationConfigApplicationContext使用注解方式构建IoC容器
ClassPathXmlApplicationContext使用XML配置文件方式构建Spring IoC容器

注解管理Bean

Bean对象定义

在Spring框架规范中,所有由spring管理的对象都称之为Bean对象。
Spring提供了以下多个注解,这些注解可以直接标注在java类上,将它们定义成Spring Bean。

注解说明
@Component该注解用于描述Spring中的Bean,它是一个泛化的概念,仅仅标识容器中的一个组件(Bean),并且可以作用在任何层次,例如Service层、Dao层等,使用时只需将该注解标注在相应的类上即可。
@Repository该注解用于数据访问层(Dao层)的类标识为Spring中的Bean,功能与@Component相同。
@Service该注解通常作用在业务层(Service层),用于将业务层的类标识为Spring中的Bean,其功能与@Component相同。
@Controller该注解通常作用在控制层(如SpringMVC的Controller),用于将控制层的类标识为Spring中的Bean,其功能与@Component相同。
Bean对象获取
ApplicationContext context = new AnnotationConfigApplicationContext("包扫描路径");
User user = context.getBean(类名.class);

请添加图片描述

AOP面向切面编程

Aspect Oriented Programming 的简写,为 面向切面编程。AOP用来封装多个类的公共行为,将那些与业务无关,却为业务模块共同调用的逻辑封装起来,减少系统的重复代码。
请添加图片描述

添加依赖

<dependencies><!-- Maven坐标:https://mvnrepository.com/artifact/org.springframework/spring-context --><!-- 引入spring context依赖--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.24</version></dependency>
</dependencies>

入门案例

注解

  • @Component
    注解描述的类,表示此类交给Spring框架管理
package cn.tedu.spring.example;
import org.springframework.stereotype.Component;@Component
public class User {public void userRun(){System.out.println("User is do something~~");}
}

通过Spring创建Java bean对象

  • AnnotationConfigApplicationContext扫描这个包中所有带有@Component注解的类,并根据这些类创建相应的Spring组件
package cn.tedu.spring.example;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class TestUser {public static void main(String[] args) {ApplicationContext context = new AnnotationConfigApplicationContext("cn.tedu.spring.example");User user1 = context.getBean(User.class);System.out.println("user1 = " + user1);user1.userRun();}
}

请添加图片描述

xml管理Bean案例

  • 在Spring框架中,Bean的配置可以通过 XML 文件来完成。这个文件通常被称为 Spring 配置文件或 Spring XML 文件。
package cn.tedu.spring.example;public class UserXml {private String username;private String password;public void run(){System.out.println("今天天气不错挺风和日丽的~");}
}

main下创建bean.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="userXml" class="cn.tedu.spring.example.UserXml"></bean>
</beans>
package cn.tedu.spring.example;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestUserXml {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");UserXml userXml = (UserXml)context.getBean("userXml");userXml.run();}
}

请添加图片描述

DI依赖注入案例

package cn.tedu.spring.dibase;public class Book {private String bookName;private String bookAuthor;public void setBookName(String bookName) {this.bookName = bookName;}public void setBookAuthor(String bookAuthor) {this.bookAuthor = bookAuthor;}@Overridepublic String toString() {return "Book{" +"bookName='" + bookName + '\'' +", bookAuthor='" + bookAuthor + '\'' +'}';}
}

创建Spring配置文件 bean-di.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="book" class="cn.tedu.spring.dibase.Book"><property name="bookName" value="倚天屠龙记" /><property name="bookAuthor" value="金庸"/></bean>
</beans>
package cn.tedu.spring.dibase;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestBook {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("bean-di.xml");Book book = context.getBean(Book.class);System.out.println("book = " +book);}
}

请添加图片描述

注解管理Bean案例

  • @Value
    ​ @Value注入是将属性值直接注入到bean中,主要用于注入一些简单类型的属性(如字符串、基本类型等);
    使用时需要注意属性的类型和格式,否则会导致注入失败。
  • @Autowired
    @Autowired注入是将对象注入到bean中,并且在注入对象时会根据依赖注入容器中 bean的类型 进行匹配。
    如果容器中有多个类型匹配的bean存在,则会抛出异常。因此,@Autowired注入常用于注入复杂对象、接口类型的属性或其他bean实例。
package cn.tedu.spring.bean;import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Repository;@Repository
public class UserDao {@Value("jdbc:mysql://localhost:3306/tedu")private String dbUrl;@Value("root")private String username;private String password;@Value("qwertyuiop")public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "UserDao{" +"dbUrl='" + dbUrl + '\'' +", username='" + username + '\'' +", password='" + password + '\'' +'}';}
}
package cn.tedu.spring.bean;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;@Service
public class UserService {@Value("注册业务")private String serveName;@Autowiredprivate UserDao userDao;@Overridepublic String toString() {return "UserService{" +"serveName='" + serveName + '\'' +", userDao=" + userDao +'}';}
}
package cn.tedu.spring.bean;import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class TestUserDao {@Testpublic void testBean(){ApplicationContext context = new AnnotationConfigApplicationContext("cn.tedu.spring.bean");UserDao userDao = context.getBean(UserDao.class);System.out.println("userDao = " + userDao);}public static void main(String[] args) {ApplicationContext context = new AnnotationConfigApplicationContext("cn.tedu.spring.bean");UserService userService = context.getBean(UserService.class);System.out.println("userService:"+ userService);}
}

相关文章:

Spring核心

Spring Framework Spring的两个核心IOC控制反转IOC容器依赖注入DIIOC容器实现注解管理BeanBean对象定义Bean对象获取 AOP面向切面编程 添加依赖入门案例注解通过Spring创建Java bean对象 xml管理Bean案例main下创建bean.XMl文件 DI依赖注入案例创建Spring配置文件 bean-di.xml …...

ffmpeg命令行处理视频,学习记录

ffmpeg命令行处理视频 截取视频前5s ffmpeg -ss 00:00:00 -t 00:00:05 -i .\public\uploads\20231109\116a292eccf8315f65d7166e794d1730.mp4 .\public\uploads\20231109\116a292eccf8315f65d7166e794d1731.mp4两视频合并为1个 ffmpeg -i F:\xuejiao\code\cms.openlai.com\p…...

Linux应用层点亮硬件的LED灯

一 应用层操作硬件的两种方法 应用层想要对底层硬件进行操控&#xff0c;通常可以通过两种方式&#xff1a; /dev/目录下的设备文件&#xff08;设备节点&#xff09;&#xff1b;/sys/目录下设备的属性文件。 具体使用哪种方式需要根据不同功能类型设备进行选择&#xff0c;通…...

密钥安全存储方案探讨与实践

随着信息技术的迅猛发展和应用范围的不断扩大&#xff0c;我们日常生活中的许多方面已经与信息技术密不可分。而在信息安全领域中&#xff0c;密钥的安全存储显得尤为重要。本文将探讨密钥安全存储的必要性、相关技术和实践方案&#xff0c;并提出一些解决方案。 一、密钥安全存…...

[pytorch]设备选择以及卷积神经网络的应用

0.写在前面: 首先这篇文章还没写完,因为今天要尝试对我之前的一个框架做一个简单的更新迭代,所以目前先更新这么多. 1.关于设备的选择 首先,目前的大多数电脑都是自带一些GPU(图形计算单元,在这里被称之为cuda), 需要安装相关的驱动才能正常使用这些设备和调用他们的具体情况…...

API SIX系列-服务搭建(一)

APIsix简介 APISIX是一个微服务API网关&#xff0c;具有高性能、可扩展性等优点。它基于nginx&#xff08;openresty&#xff09;、Lua、etcd实现功能&#xff0c;借鉴了Kong的思路。和传统的API网关相比&#xff0c;APISIX具有较高的性能和较低的资源消耗&#xff0c;并且具有…...

hadoop 大数据环境配置 同步时间 centos服务器时间同步 linux 安装ntp服务更新时间 hadoop(六)

1. 安装ntp软件 yum install -y ntp 2.创建软连接 # 删除之前得时间 sudo rm -rf /etc/localtime;# 更新时区sudo ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime3. 更新时间 # root 权限运行 sudo ntpdate -u ntp.aliyun.com 4. 开机自启&#xff0c;更新时间 …...

基于单片机智能输液器监控系统的设计

**单片机设计介绍&#xff0c; 基于单片机智能输液器监控系统的设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的智能输液器监控系统可以实现对输液过程的实时监测和控制&#xff0c;以下是一个基本的设计介绍&am…...

Unity解决:没有UnityWebRequest.Result

当我在Unity 2019中使用Unity 2021的代码satable时。 控制台显示 “UnityWebRequest”不包含“result”的定义,并且找不到接受“UnityWebRequest”类型的第一个参数的可访问扩展方法“result”(是否缺少using指令或程序集引用?) 漏洞/问题: if (req.result == UnityWebRe…...

记录Linux的Bug

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 例如&#xff1a;项目场景&#xff1a;示例:通过蓝牙芯片(HC-05)与手机 APP 通信&#xff0c;每隔 5s 传输一批传感器数据(不是很大) 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1…...

优化改进YOLOv5算法之感受野注意力卷积运算(RFAConv),效果秒杀CBAM和CA等

目录 1 RFAConv原理 1.1 回顾标准卷积 1.2 回顾空间注意力 1.4 创新空间注意力与标准卷积...

【设计原则篇】聊聊里氏替换原则

是什么 子类对象可以替换程序中父类对象出现的任何地方&#xff0c;并且保证原有程序逻辑的正确性不被破坏。 比如我们在实际开发中定义了数据读取的父类&#xff0c;子类可以进行在此功能的拓展、增强但是不能修改原有的内在含义。 里氏替换原则和多态的区别&#xff0c;多态…...

k8s系列-kuboard创建工作负载 docker上传java微服务jar包到仓库的过程

文章目录 docker环境准备docker 镜像相关命令docker 容器相关命令容器和主机之间信息传递 内网中将jar包上传到docker仓库中 docker环境准备 1.查看环境中是否存在docker环境 docker version 2.不存在的话需要创建docker 镜像&#xff08;image&#xff09;&#xff1a; dock…...

基于单片机的塑料厂房气体检测系统设计

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 技术交流认准下方 CSDN 官方提供的联系方式 文章目录 概要 一、设计的主要内容二、系统硬件设计三、软件设计实物 四、结论五、 文章目录 概要 本文首先分析了基于单片机的可燃…...

HTTP-FLV详解及分析

文章目录 前言一、HTTP-FLV 简介1、市场上使用 http-flv 的商家2、http-flv、rtmp 和 hls 直播的优缺点3、http-flv 技术实现 二、Nginx 配置 http-flv1、Windows 安装 nginx&#xff0c;已经集成 nginx-http-flv-module2、nginx.conf 配置文件3、运行 nginx 服务器4、ffmpeg 推…...

docker应用实例及dockerfile

实际应用 神经网络项目由x86cpu的linux环境移到arm cpu架构上运行&#xff0c;使用docker进行测试以及环境配置。 docker load -i 镜像压缩文件.tar docker load -i命令用于从一个压缩的镜像存档文件&#xff08;通常是以.tar扩展名结尾&#xff09;中加载镜像到本地Docker引擎…...

【Qt之QWizard】使用1

QWizard使用 描述方法枚举&#xff1a;enum QWizard::WizardButton枚举&#xff1a;enum QWizard::WizardOption枚举&#xff1a;enum QWizard::WizardStyle枚举&#xff1a;enum QWizard::WizardPixmap常用成员方法槽函数信号 示例设置标题添加page页设置按钮文本设置自定义按…...

移植LVGL到单片机的一个demo简单介绍

简介 背景&#xff1a; 本文使用的是主控IC为stm32f103zet6, 显示IC为ST7735s&#xff0c;它是128*160的像素&#xff0c;色深为RGB565颜色。 官方虽然说LVGL移植平台只需 64kB 闪存和 8kB RAM 就足以满足简单的用户界面。但我移植到stm32f103c8t6&#xff0c;不管怎么修改配…...

rust_for_linux驱动完整版记录

文章目录 [清华开源操作系统训练营]《Rust fox Linux》课程的练习1-2完整版记录。1. 环境搭建2. 编译rust内核2.1 下载源代码2.2 安装rust支持2.3 检查linux内核是否支持rust2.4 编译linux内核 3. aarch64的qemu环境3.1.下载源代码3.2. 解压编译安装3.3. 配置环境变量3.4.验证 …...

Android拖放startDragAndDrop拖拽Glide灵活加载堆叠圆角图,Kotlin(6)

Android拖放startDragAndDrop拖拽Glide灵活加载堆叠圆角图&#xff0c;Kotlin&#xff08;6&#xff09; Android拖放startDragAndDrop拖拽Glide加载堆叠圆角图&#xff0c;Kotlin&#xff08;5&#xff09;-CSDN博客文章浏览阅读1.3k次。&#xfeff;&#xfeff;Android Dyna…...

Realistic Vision V5.1镜像免配置部署教程:Docker+本地模型路径自动校验

Realistic Vision V5.1镜像免配置部署教程&#xff1a;Docker本地模型路径自动校验 1. 项目概述 Realistic Vision V5.1虚拟摄影棚是基于Stable Diffusion 1.5生态顶级写实模型开发的本地化工具&#xff0c;专为追求摄影级人像效果的用户设计。这个解决方案通过Docker容器化技…...

【并发心法】别用 volatile 骗自己了!撕碎裸机并发的伪安全,用 C++ Atomics 与内存屏障镇压“乱序执行”的底层叛乱

摘要&#xff1a;在嵌入式 C/C 开发中&#xff0c;99% 的工程师误以为 volatile 是解决中断与主循环并发冲突的万能解药。本文将无情揭露这一长达数十年的认知毒瘤。我们将带你深入现代编译器&#xff08;GCC/Clang&#xff09;的优化黑盒与 ARM Cortex 高级内核的流水线深处&a…...

Windows 11 任务栏透明美化神器:TranslucentTB 完全使用指南

Windows 11 任务栏透明美化神器&#xff1a;TranslucentTB 完全使用指南 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 想要让 Windows …...

效率提升50%:OpenClaw+GLM-4.7-Flash的会议纪要自动化

效率提升50%&#xff1a;OpenClawGLM-4.7-Flash的会议纪要自动化 1. 为什么需要自动化会议纪要 作为技术团队负责人&#xff0c;我每周要参加至少8场会议。过去两年里&#xff0c;我尝试过各种会议纪要工具——从讯飞听见的语音转写&#xff0c;到Notion AI的摘要生成&#x…...

从Kaggle竞赛到真实业务:聊聊那些年我们用错的AI算法和开源库

从Kaggle竞赛到真实业务&#xff1a;聊聊那些年我们用错的AI算法和开源库 在数据科学社区里&#xff0c;Kaggle竞赛排行榜和真实业务需求之间&#xff0c;似乎永远隔着一道看不见的鸿沟。那些在竞赛中斩获高分的神奇模型&#xff0c;一旦放进生产环境&#xff0c;常常表现得像…...

新手必须掌握的6个Python爬虫库,非常实用!

Python中有非常多用于网络数据采集的库&#xff0c;功能非常强大&#xff0c;有的用于抓取网页&#xff0c;有的用于解析网页&#xff0c;这里介绍6个最常用的库。 1. BeautifulSoup BeautifulSoup是最常用的Python网页解析库之一&#xff0c;可将 HTML 和 XML 文档解析为树形…...

面试回答第十五问:类加载

类加载简介 类加载是JVM能够识别类信息&#xff0c;分配空间创建对象实例的基础。 类加载一共分为五阶段&#xff0c;分别是加载&#xff0c;验证&#xff0c;准备&#xff0c;解析&#xff0c;初始化五阶段。这不是顺序&#xff0c;不是加载之后才能验证&#xff0c;验证之后才…...

【2026年携程暑期实习- 3月29日-算法岗-第三题- 双门控序列加权器】(题目+思路+JavaC++Python解析+在线测试)

题目内容 在仅使用 n u m p y / p a n d a s / s c i k i t − l e a r n numpy/pandas/scikit-learn numpy/pandas/...

LabelImg图像标注工具:3分钟掌握高效目标检测数据标注技巧

LabelImg图像标注工具&#xff1a;3分钟掌握高效目标检测数据标注技巧 【免费下载链接】labelImg LabelImg is now part of the Label Studio community. The popular image annotation tool created by Tzutalin is no longer actively being developed, but you can check ou…...

如何用Chatterbox TTS打造多语言智能语音助手:从零开始的完整实战指南 [特殊字符]

如何用Chatterbox TTS打造多语言智能语音助手&#xff1a;从零开始的完整实战指南 &#x1f3a4; 【免费下载链接】chatterbox Open source TTS model 项目地址: https://gitcode.com/GitHub_Trending/chatterbox7/chatterbox 想要为你的应用添加逼真的语音合成功能吗&a…...