Spring IoC DI入门
一、Spring,Spring Boot和Spring MVC的联系及区别
Spring是另外两个框架的基础,是Java生态系统的核心框架,而SpringMVC是Spring 的子模块,专注于 Web 层开发,基于 MVC 设计模式(模型-视图-控制器)。Spring MVC 依赖 Spring 的 IOC 和 AOP,是 Spring 生态中处理 Web 请求的模块。而Spring Boot是Spring 的“快速启动器”,旨在简化 Spring 应用的配置和开发流程。Spring Boot 基于 Spring,但默认配置了 Spring MVC、Spring Data 等模块,更好上手。
二、什么是IoC
IoC是Spring的核心思想,其实IoC我们已经使用过了,在类上添加@Rest Controller和@Controller注解,就是将这个对象交给Spring管理,Spring框架启动时就会加载该类,把对象交给Spring处理,就是IoC思想。
概念:
三、一个关于IoC的实例
如果实现一辆车,需要以下结构:
它们是相互依赖的,Car依赖底盘,底盘依赖于轮胎。
如果我们按照以前的方式来写,是这样的。
package com.example.ioc;public class NewCar {public static void main(String[] args) {Car car = new Car(20);car.run();}
static class Car{private Bottom bottom;public Car(int size) {this.bottom = new Bottom(size);System.out.println("Car init....");}public void run() {System.out.println("Car run....");}}static class Bottom {private Tire tire;public Bottom(int size) {this.tire = new Tire(size);System.out.println("Bottom init....");}}static class Tire{private int size;public Tire(int size) {this.size = size;System.out.println("轮胎尺寸为"+size);}}
}
这样写的问题是:当代码最底层改动后,整个调用链上的代码都要改动,对于这段代码来说就是轮胎参数改变后,整个代码都要改。
解决方法:
我们可以将所有的配件都外包出去,如果轮胎尺寸更改后,我们只需要向代工厂提要求就行了,自身不需要修改。
此时,我们只需要将自己原本创建的下级类,改为传递的方式,也就是注入的方式,因为不需要在当前的类中创建下级类了,所以即使下级类发生改变,当前类也无需修改,这样就完成了程序的解耦合。
通过IoC思路修改后的代码:
package com.example.ioc;public class NewCar {public static void main(String[] args) {Tire tire = new Tire(20);Bottom bottom = new Bottom(tire);Car car = new Car(bottom);car.run();}
static class Car{private Bottom bottom;public Car(Bottom bottom) {this.bottom = bottom;System.out.println("Car init....");}public void run() {System.out.println("Car run....");}}static class Bottom {private Tire tire;public Bottom(Tire tire) {this.tire = tire;System.out.println("Bottom init....");}}static class Tire{private int size;public Tire(int size) {this.size = size;System.out.println("轮胎尺寸为"+size);}}
}
IoC优势:
通过IoC思想修改后的代码,类的创建方式是反的,传统代码是Car控制并创建了Bottom,而Bottom控制并创建了Tire,依次往下,而改进后的控制权发生反转不是使用方对象控制并创建依赖对象了,而是将依赖对象注入到当前对象中,依赖对象的控制权不再由当前类控制了。
这样的话,即使依赖类发生任何改变,当前类都是不受影响的,这就是经典的控制反转,也是IoC的实现思想。
四、IoC容器
上述这段代码就是IoC容器做的工作
Tire tire = new Tire(20);Bottom bottom = new Bottom(tire);Car car = new Car(bottom);
从上面可以看出,IoC容器具备以下优点:
资源不由使用资源的双方管理,而是由不使用资源的第三方管理。这样可以带来很多好处。第一:资源集中管理,实现资源的可配置和易于管理。第二:降低了使用资源双方的依赖程度,也就是降低了耦合度。
五、DI介绍
DI,中文翻译为依赖注入。
容器在运行时间,动态的为应用程序提供运行时所依赖的资源,称为依赖注入。
从这方面来看,DI就是IoC思想的一种实现方式。
六、IoC&DI的使用步骤
Spring容器中存储的主要是对象,这些对象,我们称之为“Bean”,我们把这些对象交由Spring管理,我们把这些对象交由Spring管理,由Spring来负责对象的创建和销毁,我们程序只需要告诉Spring,哪些需要存,以及如何从Spring中取出对象。
1、Bean的存储和获取
要将某个对象交给IoC容器管理,需要在类上添加注解@Compent,而Spring框架为了更好的服务web应用程序,提供了更多的注解。
共有两类注解可以实现:
类注解:@Controller、@Service、@Repository、@Component、@Configuration。
方法注解:@Bean
1>@Controller(控制器存储)
使用@Controller存储Bean的代码如下:
@Controller//将对象存储到Spring中public class UserController {public void sayHi(){System.out.println("Hi");}}
如何得知对象已经存储到了Spring容器中呢?
接下来是从Spring容器中获取对象:
@SpringBootApplication
public class IoCApplication {public static void main(String[] args) {ApplicationContext context = SpringApplication.run(IoCApplication.class, args);UserController usercontroler = context.getBean(UserController.class);//从Spring上下文中获取对象usercontroler.sayHi();}}
ApplicationContext翻译过来就是:Spring上下文
因为对象都交给Spring管理了,所以获取对象要从Spring中获取,首先就要先得到Spring的上下文。(这个上下文,就是指当前的运行环境,也可以看作一个容器,容器里存了很多内容,这些内容是当前运行的环境)
获取Bean的其他方式:
Spring容器将会为存入进去的Bean起一个名字,起名字的规则如下:
1.bean名称以小驼峰方式起名:
例如:类名:UserController,Bean名称:userController
类名:AccountManager,Bean名称:accountManager。
2.特殊情况,第一个和第二个都是大写。
例如:UController,Bean名称:UController。
类名:AManager,Bean名称:AManager
根据这个规则来获取Bean:
@SpringBootApplication
public class IoCApplication {public static void main(String[] args) {ApplicationContext context = SpringApplication.run(IoCApplication.class, args);UserController usercontroller1 = context.getBean(UserController.class);//根据Bean的类型获取UserController usercontroller2 = (UserController) context.getBean("userController");//根据Bean名称获取UserController usercontroller3 = context.getBean("userController", UserController.class);//根据Bean名称+类型获取System.out.println(usercontroller1);System.out.println(usercontroller2);System.out.println(usercontroller3);}}
我们看运行结果:
后缀都一样,说明地址相同,地址相同,说明是同一个。
获取bean对象,是父类BeanFactory提供的功能。
ApplicationContext和BeanFactory的联系:
继承关系和功能方面来说:Spring有两个顶级的接口:BeanFactory和ApplicationContext,其中BeanFactory提供了访问容器的基础能力,而ApplicationContext属于BeanFactory的子类,它继承了BeanFactory的所有功能之外,它还有对国际化支持,资源访问支持,以及事件传播等方面的支持。
从性能方面来说:ApplicationContext是一次性加载并初始化所有的Bean对象(空间换时间),而BeanFactory是需要哪个就去加载哪个,因此更轻量化。
2>@Service(服务存储)
使用@Service存储bean的代码如下:
@Service
public class UserService {public void sayHello(String name) {System.out.println("Hello " + name);}
}
读取bean的代码:
@SpringBootApplication
public class IoCApplication {public static void main(String[] args) {ApplicationContext context = SpringApplication.run(IoCApplication.class, args);UserService userService = context.getBean(UserService.class);userService.sayHello("World");}}
当然@Service也可以使用Bean的名称或者名称+类型来获取。
3>@Repository(仓库存储)
使用@Repository存储Bean的代码:
@Repository
public class UserRepository {public void Hello(){System.out.println("Hello");}
}
读取Bean的代码:
@SpringBootApplication
public class IoCApplication {public static void main(String[] args) {ApplicationContext context = SpringApplication.run(IoCApplication.class, args);UserRepository userRepository = context.getBean(UserRepository.class);UserRepository userRepository2 = context.getBean("userRepository", UserRepository.class);userRepository2.Hello();userRepository.Hello();}}
4>@Component(组件存储)
@Component
public class UserComponent {public void sayHello() {System.out.println("Hello");}
}
读取Bean
@SpringBootApplication
public class IoCApplication {public static void main(String[] args) {ApplicationContext context = SpringApplication.run(IoCApplication.class, args);UserComponent userComponent = context.getBean(UserComponent.class);userComponent.sayHello();}}
5>@Configuration(配置存储)
存储Bean
@Configuration
public class UserConfiguration {public void Hello(){System.out.println("Hello");}
}
获取Bean
@SpringBootApplication
public class IoCApplication {public static void main(String[] args) {ApplicationContext context = SpringApplication.run(IoCApplication.class, args);UserConfiguration userConfiguration = context.getBean(UserConfiguration.class);userConfiguration.Hello();}}
2、各个注解的使用场景:
@Controller:控制层,接受请求,对请求进行处理,并进行响应。
@Service:业务逻辑层,处理具体的业务逻辑。
@Repository:数据访问层,也称为持久层,负责数据访问操作。
@Configuration:配置层,处理项目中的一些配置信息。
它们关系图:
查看源码可知,除了Component外,其他四个注解里面都有@Component,说明它们本身就是属于@Component的“子类”,这好比如,@Component是一个普通的杯子,而其他注解则是喝水杯,漱口杯等。
3、方法注解@Bean
类注解是添加到某个类上的,但是存在两个问题:
1.使用外部包的类,没办法添加类注解。
2.一个类,需要多个对象,比如多个数据源。
在这些场景,我们就需要使用方法注解@Bean。
1.使用外部包的类
方法注解的使用方法:
错误使用方法:
public class BeanConfig {@Beanpublic User user() {User user = new User();user.setName("zhangsan");user.setAge(18);return user;}
}
@SpringBootApplication
public class IoCApplication {public static void main(String[] args) {ApplicationContext context = SpringApplication.run(IoCApplication.class, args);User user = context.getBean("user", User.class);System.out.println(user);}}
运行后会报错:
这是因为方法注解要配合类注解使用
在Spring框架的设计中,方法注解@Bean要配合类注解才能将对象正常的存储到Spring容器中,如下代码所示:
@Component
public class BeanConfig {@Beanpublic User user() {User user = new User();user.setName("zhangsan");user.setAge(18);return user;}
}
@SpringBootApplication
public class IoCApplication {public static void main(String[] args) {ApplicationContext context = SpringApplication.run(IoCApplication.class, args);User user = context.getBean("user", User.class);System.out.println(user);}}
这时代码运行就正常了
2.定义多个对象
对于同一个类,如果我们要定义多个对象,就要使用@Bean,因为有时候类是同一个,但是配置不同,指向不同的数据源。
例如下列场景:
@Component
public class BeanConfig {@Beanpublic User user1() {User user = new User();user.setName("zhangsan");user.setAge(18);return user;}@Beanpublic User user2() {User user = new User();user.setName("lisi");user.setAge(19);return user;}
}
但是当定义了多个对象后,根据类型获取对象,获取的是哪个对象呢?
@SpringBootApplication
public class IoCApplication {public static void main(String[] args) {ApplicationContext context = SpringApplication.run(IoCApplication.class, args);User user = context.getBean( User.class);System.out.println(user);}}
这时会报错:
报错信息上显示:期望只有一个匹配,结果发现了两个:user1,user2。
从中可以看出,@Bean注解的bean的名称就是它的方法名。
可以根据名称来获取bean对象:
@SpringBootApplication
public class IoCApplication {public static void main(String[] args) {ApplicationContext context = SpringApplication.run(IoCApplication.class, args);User user1 = (User) context.getBean( "user1");User user2 = (User) context.getBean( "user2");System.out.println(user1);System.out.println(user2);}}
运行结果显示如下:
可以看出,@Bean可以针对一个类来定义多个对象。
3.重命名Bean
可以通过设置name属性给Bean对象进行重命名操作,代码如下:
public User user1() {User user = new User();user.setName("zhangsan");user.setAge(18);return user;}
其中name = 可以省略。
@Bean({"zhangsan","user1"})public User user1() {User user = new User();user.setName("zhangsan");user.setAge(18);return user;}
通过zhangsan来获取User对象:
@SpringBootApplication
public class IoCApplication {public static void main(String[] args) {ApplicationContext context = SpringApplication.run(IoCApplication.class, args);User user1 = (User) context.getBean( "zhangsan");User user2 = (User) context.getBean( "user1");System.out.println(user1);System.out.println(user2);}}
此时”user1“和”zhangsan“都表示user1,如果只需要一个名字,可以删除一个,同时”{}“也可以删除:
@Bean("zhangsan")public User user1() {User user = new User();user.setName("zhangsan");user.setAge(18);return user;}
4.扫描路径
@Bean要想生效,需要被Spring扫描到,如果将Spring类移到某个包中,就会出现错误。
此时再运行就会报错:
意为没有找到bean的名称为zhangsan。
这是因为使用五大注解声明的bean,要想生效,还需要配置扫描路径,让Spring扫描到这些注解,通过@ComponentScan来配置路径。
@ComponentScan({"com.example.ioc"})
@SpringBootApplication
public class IoCApplication {public static void main(String[] args) {ApplicationContext context = SpringApplication.run(IoCApplication.class, args);User user1 = (User) context.getBean( "zhangsan");// User user2 = (User) context.getBean( "user1");System.out.println(user1);// System.out.println(user2);}}
此时就不会报错了,同时”{}“里面可以配置多个包路径。
之前没有配置也可以使用是因为@ComponentScan实际上已经包含在了启动类声明注解中了。
默认的扫描范围是SpringBoot启动类所在包及其子包。
相关文章:
Spring IoC DI入门
一、Spring,Spring Boot和Spring MVC的联系及区别 Spring是另外两个框架的基础,是Java生态系统的核心框架,而SpringMVC是Spring 的子模块,专注于 Web 层开发,基于 MVC 设计模式(模型-视图-控制器ÿ…...
Vala编程语言教程-语言元素
语言元素 方法 在Vala中,函数无论是否定义在类内部均称为方法。下文将统一使用“方法”这一术语。 int method_name(int arg1, Object arg2) {return 1; } 此代码定义了一个名为 method_name 的方法,接受两个参数(一个整数值,一…...
数据可信安全流通实战,隐语开源社区Meetup武汉站开放报名
隐语开源社区 Meetup 系列再出发!2025 年将以武汉为始发站,聚焦"技术赋能场景驱动",希望将先进技术深度融入数据要素流转的各个环节,推动其在实际应用场景中落地生根,助力释放数据要素的最大潜能!…...
windows 10 系统配置Node
目录 什么是Node.js 什么是Npm Node.js环境搭建 下载 解压 配置环境变量 npm配置 如何运行下载的Node.js项目 什么是Node.js 在 Node.js 之前,JavaScript 只能运行在浏览器中,作为网页脚本使用,为网页添加一些特效,或者和…...
2025年Postman的五大替代工具
虽然Postman是一个广泛使用的API测试工具,但许多用户在使用过程中会遇到各种限制和不便。因此,可能需要探索替代解决方案。本文介绍了10款强大的替代工具,它们能够有效替代Postman,成为你API测试工具箱的一部分。 什么是Postman&…...
城市街拍人像自拍电影风格Lr调色教程,手机滤镜PS+Lightroom预设下载!
调色教程 城市街拍人像自拍的电影风格 Lr 调色,是利用 Adobe Lightroom 软件,对在城市街景中拍摄的人像自拍照片进行后期处理,使其呈现出电影画面般独特的视觉质感与艺术氛围。通过一系列调色操作,改变照片的色彩、明暗、对比等元…...
HTML图像标签的详细介绍
1. 常用图像格式 格式特点适用场景JPEG有损压缩,文件小,不支持透明适合照片、复杂图像PNG无损压缩,支持透明(Alpha通道)适合图标、需要透明背景的图片GIF支持动画,最多256色简单动画、低色彩图标WebP谷歌开…...
C++进阶——红黑树的实现
目录 1、红黑树的概念 1.1 红黑树的定义 1.2 红黑树的规则 1.3 为什么没有一条路径会比其他路径长出两倍 1.4 红黑树的性能 2、红黑树的实现 2.1 红黑树的结构 2.2 红黑树的插入 2.2.1 红黑树插入一个值的大概过程 2.2.2 情况1:变色 2.2.3 情况2ÿ…...
Linux 文件操作-标准IO函数1-文件指针、文件缓冲区(行缓冲、全缓冲、无缓冲)的验证
目录 1.文件指针 2.文件缓冲区 2.1 行缓冲 2.2. 全缓冲 2.3. 无缓冲 3. 程序验证: (1)main.c执行test1(),打印hello world,不加 \n 换行符 (2)刷新缓冲区方法1:使用\n (3&am…...
中国历史文化名城分布矢量数据
中国,这片古老而厚重的土地,承载着上下五千年的文明,从北国的冰天雪地到南疆的热带雨林,从东海之滨的波涛汹涌到西域大漠的风沙漫天,无数的历史文化名城如繁星般散布其间。 它们是岁月长河中沉淀下来的瑰宝࿰…...
蓝桥杯十天冲刺-day1(日期问题)
日期问题 基础循环遍历模板 对于蓝桥杯所有的日期问题遍历,都可以使用的上 for(year2000;year<2022;year) for(month1;month<12;month) for(day1;day<31;day) {if(month1||month3||month5||month7||month8||month10||month12);else if(month2){if((year…...
漏洞知识点《Tornado框架中RequestHandler的对象》
Tornado框架中RequestHandler的所有对象 [SUPPORTED_METHODS, _INVALID_HEADER_CHAR_RE, __class__, __delattr__, __dict__, __dir__, __doc__, __eq__, __format__, __ge__, __getattribute__, __gt__, __hash__, __init__, __init_subclass__, __le__, __lt__, __module__,…...
动态规划(6.不同路径II)
题目链接:63. 不同路径 II - 力扣(LeetCode) 解法: 本题为不同路径的变型,只不过有些地方有「障碍物」,只要在「状态转移」上稍加修改就可解决。 状态表示: 对于这种Γ路径类」的问题…...
【算法学习】最小公倍数问题
前言: 求最小公倍数的两种算法: 求两个正整数的最小公倍数,比如3和5的最小公倍数是15,6和8的最小公倍数是24。 本片讨论如何求两个数的最小公倍数,第一种方法是通过最大公约数来求,第二种方法是累加法。 由…...
Spring Boot 整合 Apache Flink 教程
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 Spring Boot 整合 Apache Flink 教程 一、背景与目标 Apache Flink 是一个高性能的分布式流处理框架,而Spring Boot提供了快速构建企业级应用的…...
进制转换(R转十)(1290. 二进制转换十进制、1292. 十六进制转十进制、1291. 八进制转十进制、1405. 小丽找潜在的素数)
题单地址:题单中心-东方博宜OJ 这里以二进制转十进制为例(按位加权求和法) 1290. 二进制转换十进制 问题描述 请将一个 25 位以内的 2 进制正整数转换为 1010 进制! 输入 一个 25 位以内的二进制正整数。 输出 该数对应的…...
通过启用Ranger插件的Hive审计日志同步到Doris做分析
以下是基于Apache Doris的Ranger Hive审计日志同步方案详细步骤,结合审计日志插件与数据导入策略实现: 一、Doris环境准备 1. 创建审计日志库表 参考搜索结果的表结构设计,根据Ranger日志字段调整建表语句: CREATE DATABASE IF…...
Node.js框架Express、Koa、Koa2、Egg 和 NestJS 的对比分析
以下是 Express、Koa、Koa2、Egg 和 NestJS 的对比分析,从多个维度梳理它们的区别和适用场景: 1. 历史背景与定位 框架背景与定位ExpressNode.js 早期框架,灵活轻量,生态丰富,适合快速开发简单应用。KoaExpress 原班团…...
蓝桥杯--冲刺题单--随时更新
冲刺题单 感谢up主溶金落梧桐(uid:40733116),我是看了他的视频后总结的。 简单模拟(循环数组日期进制) 1.蓝桥19723–分布式队列 package datasimulation;import java.util.Scanner;public class Test3 {//计算数组…...
新一代电子数据取证专家 | 苏州龙信信息科技有限公司
本文关键词:电子取证、手机取证、计算机取证、云取证 关于我们About us 苏州龙信信息科技有限公司专注于电子数据取证、大数据、信息安全等领域,核心业务主要涵盖取证工具研发、大数据融合分析、案件技术支持、取证能力培训等,先后为执法部门…...
SSRF 攻击与防御:从原理到落地实践
1. 什么是 SSRF? SSRF(Server-Side Request Forgery) 是一种常见的Web安全漏洞。当服务器提供了某种对外请求的功能,如“URL 参数直接转发请求”,攻击者就可以通过精心构造的URL,让服务器“自己”去访问特…...
socks 协议介绍
SOCKS协议详解 一、基本定义与核心功能 SOCKS(Socket Secure)是一种网络传输协议,主要用于通过代理服务器转发客户端与目标服务器之间的通信请求。其核心功能包括隐藏用户真实IP地址、穿透防火墙限制以及支持多种网络协议(如TCP…...
不使用负压电源,ADC如何测量正负压?
电路图来自ZLinear的开源数据采集板卡DL8884_RFN,是一个比较常见的电压偏置采集法 对电路进行分析,所以说可以先看下采集卡的模拟输入部分的参数如下: 通道数量: 8通道单端输入/4通道差分输入 分辨率: 16位逐次逼近型(SAR) ADC 采样速率: 40…...
服务的拆分数据的迁移
参考: 数据迁移调研...
强推 Maven多镜像源快速切换工具,GUI操作超便捷
引言 在开发过程中,配置Maven的settings.xml文件以优化依赖下载速度是一个常见的需求。然而,手动编辑XML文件不仅繁琐,还容易出错。本文将介绍如何使用Python和Tkinter构建一个图形界面工具,帮助开发者快速、安全地切换Maven镜像…...
Qt6.8实现麦克风音频输入音频采集保存wav文件
一.本文目的 实现在Qt中接收麦克风数据并保存为WAV文件,使用QAudioInput来录音,并使用QFile来保存数据到WAV文件。 开发环境:QT6.8 本文用极简代码实现,核心代码只需不到100行。 二.代码实现...
自动驾驶AEB误触发率评估的必要测试里程估计
文章目录 一 问题背景与行业挑战二 数学建模框架2.1 基础假设2.2 贝叶斯推断流程先验分布选择: 使用 Γ \Gamma Γ分布作为 λ \lambda λ的共轭先验参数 α 0 \alpha_0 α0和 β 0 \beta_0 β0的工程物理意义可靠性判断条件 三 数值求解方法1. 无信息先验场景 ( α 0 1 ,…...
python3 -m http.sever 8080加载不了解决办法
解决方法很多,本文设置各种处理方法,逻辑上需要根据你的自身情况选择 我会告诉你遇到这种问题怎么做,根据具体症状处理 如需转载,标记出处 背景: 1。如图 2.。域名访问不了 http://www.meiduo.site:8080/register.html 上面的域名访问不了,下面的倒是正常 http://127…...
BYU-YOLO数据格式准备
BYU - Locating Bacterial Flagellar Motors 2025(在3D断层扫描图像中定位细菌鞭毛马达) 一、数据介绍 1.竞赛介绍 在本次竞赛中,您的任务是在3D断层扫描图像中找到鞭毛马达的中心位置。断层扫描图像是物体的三维体积表示。每个断层扫描图像作为一个独立的目录提供,其中…...
java NIO中的FileSystems工具类可以读取本地文件系统,ZIP/JAR等,无需解压处理,还可以复制文件
在Java NIO(java.nio.file包)中,FileSystems 是一个工具类,用于操作和管理文件系统。它提供了静态方法来获取或创建文件系统实例,并支持自定义文件系统实现。以下是其核心功能和用法: 1. 核心功能 (1) 获取…...
群体智能优化算法-模拟退火优化算法(Simulated Annealing, SA,含Matlab源代码)
摘要 模拟退火(SA)算法是一种基于物理退火过程的全局优化算法,其核心思想来源于热力学中的退火过程:将材料加热到高温后再缓慢冷却,使其分子结构趋于最低能量状态,从而获得稳定结构。SA 算法利用 Metropol…...
knowledge-微前端(多个前端应用聚合的一个应用架构体系,每个小的应用可独立运行,独立开发,独立部署上线)
1.前言 微前端,将一个大的前端应用拆分为多个小型的,独立开发的前端应用,每一个小型的应用都可以单独的开发,部署和运行。这种结构允许不同的团队使用不同的技术栈来开发应用的不同部分,提高开发的效率与灵活性。 2.实…...
目标检测中归一化的目的?
在目标检测任务中,归一化坐标和尺寸时需要除以图像的宽度和高度,主要有以下几个原因: 1. 统一尺度 不同图像可能具有不同的宽度和高度。通过将坐标和尺寸除以图像的宽度和高度,可以将所有图像的标注信息统一到相同的尺度范围([0, 1])。这使得模型在训练和推理时能够处理…...
HarmonyOs- UIAbility应用上下文
上下文为何物 上下文在计算机科学领域是一个广泛存在的概念。是现代操作系统核心抽象概念之一。其本质是环境信息的结构化封装。 有过开发经验的都知道,当我们在一个系统上进行开发的时候,无论是Android,HarmonyOs,Linux 等等&a…...
鸿蒙开发真机调试:无线调试和USB调试
前言 在鸿蒙开发的旅程中,真机调试堪称至关重要的环节,其意义不容小觑。虽说模拟器能够为我们提供初步的测试环境,方便我们在开发过程中快速预览应用的基本效果,但它与真机环境相比,仍存在诸多差异。就好比在模拟器中…...
【门店租金指定日期区间计算】
目录 一、背景(一)业务场景(二)相关数据支撑 二、计算方法统一封装(一)门店租金数据表格逻辑(二)业务逻辑详细解释(三)具体代码 一、背景 (一&am…...
Dify:开源大模型应用开发平台全解析
从部署到实践,打造你的AI工作流 一、项目简介 Dify 是一款面向开发者和企业的开源大语言模型(LLM)应用开发平台,旨在降低AI应用开发门槛,让用户通过可视化界面快速构建、管理和部署基于大模型的智能应用。其名称寓意“…...
使用DDR4控制器实现多通道数据读写(四)
在创建完DDR4的仿真模型后,我们为了实现异步时钟的读写,板卡中在PL端提供了一组差分时钟,可以用它通过vivado中的Clock Wizard IP核生成多个时钟,在这里生成两个输出时钟,分别作为用户的读写时钟,这样就可以…...
BFS--------N叉树的层序遍历
429. N 叉树的层序遍历 - 力扣(LeetCode) 1.题目解析 给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。 树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(…...
蓝桥杯备考----小贪心+分类讨论问题---Popsicle
这道题有点小贪心的意思,小老鼠每次都想阻碍小猫最多,老鼠每次阻碍猫的话,可能是把0变成9 也可能是把1变成9,再有可能把2变成9,把3变成9,小老鼠的贪心就是尽可能更多的阻碍小猫拿冰棍,所以小老…...
强大的AI网站推荐(第一集)—— Devv AI
网站:Devv AI 号称:最懂程序员的新一代 AI 搜索引擎 博主评价:我的大学所有的代码都是使用它,极大地提升了我的学习和开发效率。 推荐指数:🌟🌟🌟🌟🌟&#x…...
【问题解决】Postman 测试报错 406
现象 Tomcat 日志 org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.logException Resolved org.springframework.web.HttpMediaTypeNotAcceptableException: No acceptable representation HTTP状态 406 - 不可接收 的报错,核心原因 客…...
互联网it常用抓包工具说明
一、引言 在互联网 IT 领域,无论是网络故障排查、安全检测,还是开发调试,抓包工具都发挥着举足轻重的作用。 当网络出现故障,比如网页加载缓慢、应用无法连接服务器时,抓包工具可以帮助我们捕获网络数据包࿰…...
RS485总线加终端电阻可能存在的问题
目录 1、降低驱动信号幅值 2、增大通信线压降 3、增大收发器功耗 4、降低总线空闲时的差分电压 尽管终端电阻能有效减少信号反射、提高信号质量,但它也引入了一系列问题,需要在设计中谨慎考虑。以下是几个常见问题的详细分析: 1、降低驱…...
在 Linux 系统上部署 Deepseek AI 的全面指南
对于所有希望亲身体验 AI 魅力的玩家来说,本文将提供一个详尽的教程,指导你在 Linux 系统上部署 Deepseek AI。无论你是技术小白还是有一定基础的用户,都能轻松跟随本文完成部署。 一、关于 Ollama Ollama 是一款功能强大的开源应用&am…...
Docker下载,包含Win、Mac
介绍 Docker 是一种开源的容器化平台,通过操作系统级虚拟化技术实现应用的快速开发、部署和运行。以下从多个维度对 Docker 进行详细介绍: 一、Docker 的核心概念与功能 容器化技术 Docker 利用 Linux 内核的容器隔离技术(如 Cgroups 和 Nam…...
算法|2025最强优化算法
根据2025年的最新研究进展,以下是被广泛认可的几种“最强优化算法”,它们在理论创新、性能表现和应用范围上均有显著突破: 一、植物根茎生长优化算法(PRGO) 1 - 核心原理:灵感来源于植物根系结构…...
Prime: 1靶场渗透测试
Prime: 1 来自 <Prime: 1 ~ VulnHub> 1,将两台虚拟机网络连接都改为NAT模式 2,攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.182,靶场IP192.168.23.207 3,对靶机进行端口服务探测…...
html相关常用语法
html相关常用语法 HTML(HyperText Markup Language)即超文本标记语言,是用于创建网页的标准标记语言 HTML使用标记语言描述Web页面的结构 HTML元素是HTML页面的建构快 HTML元素通过标签tag来表示 HTML标签是“标题”、”段落“、”表格“等内…...
2025年R1 快开门式压力容器操作证考试题目及答案解析
R1 快开门式压力容器操作证考试题目及答案: 单选题 1、快开门式压力容器的快开门(盖)应设计安全联锁装置并应具有( )功能。 A. 当快开门达到预定关闭部位方能升压运行的安全联锁功能 B. 当压力容器的内部压力完全释…...