Spring 中存储 Bean 的相关注解

Bean的存
IoC控制反转,就是将对象的控制权交给Spring的IOC容器,由IOC容器创建及管理对象。
也就是bean的存储
类注解:五大注解
@Controller(控制器存储)
@Service(服务存储)
@Component(组件存储)
@Repository(仓库存储)
@Configuration(配置存储)
五大注解的存的过程都近似一样的,因此,下面我们就只介绍Controller的,其余的类似
@Controller(控制器存储)
使⽤@Controller存储bean的代码如下所⽰:
@Controller // 将对象存储到 Spring 中
public class UserController {public void doController(){System.out.println("do controller");}
}
如何观察这个对象已经存在Spring容器当中了呢?
接下来我们学习如何从Spring容器中获取对象
@SpringBootApplication
public class SpringIocDemoApplication {public static void main(String[] args) {//获取Spring上下⽂对象ApplicationContext context = SpringApplication.run(SpringIocDemoApplicatio//从Spring上下⽂中获取对象UserController userController = context.getBean(UserController.class);//使⽤对象userController.doController();}
}
ApplicationContext翻译过来就是:Spring上下⽂,因为对象都交给Spring管理了,所以获取对象要从Spring中获取,那么就得先得到Spring的上下
这个上下⽂,就是指当前的运⾏环境,也可以看作是⼀个容器,容器⾥存了很多内容,这些内容是当前运⾏的环境
观察运⾏结果,发现成功从Spring中获取到Controller对象,并执⾏Controller的doController⽅法

如果把@Controller删掉,再观察运⾏结果

报错信息显⽰:找不到类型是:com.example.demo.controller.UserController的bean
获取bean对象的其他⽅式
上述代码是根据类型来查找对象,如果Spring容器中,同⼀个类型存在多个bean的话,怎么来获取呢?
ApplicationContext也提供了其他获取bean的⽅式,ApplicationContext获取bean对象的功能,是⽗类BeanFactory提供的功能.

常⽤的是上述1,2,4种,这三种⽅式,获取到的bean是⼀样的
其中1,2种都涉及到根据名称来获取对象.bean的名称是什么呢?
Spring bean是Spring框架在运⾏时管理的对象,Spring会给管理的对象起⼀个名字.
⽐如学校管理学⽣,会给每个学⽣分配⼀个学号,根据学号,就可以找到对应的学⽣.
Spring也是如此,给每个对象起⼀个名字,根据Bean的名称(BeanId)就可以获取到对应的对象.
Bean的命名约定
我们看下官⽅⽂档的说明:BeanOverview::SpringFramework
程序开发⼈员不需要为bean指定名称(BeanId),如果没有显式的提供名称(BeanId),Spring容器将为该bean⽣成唯⼀的名称.
命名约定使⽤Java标准约定作为实例字段名.也就是说,bean名称以⼩写字⺟开头,然后使⽤驼峰式⼤⼩写.
⽐如
类名:UserController,Bean的名称为:userController
类名:AccountManager,Bean的名称为:accountManager
类名:AccountService,Bean的名称为:accountService
也有⼀些特殊情况,当有多个字符并且第⼀个和第⼆个字符都是⼤写时,将保留原始的⼤⼩写.这些规则与java.beans.Introspector.decapitalize(Spring在这⾥使⽤的)定义的规则相同.
⽐如
类名:UController,Bean的名称为:UController
类名:AManager,Bean的名称为:AManager
根据这个命名规则,我们来获取Bean
ApplicationContext context = SpringApplication.run(DemoApplication.class, args);UserController userController = context.getBean(UserController.class);userController.doController();System.out.println(userController);UserController userController1 = (UserController)context.getBean("userController");userController1.doController();System.out.println(userController1);UserController userController2 = context.getBean("userController", UserController.class);userController2.doController();System.out.println(userController2);

地址⼀样,说明对象是⼀个
获取bean对象,是⽗类BeanFactory提供的功能
ApplicationContextVSBeanFactory(常⻅⾯试题)
• 继承关系和功能⽅⾯来说:Spring容器有两个顶级的接⼝:BeanFactory和
ApplicationContext。其中BeanFactory提供了基础的访问容器的能⼒,⽽
ApplicationContext属于BeanFactory的⼦类,它除了继承了BeanFactory的所有功能之外,它还拥有独特的特性,还添加了对国际化⽀持、资源访问⽀持、以及事件传播等⽅⾯的⽀持.
• 从性能⽅⾯来说:ApplicationContext是⼀次性加载并初始化所有的Bean对象,⽽
BeanFactory是需要那个才去加载那个,因此更加轻量.(空间换时间)
为什么要这么多类注解?
这个也是和咱们前⾯讲的应⽤分层是呼应的.让程序员看到类注解之后,就能直接了解当前类的⽤途.
• @Controller:控制层,接收请求,对请求进⾏处理,并进⾏响应.
• @Servie:业务逻辑层,处理具体的业务逻辑.
• @Repository:数据访问层,也称为持久层.负责数据访问操作
• @Configuration:配置层.处理项⽬中的⼀些配置信息.
这和每个省/市都有⾃⼰的⻋牌号是⼀样的.
⻋牌号都是唯⼀的,标识⼀个⻋辆的.但是为什么还需要设置不同的⻋牌开头呢.
⽐如陕西的⻋牌号就是:陕X:XXXXXX,北京的⻋牌号:京X:XXXXXX,甚⾄⼀个省不同的县区也是不同的,⽐如西安就是,陕A:XXXXX,咸阳:陕B:XXXXXX,宝鸡,陕C:XXXXXX,⼀样.
这样做的好处除了可以节约号码之外,更重要的作⽤是可以直观的标识⼀辆⻋的归属地.
程序的应⽤分层,调⽤流程如下:

类注解之间的关系
查看 @Controller / @Service / @Repository / @Configuration 等注解的源码发
现:


其实这些注解⾥⾯都有⼀个注解@Component,说明它们本⾝就是属于@Component 的“⼦类”.
@Component 是⼀个元注解,也就是说可以注解其他类注解,如 @Controller ,@Service ,@Repository 等.这些注解被称为 @Component 的衍⽣注解.
@Controller ,@Service 和 @Repository ⽤于更具体的⽤例(分别在控制层,业务逻辑层,持久化层),在开发过程中,如果你要在业务逻辑层使⽤ @Component 或@Service,显然@Service是更好的选择
方法注解:@Bean
类注解是添加到某个类上的,但是存在两个问题:
- 使⽤外部包⾥的类,没办法添加类注解
- ⼀个类,需要多个对象,⽐如多个数据源
这种场景,我们就需要使⽤⽅法注解@Bean
我们先来看看⽅法注解如何使⽤:
@Beanpublic UserInfo userInfo1(){UserInfo userInfo = new UserInfo();userInfo.setId(1);userInfo.setAge(26);userInfo.setName("zhangsan");return userInfo;}
然⽽,当我们写完以上代码,尝试获取bean对象中的user时却发现,根本获取不到:
UserInfo contextBean = context.getBean(UserInfo.class);System.out.println(contextBean);

这是为什么呢?
⽅法注解要配合类注解使⽤
在Spring框架的设计中,⽅法注解 @Bean 要配合类注解才能将对象正常的存储到Spring容器中,
如下代码所⽰:
@Controller
public class BeanController {@Beanpublic UserInfo userInfo1(){UserInfo userInfo = new UserInfo();userInfo.setId(1);userInfo.setAge(26);userInfo.setName("zhangsan");return userInfo;}}

定义多个对象
对于同⼀个类,如何定义多个对象呢?
⽐如多数据源的场景,类是同⼀个,但是配置不同,指向不同的数据源.
我们看下@Bean的使⽤
@Beanpublic UserInfo userInfo1(){UserInfo userInfo = new UserInfo();userInfo.setId(1);userInfo.setAge(26);userInfo.setName("zhangsan");return userInfo;}@Beanpublic UserInfo userInfo2(){UserInfo userInfo = new UserInfo();userInfo.setName("lisi");userInfo.setId(2);userInfo.setAge(39);return userInfo;}

报错信息显⽰:期望只有⼀个匹配,结果发现了两个,user1,user2
从报错信息中,可以看出来,@Bean注解的bean,bean的名称就是它的⽅法名
接下来我们根据名称来获取bean对象
UserInfo userInfo1 = (UserInfo)context.getBean("userInfo1");System.out.println(userInfo1);UserInfo userInfo2 = (UserInfo)context.getBean("userInfo2");System.out.println(userInfo2);

重命名 Bean
可以通过设置name属性给Bean对象进⾏重命名操作,如下代码所⽰:
@Bean(name = {"u1","userInfo1"})public UserInfo userInfo1(){UserInfo userInfo = new UserInfo();userInfo.setId(1);userInfo.setAge(26);userInfo.setName("zhangsan");return userInfo;}@Bean(name = {"u2", "userInfo2"})public UserInfo userInfo2(){UserInfo userInfo = new UserInfo();userInfo.setName("lisi");userInfo.setId(2);userInfo.setAge(39);return userInfo;}
UserInfo userInfo1 = (UserInfo)context.getBean("u1");System.out.println(userInfo1);UserInfo userInfo2 = (UserInfo)context.getBean("u2");System.out.println(userInfo2);

name={}可以省略,如下代码所⽰:
@Bean({"u1","userInfo1"})
只有⼀个名称时,{}也可以省略,如:
@Bean("u1")
注意:类注解的五大注解也可以使用该方法进行重命名操作
Bean的取
上⾯我们讲解了控制反转IoC的细节,接下来呢,我们学习依赖注⼊DI的细节,依赖注⼊是⼀个过程,是指IoC容器在创建Bean时,去提供运⾏时所依赖的资源,⽽资源指的就是对象.简单来说,就是把对象取出来放到某个类的属性中.在⼀些⽂章中,依赖注⼊也被称之为"对象注⼊",“属性装配”,具体含义需要结合⽂章的上下⽂来理解
关于依赖注⼊,Spring也给我们提供了三种⽅式:
- 属性注⼊(Field Injection)
- 构造⽅法注⼊(Constructor Injection)
- Setter注⼊(Setter Injection)
- 接下来,我们分别来看。
下⾯我们按照实际开发中的模式,将Service类注⼊到Controller类中
属性注⼊
属性注⼊是使⽤@Autowired实现的,将Service类注⼊到Controller类中。
Service类的实现代码如下:
@Service
public class UserService {public void doService(){System.out.println("do service");}
}
Controller类的实现代码如下:
@Controller
public class UserController {@Autowiredprivate UserService userService;public void doController(){userService.doService();System.out.println("do controller");}
}
获取Controller中的doController⽅法
ApplicationContext context = SpringApplication.run(DemoApplication.class, args);UserController userController = context.getBean(UserController.class);userController.doController();

去掉@Autowired,再运⾏⼀下程序看看结果

构造⽅法注⼊
@Controller
public class UserController {
// @Autowiredprivate UserService userService;public UserController(UserService userService) {this.userService = userService;}public void doController(){userService.doService();System.out.println("do controller");}
}

注意事项:如果类只有⼀个构造⽅法,那么@Autowired注解可以省略;如果类中有多个构造⽅法,
那么需要添加上@Autowired来明确指定到底使⽤哪个构造⽅法
@Controller
public class UserController {
// @Autowiredprivate UserService userService;public UserController() {}public UserController(UserService userService) {this.userService = userService;}public void doController(){userService.doService();System.out.println("do controller");}
}

@Controller
public class UserController {
// @Autowiredprivate UserService userService;public UserController() {}
@Autowiredpublic UserController(UserService userService) {this.userService = userService;}public void doController(){userService.doService();System.out.println("do controller");}
}

Setter注⼊
Setter注⼊和属性的Setter⽅法实现类似,只不过在设置set⽅法的时候需要加上@Autowired注解,如下代码所⽰:
@Controller
public class UserController {
// @Autowiredprivate UserService userService;
@Autowiredpublic void setUserService(UserService userService) {this.userService = userService;}public void doController(){userService.doService();System.out.println("do controller");}
}

三种注⼊优缺点分析
属性注⼊
◦ 优点:简洁,使⽤⽅便;
◦ 缺点:
▪ 1.只能⽤于IoC容器,如果是⾮IoC容器不可⽤,并且只有在使⽤的时候才会出现NPE(空指针异常)
▪ 不能注⼊⼀个Final修饰的属性
• 构造函数注⼊(Spring4.X推荐)
◦ 优点:
▪ 1.可以注⼊final修饰的属性
▪ 2.注⼊的对象不会被修改
▪ 3.依赖对象在使⽤前⼀定会被完全初始化,因为依赖是在类的构造⽅法中执⾏的,⽽构造⽅法是在类加载阶段就会执⾏的⽅法。
▪ 4.通⽤性好,构造⽅法是JDK⽀持的,所以更换任何框架,他都是适⽤的
◦ 缺点:
▪ 注⼊多个对象时,代码会⽐较繁琐
• Setter注⼊(Spring3.X推荐)
◦ 优点:⽅便在类实例之后,重新对该对象进⾏配置或者注⼊
◦ 缺点:
▪ 1.不能注⼊⼀个Final修饰的属性
▪ 2.注⼊对象可能会被改变,因为setter⽅法可能会被多次调⽤,就有被修改的⻛险
更多DI相关内容参考:Dependencies :: Spring Framework
@Autowired存在问题
当同⼀类型存在多个bean时,使⽤@Autowired会存在问题
@Bean("u1")public UserInfo userInfo1(){UserInfo userInfo = new UserInfo();userInfo.setId(1);userInfo.setAge(26);userInfo.setName("zhangsan");return userInfo;}@Bean(name = {"u2", "userInfo2"})public UserInfo userInfo2(){UserInfo userInfo = new UserInfo();userInfo.setName("lisi");userInfo.setId(2);userInfo.setAge(39);return userInfo;}
@Controller
public class UserController {
// @Autowiredprivate UserService userService;@Autowiredpublic void setUserService(UserService userService) {this.userService = userService;}@Autowiredprivate UserInfo userInfo;public void doController(){userService.doService();System.out.println("do controller");System.out.println(userInfo);}
}

如何解决上述问题呢?Spring提供了以下⼏种解决⽅案:
@Primary
使⽤@Primary注解:当存在多个相同类型的Bean注⼊时,加上@Primary注解,来确定默认的实现
@Primary@Bean("u1")public UserInfo userInfo1(){UserInfo userInfo = new UserInfo();userInfo.setId(1);userInfo.setAge(26);userInfo.setName("zhangsan");return userInfo;}

@Qualifier
使⽤@Qualifier注解:指定当前要注⼊的bean对象。在@Qualifier的value属性中,指定注⼊的bean的名称
@Qualifier注解不能单独使⽤,必须配合@Autowired使⽤
@Controller
public class UserController {
// @Autowiredprivate UserService userService;@Autowiredpublic void setUserService(UserService userService) {this.userService = userService;}@Qualifier("u2")@Autowiredprivate UserInfo userInfo;public void doController(){userService.doService();System.out.println("do controller");System.out.println(userInfo);}
}

@Resource
使⽤@Resource注解:是按照bean的名称进⾏注⼊。通过name属性指定要注⼊的bean的名称
@Controller
public class UserController {
// @Autowiredprivate UserService userService;@Autowiredpublic void setUserService(UserService userService) {this.userService = userService;}
// @Qualifier("u2")
// @Autowired@Resource(name = "u1")private UserInfo userInfo;public void doController(){userService.doService();System.out.println("do controller");System.out.println(userInfo);}
}

⾯试题:@Autowird与@Resource的区别
• @Autowired是spring框架提供的注解,⽽@Resource是JDK提供的注解
• @Autowired默认是按照类型注⼊,⽽@Resource是按照名称注⼊
@Autowired和@Resource的区别
• @Autowired来⾃于Spring,⽽@Resource来⾃于JDK的注解
• 使⽤时设置的参数不同:相⽐于@Autowired来说,@Resource⽀持更多的参数设置,例如name设置,根据名称获取Bean
bean的命名
1)五⼤注解存储的bean
①前两位字⺟均为⼤写,bean名称为类名
②其他的为类名⾸字⺟⼩写
③通过value属性设置 @Controller(value = “user”)
2)@Bean注解存储的bean
①bean名称为⽅法名
②通过name属性设置 @Bean(name = {“u1”,“user1”})
相关文章:
Spring 中存储 Bean 的相关注解
Bean的存 IoC控制反转,就是将对象的控制权交给Spring的IOC容器,由IOC容器创建及管理对象。 也就是bean的存储 类注解:五大注解 Controller(控制器存储) Service(服务存储) Component(组件存储…...
Proteus下仿真AT89C51单片机串行口的问题
在Proteus下仿真AT89C51单片机的串行口的时候,Proteu不同版本下差别较大。 同样的程序,在7.8的老版本(7.8版本的原理图仿真软件名称是ISIS 7 Professional)下仿真串行口,收发均正常。但是,在8.13版…...
java学习part17
110-面向对象(高级)-关键字final的使用及真题_哔哩哔哩_bilibili 1.概念 tips:java里有const关键字,但是用于保留字,不会使用,目前没有意义。 final变量没有默认赋值,只能在以下三个地方赋值,且只能赋值一…...
Centos 7、Debian、Ubuntu中tree指令的检查与下载
目录 前言 Centos 7中检查tree指令是否安装的两种办法 which指令检查 查看当前版本指令 不同版本下安装tree指令 Centos 7的发行版本 重点 Debian的发行版本 重点 Ubuntu的发行版本 重点 前言 在大多数Linux发行版中,tree命令通常不是默认安装的指令。…...
深拷贝函数
<script>//深拷贝:// 对于基本数据类型来说,拷贝的是栈// 对于复杂数据类型也就是对象来说,拷贝的是堆。深拷贝后引用地址是不同的function deepClone(val){// val是数组if(Array.isArray(val)){let cloneArr []for(let i 0;i < v…...
python小数据分析小结及算法实践集锦
在缺乏大量历史数据的新兴技术和产业中,商业分析可能会面临一些挑战。然而,有一些技术和方法可以帮助分析者在数据不充分的情况下进行科学化商业分析,并为决策提供支持。 1. 当面对缺乏大量历史数据的新兴技术和产业时所采常用的技术和方法 …...
【docker系列】docker高阶篇
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
SpringBoot校验List失效解决方法
文章目录 SpringBoot校验List失效解决方法附:校验基本数据类型和String类型的方法参数时也需要在类上加Validated SpringBoot校验List失效解决方法 失效场景示例代码: RestController RequestMapping("/v1/jx/flowSummary") Slf4j public cl…...
【KubeSphere】基于AWS在 Linux 上以 All-in-One 模式安装 KubeSphere
文章目录 一、实验配置说明二、实验准备工作1.确认系统版本2. 修改网络DNS3. 关闭SELINUX4. 关闭防火墙 三、实验依赖项安装四、下载 KubeKey五、一键化安装部署六、验证安装结果七、登录KubeSphere管理控制台八、参考链接 一、实验配置说明 本实验基于AWS启动一台新实例&…...
3.一维数组——输入十个数,输出其中最大(小)数
文章目录 前言一、题目描述 二、题目分析 三、解题 程序运行代码 前言 本系列为一维数组编程题,点滴成长,一起逆袭。 一、题目描述 输入十个数,输出其中最大(小)数 二、题目分析 打擂台法:maxa[0]; 最大…...
mysql高级知识点
一、mysql架构 连接层:负责接收客户端的连接请求,可以进行授权、认证(验证账号密码)。服务层:负责调用sql接口,对sql语法进行解析,对查询进行优化,缓存。引擎层:是真正进行执行sql的地方&#x…...
python pdf转txt文本、pdf转json
文章目录 一、前言二、实现方法1. 目录结构2. 代码 一、前言 此方法只能转文本格式的pdf,如果是图片格式的pdf需要用到ocr包,以后如果有这方面需求再加这个方法 二、实现方法 1. 目录结构 2. 代码 pdf2txt.py 代码如下 #!/usr/bin/env python # -*- …...
LabVIEW中如何达到NI SMU最大采样率
LabVIEW中如何达到NI SMU最大采样率 NISMU的数字化仪功能对于捕获SMU详细的瞬态响应特性或表征待测设备(DUT)响应(例如线性调整率和负载调整率)至关重要。没有此功能,将需要一个外部示波器。 例如,假设在…...
redis运维(二十)redis 的扩展应用 lua(二)
一 redis 的扩展应用 lua redis lua脚本语法 ① 什么是脚本缓存 redis 缓存lua脚本 说明: 重启redis,脚本缓存会丢失 下面讲解 SCRIPT ... 系列 SCRIPT ② LOAD 语法:SCRIPT LOAD lua代码 -->载入一个脚本,只是预加载,不执行思考1࿱…...
Docker ps命令
docker ps:列出容器。 语法: docker ps [OPTIONS]OPTIONS说明: -a:显示所有的容器,包括未运行的。 -f:根据条件过滤显示的内容。 --format:指定返回值的模板文件。 -l:显示最近…...
前端实现留言板
留言板的主要使用场景是为用户提供一个在网站或应用上留言的平台,这样他们可以分享自己的想法、意见或建议。这些留言可以帮助开发者收集用户反馈,从而改进产品或服务。 使用HTML、CSS和JavaScript实现的留言板:这种方法的优点是简单易实现&a…...
【二叉排序树(Binary Sort Tree)又称为二叉搜索树,二叉查找树,)二叉排序树的操作----插入生成删除】
文章目录 二叉排序树(Binary Sort Tree)又称为二叉搜索树,二叉查找树,)二叉树的查找分析二叉排序树的操作----插入二叉排序树的操作----生成二叉排序树的操作----删除 二叉排序树(Binary Sort Tree…...
Verilog基础:时序调度中的竞争(二)
相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 作为一个硬件描述语言,Verilog HDL常常需要使用语句描述并行执行的电路,但其实在仿真器的底层,这些并行执行的语句是有先后顺序…...
云原生周刊:Kubernetes 1.29 中的删除、弃用和主要更改 | 2023.11.27
开源项目推荐 Orphaned ConfigMaps 该版本库包含一个脚本,用于识别 Kubernetes 命名空间中的孤立的配置映射。孤立的配置映射是指那些未被命名空间中的任何活动 Pod 或容器引用的配置映射。 Kubernetes Multi Cooker 该项目包含一个小型 Kubernetes 控制器&…...
深入理解计算机中的程序
目录 程序的存储 程序的编译过程 各位宝宝好,我们这次从计算机底层来讲一下程序是如何存储,编译的 程序的存储 我们拿一个最简单的程序来举个例子: #include<stdio.h> int main() {printf("hello world");return 0; } …...
ROS新手必看:5分钟搞定usb_cam相机标定(附棋盘格下载)
ROS实战:从零完成USB摄像头标定的完整指南 在机器人视觉系统中,相机标定是确保测量精度的基础步骤。许多ROS初学者往往在第一步就遇到障碍——要么找不到合适的标定工具,要么被复杂的参数配置搞得晕头转向。本文将带你用最直接的方式完成整个…...
Build-A-Large-Language-Model-CN:大语言模型训练中的常见问题与解决方案
Build-A-Large-Language-Model-CN:大语言模型训练中的常见问题与解决方案 【免费下载链接】Build-A-Large-Language-Model-CN 《Build a Large Language Model (From Scratch)》是一本深入探讨大语言模型原理与实现的电子书,适合希望深入了解 GPT 等大模…...
MATLAB伯德图进阶:精准标注谐振点与-3dB带宽的实现方法
1. 伯德图基础与谐振点概念解析 伯德图是控制系统工程师最常用的频率特性分析工具之一,它由幅频特性和相频特性两条曲线组成。我第一次接触伯德图是在研究生阶段的自动控制原理课上,当时教授在黑板上画出的那条神奇的曲线,让我对频率响应分析…...
Transformer算子实现及高阶可视化
支持: 输入任意源句子 / 目标句子任意 head 数任意层数任意 d_model / d_ffencoder self-attentiondecoder masked self-attentioncross-attention逐层热力图输出逐层逐帧动画输出(GIF / MP4) 下载脚本: transformer_attention_…...
基于单片机的人脸识别门禁系统(有完整资料)
资料查找方式:特纳斯电子(电子校园网):搜索下面编号即可编号:T5912205M设计简介:本设计是基于单片机的人脸识别门禁系统,主要实现以下功能:1、人脸识别并进行红外测温 2、人脸识别并…...
STM32CubeMX+Keil5+ESP8266:基于HAL库的物联网设备快速联网实战
1. 环境准备与工具链搭建 第一次接触STM32ESP8266组合开发时,我花了整整两天时间才把开发环境理顺。现在回想起来,其实只需要三个核心工具:STM32CubeMX、Keil MDK-ARM和串口调试助手。建议使用Keil5版本,它对HAL库的支持最稳定。我…...
别再乱用List了!Unity中Queue的5个高效应用场景对比
Unity中Queue的5个高效应用场景:性能对比与实战指南 在Unity开发中,数据结构的选择往往决定了游戏性能的上限。很多开发者习惯性地使用List来解决所有问题,却忽视了Queue在特定场景下的性能优势。本文将深入分析Queue的底层原理,并…...
终极指南:东南大学论文模板的完整解决方案,高效完成毕业论文格式排版
终极指南:东南大学论文模板的完整解决方案,高效完成毕业论文格式排版 【免费下载链接】SEUThesis 项目地址: https://gitcode.com/gh_mirrors/seu/SEUThesis SEUThesis是东南大学官方认证的论文模板库,为本科生、硕士生和博士生提供一…...
收藏!小白程序员轻松入门大模型,掌握AI领导力升职加薪必备
AI正颠覆全行业,要求原地升级AI。程序员需从执行者转变成AI领导者,提升AI领导力。未来行业可能两头重(小白AI和架构师AI),初中级工程师需提升专业能力和AI领导力。文章推荐NLP、CV、大模型算法、大模型部署等方向&…...
LCD12864带字库开发实战:从引脚配置到中文显示
1. LCD12864带字库模块基础认知 第一次拿到这种带字库的液晶屏时,我盯着那20个引脚发呆了半小时。后来才发现,真正需要关注的只有7-8个关键引脚。这种128x64点阵的液晶模块最吸引人的地方在于它内置了GB2312字库,这意味着我们不需要自己造轮子…...
