更方便Spring存储和读取对象,五大类注解、@Bean、@Autowired、@Resource

news2024/12/30 2:51:29

上一篇博客我们介绍了如何使用xml来引入bean对象,当项目多的时候,显然那样是比较麻烦的。
现在我们只需要 个注解就可以替代了。注意:注解和xml可以同时使用

准备工作:配置扫描路径

我们需要配置 下存储对象的扫描包路径,只有被配置的包下的所有类,添加了注解才能被正确的识别并保存到 Spring 中。
<?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.bit.service"></content:component-scan>
</beans>

更方便的存储到Spring

类注解:@Controller、@Service、@Repository、@Configuration、@Component
方法注解:@Bean
属性注解:@Autowired、@Resource

五大类注解

@Configuration(配置):配置层,配置当前项目的一些信息

@Controller(控制器):控制层,主要负责前端参数校验,检查用户参数的有效性

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

@Repository(仓库):持久层,直接和数据库进行交互,通常每个表都有一个对应的Repository

@Component(组件):公共工具类,提供某些公共方法,是其他四个注解的父亲。通常不属于上面四种情况的时候使用这个,可以理解为其他。

Bean Name

这里的Bean Name 指的就是getBean方法中要传入的第一个参数 String s,注解里就相当于这个类id
第二个参数是一个类
  • 第一个字母大写 第二个字母小写 -----> 第一个字母变为小写

直接看源码发掘类注解Bean Name的命名规则:

方法注解

  • 配合类注解使用,否则就是无效的注解。因为不会扫描到这个类,自然就不会扫描到这个方法。

  • 方法注解只支持ApplicaContext,不支持BeanFactory。BeanFactory无法扫描到Bean注解,猜测是因为bean这个功能更新的晚,BeanFactory也基本不用了所以就...

Bean Name

  • 默认情况 Bean name == 方法名

  • 可以自定义Bean name,但是注意自定义之后,默认的就失效了.

从下面的图我们可以看到,Bean Name如果自定义的话是一个String的数组,是可以有多个命名的。

自定义命名的格式有下面几种

@Bean("name1")   
@Bean(name = "name1")
@Bean(name = {"name1","name2"})

更方便的从Spring中获取

获取 bean 对象也叫做 对象装配,是把对象取出来放到某个类中,有时候也叫 对象注入
属性注入的三种方式都是使用 @AutoWired

属性注入

其实就是 简化了获取对象的流程,直接使用注解即可。如下面代码:

假设现在服务层有一个类
@Service
public class StudentService {

    @Bean("name1")
    public void sayHi(){
        System.out.println("Hi,Service");
    }
}
而在控制层需要调用这个sayHi方法。
@Controller
public class StudentController {
//新方法,直接使用@Autowired获取到studentService
    @Autowired
    StudentService studentService;
    public void sayHi() {
        studentService.sayHi();
    }
//老方法先获取一个ApplicationContext 在调用getBean方法相对来说比较麻烦
    public void sayHi2(){
        ApplicationContext context = new ClassPathXmlApplicationContext("Spring-config.xml");
        StudentService studentService= context.getBean("studentService",StudentService.class);
        studentService.sayHi();
    }
}

构造方法注入

@Controller
public class UserController2 {
// 注入方法2:构造方法注入
    private UserService userService;
    @Autowired
    public UserController2(UserService userService) {
        this.userService = userService;
    }
    public User getUser(Integer id) {
        return userService.getUser(id);
    }
}
  • 注意:只有一个构造方法的时候@Autowired可以省略,如下代码

@Controller
public class UserController2 {
// 注入方法2:构造方法注入
    private UserService userService;
    public UserController2(UserService userService) {
        this.userService = userService;
    }
    public User getUser(Integer id) {
        return userService.getUser(id);
    }
}
  • 注意:当有多个构造方法的时候必须有@Autowired 来明确指定到底使用哪个构造方法,否则会报错

Setter注入

Setter 注入和属性的 Setter 方法实现类似,只不过在设置 set 方法的时候需要加上 @Autowired 注解,如下面代码

@Controller
public class UserController3 {
// 注入方法3:Setter注入
private UserService userService;
@Autowired
public void setUserService(UserService userService) {
this.userService = userService;
}
public User getUser(Integer id) {
return userService.getUser(id);
}
}

三种注入方法比较

  • 属性注入的优点是简洁,使用方便;缺点是只能用于 IoC 容器,如果是非 IoC 容器不可用,并且只有在使用的时候才会出现 NPE(空指针异常)。

  • 构造方法注入是 Spring 推荐的注入方式,它的缺点是如果有多个注入会显得比较臃肿,但出现这种情况,你应该考虑一下当前类是否符合程序的单一职责的设计模式了,它的优点是通用性,在使用之前一定能把保证注入的类不为空。

  • Setter 方式是 Spring 前期版本推荐的注入方式,但通用性不如构造方法,所有 Spring 现版本已经推荐使用构造方法注入的方式来进行类注入了。

@Resource:另一种注入关键字

@Autowired 和 @Resource 的区别:

  • 出身不同:@Autowired 来自于 Spring,而 @Resource 来自于 JDK 的注解;

  • 使用时设置的参数不同:相比于 @Autowired 来说,@Resource 支持更多的参数设置,例如name 设置,根据名称获取 Bean。

  • @Autowired 可用于 Setter 注入、构造函数注入和属性注入, @Resource 不能用于构造函数入。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/179962.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

利用Windows系统服务进行权限提升

提权是后渗透重要的一环节&#xff0c;如果当前获取的用户权限比较低&#xff0c;那么我们将无法访问受保护的系统资源或执行系统管理操作&#xff0c;影响后续的攻击过程。这要求我们通过各种手段将当前用户的权限进行提升&#xff0c;以满足后续攻击的要求。利用系统服务提权…

VUE2--22.11.23

VUE2一、Vue.js devtools二、Vue简介1、什么是Vue2、Vue的特性1.数据驱动视图2.双向数据绑定3.MVVM三、Vue的基本使用1、基本使用步骤四、Vue的指令与过滤器1、什么是指令2、内容渲染指令1.v-text2.{{}}3.v-html3、属性绑定指令4、事件绑定指令5、双向绑定指令6、条件渲染指令7…

【Linux】动静态库、文件的三个时间

1.文件的三个时间Access: 访问时间&#xff0c;访问的频率很高&#xff0c;所以较新的Linux都是按一定的时间间隔刷新Modify: 修改文件内容时间Change:修改文件属性时间&#xff0c;修改文件内容也会修改文件属性makefile自动编译判断文件是否为最新&#xff1a;就是按可执行程…

运动基元(一):Dubin‘s曲线【part3】

3.5 RLR RLR的第一段圆弧的曲率 k 1 = − k m a x < 0 → s i g n ( k 1 ) = − 1 k_1=-k_{max}<0\rightarrow si

Springboot图书馆图书借阅管理系统x1x74

目 录 1 概述 1 1.1课题背景及意义 1 1.2 国内外研究现状 1 1.3 本课题主要工作 2 2 系统开发环境 3 2.1 java简介 3 2.2 Mysql数据库 3 2.3 B/S结构 4 2.4 JSP技术介绍 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2操作…

机器学习sklearn笔记:LDA(线性判别分析)

1 介绍 1.有监督的降维2.投影后类内方差最小&#xff0c;类间方差最大2 推导 我们记最佳的投影向量为w&#xff0c;那么一个样例x到方向向量w上的投影可以表示为&#xff1a; 给定数据集令分别表示第i类的样本个数、样本集合、均值向量和协方差矩阵——>在投影上的均值是 —…

kafka初识

安装kafka 下载 下载window的kafka地址 window的kafka只是为了方便学习 安装地址&#xff1a;kafka.apache.org/ 安装 解压zip为文件夹 启动kafka kafka服务器的功能相当于RocketMQ中的broker&#xff0c;kafka运行还需要一个类似于命名服务器的服务。在kafka安装目录中自…

Windows10添加WebDav地址时报错“输入的文件夹无效,请选择另一个”

一、问题描述在使用Windows10添加WebDav网络地址时&#xff0c;报错“输入的文件夹无效&#xff0c;请选择另一个”&#xff0c;如下图所示&#xff1a;二、问题分析这是由于Windows10的WebDav默认只支持https协议&#xff0c;没有支持http协议导致的。三、解决办法3.1、修改注…

计算机科学领域中里程牌式的算法

计算机科学中伟大的算法前言搜索引擎的索引PageRank公钥加密 --- 用明信片传输秘密纠错码数据压缩无损压缩有损压缩数据库 --- 追求一致性的历程事务和待办事项&#xff08;预写日志记录&#xff09;数字签名用挂锁签名用指数挂锁签名RSA的安全性前言 我肯定不是一位天文学专家…

redis 消息队列方案

redis 消息队列方案 观察角度&#xff1a;消息有序&#xff0c;重复消息处理&#xff0c;消息可靠性保证 pub/sub 发布订阅机制 list集合 消息有序&#xff1a;lpush和rpop可以保证消息顺序的被消费 重复消息处理&#xff1a;list没有为消息提供唯一标识&#xff0c;需要生产者…

利用matlab求解非线性目标函数

文章目录函数介绍设置函数参数步骤结果分析函数介绍 使用fmincon函数来进行求解&#xff0c;格式为 [x,y] fmincon(f,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)其中&#xff0c;f表示所求的目标函数&#xff0c;x0表示初始值&#xff0c;A,b,Aeq,beq表示线性的约束&#xff0c…

SpringBoot06:整合JDBC、Druid、MyBatis

整合JDBC 1、创建一个新的工程&#xff0c;勾选JDBC API和MySQL Driver 2、导入web启动器 3、编写yaml配置文件&#xff0c;连接数据库 spring:datasource:username: rootpassword: 123456url: jdbc:mysql://localhost:3306/mybatis?useUnicodetrue&characterEncodingut…

力扣 2299. 强密码检验器 II

题目 如果一个密码满足以下所有条件&#xff0c;我们称它是一个 强 密码&#xff1a; 它有至少 8 个字符。 至少包含 一个小写英文 字母。 至少包含 一个大写英文 字母。 至少包含 一个数字 。 至少包含 一个特殊字符 。特殊字符为&#xff1a;“!#$%^&*()-” 中的一个。…

面向对象编程范式

目录 1.概述 1.1.面向对象编程的核心诉求 1.2.面向对象的世界观 2.类和对象 3.如何寻找类和对象 3.1.概述 3.2.示例 4.如何表示类 4.1.什么是UML 4.1.关系 4.2.权限 4.3.依赖 4.4.泛化&#xff08;继承&#xff09; 4.5.实现 4.6.关联 4.7.聚合 4.8.组合 1.概…

自定义类型之枚举和联合

该文章将详细介绍除结构体外的另外两种自定义类型--------枚举类型与联合类型。1.枚举1.1枚举类型的定义1.2枚举的优点1.3枚举的使用2.联合&#xff08;共用体&#xff09;2.1联合类型的定义2.2联合的特点2.3联合大小的计算1.枚举 枚举顾名思义就是------一一列举。 把所有可能…

ADAS HiL系统测试方案

1、什么是ADAS ADAS&#xff08;Advanced Driving Assistance System&#xff09;也就是高级驾驶辅助系统&#xff0c;是无人驾驶的过渡。 ADAS利用安装在车上的各式各样传感器&#xff08;毫米波雷达、激光雷达、单\双目摄像头以及卫星导航&#xff09;&#xff0c;在汽车行驶…

[前端笔记——CSS] 12.处理不同方向文本

[前端笔记——CSS] 12.盒模型背景与边框1.书写模式2.书写模式、块级布局和内敛布局3.逻辑属性和逻辑值1.书写模式 CSS 中的书写模式是指文本的排列方向是横向还是纵向的。writing-mode 属性使我们从一种模式切换到另一种模式。例如&#xff0c;我们使用writing-mode: vertical…

stack、queue、priority_queue

容器适配器 适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结)&#xff0c;该种模式是将一个类的接口转换成客户希望的另外一个接口。 其中stack和queue都是容器适配器&#xff0c;其中stack可以封装vector、list以及我们…

ffmpeg无损裁剪、合并视频

我用的版本是 ffmpeg version git-2020-06-23-ce297b4 官方文档 https://ffmpeg.org/ffmpeg-utils.html#time-duration-syntax 时间格式 [-][HH:]MM:SS[.m...] 或 [-]S[.m...][s|ms|us]裁剪视频 假设需要裁剪视频aaa.mp4&#xff0c;第5秒到第15秒 ffmpeg -ss 5 -to 15 -i…

使用gazebo对scara机械臂进行仿真

本文主要介绍如何仿真一个scara机械臂&#xff0c;以及在网上看了一些项目以后&#xff0c;有了一些感想&#xff0c;不想看的可以直接跳到机械臂部分。 目录感想(自己的理解&#xff0c;不一定对。)Scara机械臂的开发运动学计算如何使用机械臂工作图一个例子: 在start_pose抓起…