使用Spring的五大类注解读取和存储Bean
目录
1.存储Bean对象的注解
1.1 五大类注解
1.2 方法注解
1.3添加注解的依赖
2.注解的使用
2.1 controller注解
2. 2Service注解
2.3.Resopsitory注解
2.4Component注解
2.5Configuration注解
2.6 注解之间的关系
3.方法注解
3.1 方法注解要配合类注解来使用。
3.2 重命名Bean
4.获取Bean对象(对象装配)
4.1属性注⼊(常用)
4.2构造⽅法注⼊(推荐使用)
4.3Setter 注⼊
4.4三种注⼊优缺点分析
4.5 @Resource:另⼀种注⼊关键字
4.6 @Autowired 和 @Resource 区别
4.7 解决同⼀类型多个 Bean 的报错:
1.存储Bean对象的注解
两种:五大类注解和方法注解
1.1 五大类注解
@Controller :(控制器:验证用户(广义用户包括前端)请求的数据正确性)(类似于安保系统)
@Service :(服务:服务层,用来编排和调度具体执行方法的,(客服中心))
@Repository: (持久层:和数据库的交互;执行者) ==DAO层(Date Accsess Object)数据访问层
@Component :(组件:(工具类))
@Configuration :(配置项:项目当中的一些配置,存储项目当中的一些注解)
1.2 方法注解
@Bean
1.3添加注解的依赖
Spring设计理念:约定大于配置,小驼峰的形式
在resources文件夹下创建spring.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"xmlns:content="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 扫描包的地址--><content:component-scan base-package="com.java.demo"></content:component-scan>
</beans>

2.注解的使用
1.添加spring依赖(pom.xml)

<dependencies><!-- https://mvnrepository.com/artifact/org.springframework/spring-context --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.13</version></dependency></dependencies>
2.添加启动类

2.1 controller注解
package com.java.demo.controller;import org.springframework.stereotype.Controller;@Controller //将当前类存储到spring中
public class StudentController {public void sayHi(){System.out.println("do studentController sayHi()");}
}
import com.java.demo.controller.StudentController;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App {public static void main(String[] args) {//1.得到Spring对象ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");//2.得到bean对象StudentController studentController =context.getBean("studentController",StudentController.class);//3.使用beanstudentController.sayHi();}
}

注意:
默认情况:原类名首字母小写就能读取到Bean对象;
特例:原类名如果首字母和第二字母都是大写的情况下,那么bean名称就是原类名;
2. 2Service注解
package com.java.demo.service;
import org.springframework.stereotype.Service;
@Service
public class StudentService {public void sayHi(){System.out.println("StudentService sayHi()");}
}
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
StudentService studentService =context.getBean("studentService",StudentService.class);
studentService.sayHi();

2.3.Resopsitory注解
import org.springframework.stereotype.Repository;
@Repository
public class StudentRepository {public void sayhi(){System.out.println("StudentRepository sayhi");}
}
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");StudentRepository studentRepository =context.getBean("studentRepository",StudentRepository.class);
studentRepository.sayhi();

2.4Component注解
import org.springframework.stereotype.Component;
@Component
public class StudentComponent {public void sayhi(){System.out.println("StudentComponent sayhi");}
}
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
StudentComponent studentComponent =context.getBean("studentComponent",StudentComponent.class);
studentComponent.sayhi();

2.5Configuration注解
import org.springframework.context.annotation.Configuration;
@Configuration
public class StudentConfiguration {public void sayhi(){System.out.println("StudentConfiguration sayhi");}
}
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
StudentConfiguration studentConfiguration =context.getBean("studentConfiguration",StudentConfiguration.class);
studentConfiguration.sayhi();

2.6 注解之间的关系
@Controller / @Service / @Repository / @Configuration 等注解的源码,他们属于@Component 的“⼦类”。
3.方法注解
类注解是添加到某个类上的,⽽⽅法注解是放到某个⽅法上的。
3.1 方法注解要配合类注解来使用。
在 Spring 框架的设计中,⽅法注解 @Bean 要配合类注解才能将对象正常的存储到 Spring 容器中,如下代码所示:
@Component
public class Users {
@Bean
public User user1() {
User user = new User();
user.setId(1);
user.setName("Java");
return user;
}
}
3.2 重命名Bean
可以通过设置 name 属性给 Bean 对象进⾏重命名操作,如下代码所示:
@Component
public class Users {
@Bean(name = {"u1"})
public User user1() {
User user = new User();
user.setId(1);
user.setName("Java");
return user;
}
}
name 其实是⼀个数组,⼀个 bean 可以有多个名字:
@Bean(name = {"u1", "us1"})
public User user1() {
User user = new User();
user.setId(1);
user.setName("Java");
return user;
}

问题:当@Bean使用了重命名之后,那么默认的方法名是否还能获取对象?
答案:不能,当给@Bean对象重命名之后,默认的使用方法名获取对象的方式就不能使用了。
4.获取Bean对象(对象装配)
获取对象装配的方法:
1. 属性注⼊
2. 构造⽅法注⼊
3. Setter 注⼊
4.1属性注⼊(常用)
属性注⼊是使⽤ @Autowired 实现的,将 Service 类注⼊到 Controller 类中。
优点:简单
缺点:
1.没办法实现final修饰的变量注入
2.兼容性不好:只适用于IoC容器
3.风险点:因为写法简单,所以违背单一设计原则的概论更大。
4.2构造⽅法注⼊(推荐使用)
构造方法注入(Spring官方推荐的注入方式),可以不加@Autowired。
特点:如果当前类中只有一个构造方法的话,那么@Autowired注解可以省略;
优点:
1.可以注入一个不可变的对象(使用了final修饰的对象);
2.注入的对象不会被修改(构造方法只能执行一次);
3.构造方法注入可以保证注入对象完全被初始化;
4.构造方法的兼容性(通用性)更好;
4.3Setter 注⼊
Setter 注⼊和属性的 Setter ⽅法实现类似,只不过在设置 set ⽅法的时候需要加上 @Autowired 注
解
优点:Setter注入非常符合单一设计原则(每个方法只传递一个对象)。
缺点:
1.没办法实现final修饰的变量注入
2.使用setter注入的对象,对象可能会被修改
示例代码:
package com.java.demo.controller;import com.java.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;import javax.annotation.Resource;@Controller
public class UserController {//1.属性注入@Autowired //注入对象@Resourceprivate UserService userService;//2.Setter注入private UserService userService;@Autowired@Resourcepublic void setUserService(UserService userService) {this.userService = userService;}//3.构造方法注入private final UserService userService;@Autowired//@Resource //不能用在构造方法上public UserController(UserService userService) {this.userService = userService;}public void sayHi(){System.out.println("com.java.demo -> do UserController sayHi()");userService.sayHi();userService.age = 20;userService.sayHi();}
}
4.4三种注⼊优缺点分析
1.属性注⼊的优点是简洁,使⽤⽅便;缺点是只能⽤于 IoC 容器,如果是⾮ IoC 容器不可⽤,并且只有在使⽤的时候才会出现 NPE(空指针异常)。
2.构造⽅法注⼊是 Spring 推荐的注⼊⽅式,它的缺点是如果有多个注⼊会显得⽐较臃肿,但出现这种情况你应该考虑⼀下当前类是否符合程序的单⼀职责的设计模式了,它的优点是通⽤性,在使⽤之前⼀定能把保证注⼊的类不为空。
3.Setter ⽅式是 Spring 前期版本推荐的注⼊⽅式,但通⽤性不如构造⽅法,所有 Spring 现版本已
经推荐使⽤构造⽅法注⼊的⽅式来进⾏类注⼊了。
4.5 @Resource:另⼀种注⼊关键字
@Autowired 和 @Resource 的区别
1.出身不同:@Autowired 来⾃于 Spring,⽽ @Resource 来⾃于 JDK 的注解;
2.使⽤时设置的参数不同:相⽐于 @Autowired 来说,@Resource ⽀持更多的参数设置,例如
name 设置,根据名称获取 Bean。
3.@Autowired 可⽤于 Setter 注⼊、构造函数注⼊和属性注⼊,⽽ @Resource 只能⽤于 Setter 注
⼊和属性注⼊,不能⽤于构造函数注⼊。
解决同⼀类型多个 Bean 的报错:
a. 使⽤ @Resource(name="")
b. 使⽤ @Qualifier("")
4.6 @Autowired 和 @Resource 区别
1.出身不同:@Autowired 来⾃于 Spring,⽽ @Resource 来⾃于 JDK 的注解;
2.使⽤时设置的参数不同:相⽐于 @Autowired 来说,@Resource ⽀持更多的参数设置,例如
name 设置,根据名称获取 Bean。
3.@Autowired 可⽤于 Setter 注⼊、构造函数注⼊和属性注⼊,⽽ @Resource 只能⽤于 Setter 注⼊和属性注⼊,不能⽤于构造函数注⼊
4.拓展区别:
在Spring(容器)中找Bean有两种方式:
1.根据类型查找
2.根据名称查找
@Autowired先根据类型查找(byType),之后再根据名称查找(byname)
@Resource先根据名称查找(byname),之后再根据类型查找(byType)
4.7 解决同⼀类型多个 Bean 的报错:
a. 使⽤ @Resource(name="")重命名
b. 使⽤ @Autowired和@Qualifier("")进行重命名
package com.java.demo.controller;import com.java.demo.entity.User;
import com.java.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;import javax.annotation.Resource;@Controller
public class UserController2 {//@Resource(name = "user1")//1.属性注入方式@Autowired@Qualifier(value = "user1")private User user;public void sayHi(){System.out.println("com.java.demo -> do UserController sayHi()");System.out.println(user.getUsername());}
}
相关文章:
使用Spring的五大类注解读取和存储Bean
目录 1.存储Bean对象的注解 1.1 五大类注解 1.2 方法注解 1.3添加注解的依赖 2.注解的使用 2.1 controller注解 2. 2Service注解 2.3.Resopsitory注解 2.4Component注解 2.5Configuration注解 2.6 注解之间的关系 3.方法注解 3.1 方法注解要配合类注解来使用。 3.2…...
Vue3通透教程【十一】初探TypeScript
文章目录 🌟 写在前面🌟 TypeScript是什么?🌟TypeScript 增加了什么?🌟TypeScript 初体验🌟 写在最后🌟 写在前面 专栏介绍: 凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue 文章,应粉丝要求开始更新 Vue3 的相关技术文章,Vue 框架目前的地位大家应该都晓得,所谓…...
Linux环境安装iperf3(网络性能测试工具)
[rootlocalhost ]# yum search iperf 已加载插件:fastestmirror Loading mirror speeds from cached hostfile* base: mirrors.tuna.tsinghua.edu.cn* extras: mirrors.huaweicloud.com* updates: mirrors.tuna.tsinghua.edu.cnN/S matched: iperf iperf3-devel.i6…...
回顾第一章
回顾 Shell脚本中的$虚函数虚函数和纯虚函数 git merge/rebasegit merge特点git rebase特点 Linux内核调试——coredump获取core dump 深度测试和模板测试2D游戏的制作思路C11特性 Shell脚本中的$ $0: 脚本自身的名称; $1: 传入脚本的第一个参数; $2…...
Jupyter Notebook入门教程
Jupyter Notebook(又称Python Notebook)是一个交互式的笔记本,支持运行超过40种编程语言。本文中我们将介绍Jupyter Notebook的主要特点,了解为什么它能成为人们创造优美的可交互式文档和教育资源的一个强大工具。 首先ÿ…...
独立按键识别
项目文件 文件 关于项目的内容知识点可以见专栏单片机原理及应用 的第四章 IO口编写 参考图电路编写程序,要求实现如下功能: 开始时LED均为熄灭状态,随后根据按键动作点亮相应LED(在按键释放后能继续保持该亮灯状态,直至新的按键压下时为止…...
【论文阅读】AlphaFold2阅读笔记
摘要 给一串氨基酸的序列,去预测他的结构是什么样的 蛋白质的折叠问题 alphaFold精度不够 这里可以达到原子精度的预测 CASP14 精度 这个是什么问题是不是解决了问题 模型的结果并不重要 导论 摘要故事的详细版本 在写论文的时候,可以这样写&a…...
机器学习基础知识之数据归一化
文章目录 归一化的原因1、最大最小归一化2、Z-score标准化3、不同方法的应用 归一化的原因 在进行机器学习训练时,通常一个数据集中包含多个不同的特征,例如在土壤重金属数据集中,每一个样本代表一个采样点,其包含的特征有经度、…...
QCC51XX---pydbg_cmd集合
目录 common pydbg_cmd headset pydbg_cmd earbud pydbg_cmd common pydbg_cmd log apps1.log_level() apps1.fw.gbl.debug_log_level__global 查看log等级apps1.fw.gbl.debug_log_level__global.value = 5 设置log等级 apps1.log()...
camx 马达的MSM_ACTUATOR_WRITE_DAC 操作
camx 马达的MSM_ACTUATOR_WRITE_DAC操作 为什么要分析 MSM_ACTUATOR_WRITE_DACmm-camera MSM_ACTUATOR_WRITE_DACcamx MSM_ACTUATOR_WRITE_DAC总结 为什么要分析 MSM_ACTUATOR_WRITE_DAC 目前的camx源码 省略了hw_mask 的处理。 一般来说 hw_mask 是0 ,但是对于非0…...
【无人机】无人机平台的非移动 GPS 干扰器进行位置估计的多种传感器融合算法的性能分析(Matlab代码实现)
💥 💥 💞 💞 欢迎来到本博客 ❤️ ❤️ 💥 💥 🏆 博主优势: 🌞 🌞 🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 …...
一篇文章搞定《RecyclerView缓存复用机制》
------《RecyclerView缓存复用机制》 前言零、为什么要缓存一、RecyclerView如何构建我们的列表视图二、缓存过程三、缓存结构1、mChangedScrap/mAttachedScrap2、mCachedViews3、mViewCacheExtension4、mRecyclerPool 四、总结 前言 本篇文章,暂时不加入预加载进行…...
Elasticsearch概述
1.Elasticsearch干啥的? Elasticsearch 是一个开源的分布式搜索和分析引擎,用于实时搜索、分析和存储大规模数据。它可以帮助用户在海量数据中快速进行全文搜索、聚合分析、地理空间分析等操作,并支持水平扩展以应对高并发访问需求。 Elasti…...
停车场收费系统
1.系统的开发工具 1.1 AppServe集成应用 Mysql:MySQL 是一款安全、跨平台、高效的,并与 PHP、Java 等主流编程语言紧密结合的数据库系统。该数据库系统是由瑞典的 MySQL AB 公司开发、发布并支持,由 MySQL 的初始开发人员 David Axmark 和 Mi…...
nodejs+vue+elementui学生毕业生离校系统
学生毕业离校系统的开发过程中。该学生毕业离校系统包括管理员、学生和教师。其主要功能包括管理员:首页、个人中心、学生管理、教师管理、离校信息管理、费用结算管理、论文审核管理、管理员管理、留言板管理、系统管理等,前台首页;首页、离…...
儿童用灯哪个品牌好?推荐专业的儿童护眼台灯
一款好的儿童台灯,主要是从5个方面决定,照度及均匀度,蓝光,色温,显指,频闪 ① 照度及均匀度最高是国AA级,其次就是国A级 ② 蓝光一定要选择RG0无危险级,蓝光能量最强,…...
探究Android插件化开发的新思路——Shadow插件化框架
Shadow插件化框架是什么? Shadow是一种Android App的插件化框架,它利用类似于ClassLoader的机制来实现应用程序中的模块化,并让这些模块可以在运行时灵活地进行加载和卸载。Shadow框架主张将一个大型的Android App拆分成多个小模块ÿ…...
SimpleDateFormat和DateTimeFormatter的区别及使用详解
目录 1.简介2.区别3.SimpleDateFormat3.1 字符串转日期3.2 日期转字符串 4.DateTimeFormatter4.1 字符串转日期4.2 日期转字符串 扩展 1.简介 DateTimeFormatter 和 SimpleDateFormat 都是用于格式化日期和时间的类,但是它们有一些区别。 SimpleDateFormat 是 Jav…...
边缘人工智能——nanodet模型实践指引,从标注数据集到实现部署文件
内容概述 首先获得一个合适的nanodet模型版本,配置nanodet适用的环境,然后对网上公开的生数据集进行重新标注,配置nanodet并进行训练,.pth到.onnx的模型转化及简化,编写推理文件。 文章着重于实践方向指引,…...
SASS的用法指南
一、什么是SASS SASS是一种CSS的开发工具,提供了许多便利的写法,大大节省了设计者的时间,使得CSS的开发,变得简单和可维护。 本文总结了SASS的主要用法。我的目标是,有了这篇文章,日常的一般使用就不需要去…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
