【Spring学习之更简单的读取和存储Bean对象】属性注入,set注入,构造方法注入

news2024/11/25 20:51:59

前言:
💞💞今天我们依然是学习Spring,这里我们会更加了解Spring的知识,知道Spring是怎么更加简单的读取和存储Bean对象的。也会让大家对Spring更加了解。
💟💟前路漫漫,希望大家坚持下去,不忘初心,成为一名优秀的程序员

个人主页⭐: 书生♡
gitee主页🙋‍♂:奋斗的小白
博客领域💥:java编程 ,前端,算法,强训题目
写作风格💞:超前知识点,干货,思路讲解,通俗易懂
支持博主💖:关注⭐,点赞、收藏⭐、留言💬

在这里插入图片描述
我们之前的博客讲述了如何通过注解(类注解和方法注解)简单的读取和存储Bean对象
类注解和方法注解的博客地址 :博客链接

目录

  • 1.获取 Bean 对象
    • 1.1 属性注入
    • 1.2 set注入
    • 1.3 构造方法注入
  • 2.@Resource:另⼀种注⼊关键字
  • 3. @Autowired 和 @Resource 的区别
  • 4.同⼀类型多个 @Bean 报错
  • 5. 总结

1.获取 Bean 对象

获取 bean 对象也叫做对象装配,是把对象取出来放到某个类中,有时候也叫对象注⼊
现实工作中一般是将,将 Service 类注⼊到 Controller 类中。

我们获取Bean有三种方法,分别是属性注入,set注入,构造方法注入,下面为大家挨个分享一下。

1.1 属性注入

属性注入我们也是通过注解实现的,通过@Autowired来实现的
通过这个@Autowired注解,我们就可以将Service类注入到Controller类中。

@Service
public class StudentService {

    public void hello()
    {
        System.out.println("Hi,Service。");
    }
}

@Controller
public class StudentController {

    //获取 Bean 对象=>属性注入
    @Autowired
    private StudentService studentService;
    public  void hello()
    {
        studentService.hello();
    }
}

public static void main(String[] args) {

        //1.获取Spring对象(上下文)

        ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
        //2.取出bean对象

        StudentController student =context.getBean("studentController",StudentController.class);
        student.hello();
    }

在这里插入图片描述

属性注入优点:
1.实现简单

属性注入缺点:
1.不能注入不可变的对象(对象被final修饰的)
2.只适用于Ioc容器
3.更容易违背单一设计原则(针对的是类)

在这里插入图片描述

1.2 set注入

Setter 注⼊和属性的 Setter ⽅法实现类似,只不过在设置 set ⽅法的时候需要加上 @Autowired 注

 //获取 Bean 对象=>set注入
   
    private StudentService studentService;
    @Autowired
    public void setStudentService(StudentService studentService) {
        this.studentService = studentService;
    }

    public  void hello()
    {

        studentService.hello();
    }

在这里插入图片描述

set注入优点:
1.更加符合单一设计原则。针对对象方法级别。

set注入缺点:
1.不能注入不可变对象;
2.注入对象可被修改。(set方法是普通set方法,可以被重复调用,在被调用时就存在修改的风险。)

1.3 构造方法注入

构造⽅法注⼊是 Spring 推荐的注⼊⽅式

构造⽅法注⼊是在类的构造⽅法中实现注⼊

//构造⽅法注⼊

    private  StudentService studentService;
    @Autowired
    public StudentController(StudentService studentService, UserComponent userComponent) {
        this.studentService = studentService;
        this.userComponent = userComponent;
    }

    public  void hello()
    {

        studentService.hello();
    }

如果只有⼀个构造⽅法,那么 @Autowired 注解可以省略

构造方法注入优点:
1.可以注入一个不可变的对象。
2.注入的对象不会被修改。
 2.1加了final修饰符。
  2.2构造方法是随着类加载只执行一次的(不像set有可能执行多次被修改的分享)。
3.注入的对象会被完全初始化。(使用构造方法带来的优点)
4.通用性更好。

构造方法注入缺点:
1.没有属性注入实现简单。

2.@Resource:另⼀种注⼊关键字

在进⾏类注⼊时,除了可以使⽤ @Autowired 关键字之外,我们还可以使⽤ @Resource 进⾏注⼊

@Resource
    private Student student;
    public  void hello()
    {

        System.out.println(student.toString());
    }

3. @Autowired 和 @Resource 的区别

相同点:
1.都是用来实现依赖注入的。

不同点:
1.功能支持不同:@Autowired支持属性注入、setter注入、构造方法注入;@Resource支持属性、setter注入,但不支持构造方法注入。
2.出身不同:@Autowired来自Spring框架;而@Resource来自于JDK。
3.参数支持不同:@Resource支持更多的参数设置比如name参数;而@Autowired只支持required 参数。

在这里插入图片描述

4.同⼀类型多个 @Bean 报错

看这么一个代码

@Controller
public class UserBean {

    @Bean
    public User user1()
    {
        User user=new User();
        user.setId(1);
        user.setName("张三");
        user.setPassword("123");
        return  user;
    }
    @Bean
    public User user2()
    {
        User user=new User();
        user.setId(1);
        user.setName("张三");
        user.setPassword("123");
        return  user;
    }
}


@Controller
public class UserController {

    @Autowired
    private User user;

    public void getUser()
    {
        System.out.println("user:"+user);
        User user2=user;
        user2.setName("lisi");
        System.out.println("user:"+user2);
    }
}

看代码是没有问题的,但是运行会发现出现错误
在这里插入图片描述

报错的原因是,⾮唯⼀的 Bean 对象。

解决同⼀个类型,多个 bean 的解决⽅案有以下两个:
使⽤ @Resource(name=“user1”) 定义。
使⽤ @Qualifier 注解定义名称。

在这里插入图片描述
在这里插入图片描述

5. 总结

  1. 将对象存储到 Spring 中:
    1.1. 使⽤类注解:@Controller、@Service、@Repository、@Configuration、@Component
    1.2. 使⽤⽅法注解:@Bean【注意事项:必须配合类注解⼀起使⽤】
  1. Bean 的命名规则:
    ⾸字⺟和第⼆个字⺟都⾮⼤写,⾸字⺟⼩写来获取 Bean,如果⾸字⺟和第⼆个 字⺟都是⼤写,那么直接使⽤原 Bean 名来获取 Bean。
  1. 从 Spring 中获取对象:
    1.属性注⼊
    2.Setter 注⼊
    3.构造函数注⼊(推荐)
  1. 注⼊的关键字有:
    1.@Autowired
    2.@Resource
  1. @Autowired 和 @Resource 区别:
    1.出身不同;
    2.使⽤时设置参数不同 @Resource ⽀持更多的参 数,⽐如 name。
  1. 解决同⼀类型多个 Bean 的报错:
    1.使⽤ @Resource(name=“”)
    2.使⽤ @Qualifier(“”)

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

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

相关文章

现在的00后,卷死了呀....

都说00后躺平了,但是有一说一,该卷的还是卷。这不,三月份春招我们公司来了个00后,工作没两年,跳槽到我们公司起薪23K,都快接近我了。 后来才知道人家是个卷王,从早干到晚就差搬张床到工位睡觉了…

数据科学之数据可视化——Tableau可视化气泡图

大家好,我是大鹏,今天给大家分享一个新的一个知识“气泡图”。 气泡图就是用气泡的大小和颜色表示不同的数据。

【RabbitMQ教程】第三章 —— RabbitMQ - 发布确认

💧 【 R a b b i t M Q 教程】第三章—— R a b b i t M Q − 发布确认 \color{#FF1493}{【RabbitMQ教程】第三章 —— RabbitMQ - 发布确认} 【RabbitMQ教程】第三章——RabbitMQ−发布确认💧 🌷 仰望天空,妳我亦是行人…

青大数据结构【2020】【三分析计算】

关键字: 无相连通图、Prim算法最小生成树、哈希函数、线性探测法、平均查找长度 1.对于一个带权连通无向图G,可以采用Prim算法构造出从某个顶点v出发的最小生成树,问该最小生成树是否一定包含从顶点v到其他所有顶点的最短路径。如果回答是&a…

docker 网络理论知识点 - CNM 和命名空间

Network 目录 1 network namespace1.1 动手小实验 2 回到 docker2.1 driver and docker02.2 network2.3 网桥 docker0 3 总结 1 network namespace 1.1 动手小实验 网络命名空间。linux kernel 提供的网络虚拟化的功能。创建多个隔离的网络空间。每个空间内 firewall, ether …

Matplotlib学习

文章目录 Matplotlib曲线图的绘制饼图的绘制直方图的绘制散点图的绘制 Matplotlib 在深度学习的实验中,图形的绘制和数据的可视化非常重要。Matplotlib是用于绘制图形的库,使用Matplotlib可以轻松地绘制图形和实现数据的可视化。这里,我们来…

Linux学习之文件信息和文件类型

使用ls -l可以看到当前目录下除隐藏文件之外的文件。 我们拿下边这行信息解释一下: -rw-r--r-- 1 root root 10562254 Mar 9 00:08 cmake-3.25.3.tar.gz Linux中“一切皆文件”,首先需要明确这点,因为对于不同的文件类型,后边的…

前后端分离项目之修改存储信息

本文章基于:前后端分离项目之登录页面(前后端请求、响应和连接数据库)_小俱的一步步的博客-CSDN博客 目录 一、编辑者操作步骤 二、代码实现步骤 以下以存储学生信息为例 一、编辑者操作步骤 1.在前端“编辑”按钮,点击时弹出弹框,出现…

某大厂测试开发面试总结,大家可以参考一下

目录 前言 1、RecyclerView和ListView的区别 2、技术选型的依据 3、原生monkey的原理 4、monkey和monkeyRunner区别 5、appium和uiautomator的关系或者Airtest和uiautomator的区别 6、Android进程间通信方式 7、内存溢出与内存泄露的区别及内存泄漏的原因 8、性能数据收…

mac版Excel表格中出现E+

相信很多人在使用Excel的时候都遇到过单元格变成###的情况,这是由于单元格列宽不够造成的,只需要增加列宽就可以正常显示。如果你在使用Excel的过程中遇到过出现"E"这种情况,此时不要惊慌,这是Excel自动对很大或很小的数…

C语言实现汉诺塔问题【图解和演示】

大家好,我是纪宁。 在高中时,曾有一位故友问过我类似这种移盘子的题目(数列),我当时一脸茫然,上了大学才知道原来是著名的汉诺塔问题 本文,就将介绍汉诺问题的由来、原理、及C语言如何实现 目录…

ZooKeeper【实际案例】

服务器动态上下线监听 需求 在我们的分布式系统中,有多台服务器节点,我们希望任意一台客户端都能实时收到服务器节点的上下线。 实现 服务器节点上线以后自动去zookeeper目录注册自己的节点信息(创建Znode临时节点)&#xff0c…

无人机侦察区域覆盖

irvingvasquez/ocpp: Optimal coverage path planning (github.com) matlab2020可运行

MySQL数据表进阶操作

MySQL数据表高级操作 一、克隆表二、清空表三、创建临时表四、创建外键约束五、MySQL中6种常见的约束:六、数据库用户管理 一、克隆表 将数据表的数据记录生成到新的表中 被克隆的对象: 方法一: 第一步:create table 新表名 li…

2023年简历石沉大海,别投了,软件测试岗位饱和了....

各大互联网公司的接连裁员,政策限制的行业接连消失,让今年的求职雪上加霜,想躺平却没有资本,还有人说软件测试岗位饱和了,对此很多求职者深信不疑,因为投出去的简历回复的越来越少了。 另一面企业招人真的…

机器学习_预测概率校准

我们在建模时通常根据准确性或准确性来评估其预测模型,但几乎不会问自己:“我的模型能够预测实际概率吗?” 但是,从商业的角度来看,准确的概率估计是非常有价值的(准确的概率估计有时甚至比好的精度更有价值…

Dao层、Service层、Entity层、Servlet层、Utils层

这几天在复习高数,还有刷题。 B: 第五周任务 [Cloned] - Virtual Judge (vjudge.net) http://t.csdn.cn/S3imr G: 第五周任务 [Cloned] - Virtual Judge (vjudge.net) http://t.csdn.cn/UVgfK Dao层是数据访问层Service层是业务逻辑层…

深度学习HashMap之手撕HashMap

认识哈希表 HashMap其实是数据结构中的哈希表在Java里的实现。 哈希表本质 哈希表也叫散列表,我们先来看看哈希表的定义: 哈希表是根据关键码的值而直接进行访问的数据结构。 简单说来说,哈希表由两个要素构成:桶数组和散列函数…

汽车电子Autosar之车载以太网

前言 近些年来,随着为了让汽车更加安全、智能、环保等,一系列的高级辅助驾驶功能喷涌而出。未来满足这些需求,就对传统的电子电器架构带来了严峻的考验,需要越来越多的电子部件参与信息交互,导致对网络传输速率&#x…

NR及LTE中的IQ数据与信息、比特率、码元、波特率之间的关系

信息与比特率 信息:对信源进行数字编码后的数据,基本单位是bit。 比特率:信息的速率称为比特率(bit/s、bps),通常用Rb表示。 码元与波特率 码元 固定时长的信号波形(数字脉冲),也称为一个符号,symb。 (…