SpringBoot注解--10--@Bean,对象注入的三种方法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • @Bean
    • 一、如何使用方法注解
        • 注意Bean 的命名规则,==当没有设置 name 属性时,那么 bean 默认的名称就是方法名==,
        • 当设置了 name 属性之后,只能通过==重命名的name 属性对应的值来获取==,也就是说重命名之后,再使用方法名就获取不到 bean 对象;
    • 二、同一类型的对象注入多次的问题
      • 1、精准的描述bean的名称(将注入的名称写对)
      • 2、使用@Resource设置name的方式来重命名注入的对象;
      • 3、使用@AutoWired+@Qualifier来筛选bean对象;
  • 对象注入的三种方法
    • 1、属性注入
    • 2、构造方法注入
    • 3、Setter方法注入
    • 4. 属性注入和构造方法注入以及 Setter 注入的区别是什么?


@Bean

一、如何使用方法注解

1、类注解是写到类上面的,那么方法注解是写到对应的方法上的;

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

2、方法注解的话是不能够单独使用的,如果我们只给一个方法注解@Bean的话,看是否能运行;

 ApplicationContext context= new ClassPathXmlApplicationContext("spring-config.xml");User user = context.getBean(User.class);//只使用类属性System.out.println(user);

运行结果:
在这里插入图片描述
如何解决?我们只需要在方法注解的类中添加一个类注解即可;
在这里插入图片描述
再次运行:
在这里插入图片描述

注意Bean 的命名规则,当没有设置 name 属性时,那么 bean 默认的名称就是方法名
当设置了 name 属性之后,只能通过重命名的name 属性对应的值来获取,也就是说重命名之后,再使用方法名就获取不到 bean 对象;

比如已经给bean重命名了,我们在启动类App中通过方法名来获取Bean对象;
在这里插入图片描述
看运行结果:

在这里插入图片描述

二、同一类型的对象注入多次的问题

1、在UserBeans类中写两个对象注解;

@Component
public class UserBeans {@Bean(name = "user1") // 【注意事项:只使用一个 @Bean 是无法将对象存储到容器中的】public User getUser1() {User user = new User();user.setId(1);user.setName("张三");return user;}@Bean(name = "user2") // 【注意事项:只使用一个 @Bean 是无法将对象存储到容器中的】public User getUser2() {User user = new User();user.setId(2);user.setName("李四");return user;}

2、通过启动类来获取对象;

ApplicationContext context= new ClassPathXmlApplicationContext("spring-config.xml");
User user = context.getBean(User.class);//只使用类属性
System.out.println(user);

在这里插入图片描述
翻译过来的意思就是:没有可用的“com.User”类型的合格bean:应为单个匹配bean,但找到2:user1,user2;

那么,如何解决呢?这里我们提供了三种解决方案;

1、精准的描述bean的名称(将注入的名称写对)

比如我们在启动类中使用id+class的形式来取对象;

ApplicationContext context= new ClassPathXmlApplicationContext("spring-config.xml");
User user = context.getBean("user1",User.class);//只使用类属性
System.out.println(user);

在这里插入图片描述

2、使用@Resource设置name的方式来重命名注入的对象;

1、这里我们通过UserController类来进行演示;注意我们添加的注解@Resource,下面新写了一个对象user1;

package com;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;import javax.annotation.Resource;@Controller
public class UserController {@Resourceprivate User user1;public void sayHi(){System.out.println("User"+user1);}
}

启动类App中代码:

ApplicationContext context= new ClassPathXmlApplicationContext("spring-config.xml");
UserController userController = context.getBean(UserController.class);
userController.sayHi();

在这里插入图片描述

3、使用@AutoWired+@Qualifier来筛选bean对象;

UserController代码:

package com;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;import javax.annotation.Resource;@Controller
public class UserController {@Autowired@Qualifier(value = "user2")private User user2;public void sayHi(){System.out.println("User"+user2);}
}

在这里插入图片描述

对象注入的三种方法

1、属性注入

属性注⼊是使⽤ @Autowired 实现的,将 Service 类注⼊到 Controller 类中。

package com;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import javax.annotation.Resource;
/*** 根据属性实现 bean 对象的注入*/
@Controller
public class UserController2 {// 对象注入方式1:属性注入@Autowiredprivate UserService userService;public void sayHi() {userService.sayHi();}}

启动类App:

ApplicationContext context= new ClassPathXmlApplicationContext("spring-config.xml");
UserController2 userController2 = context.getBean(UserController2.class);
userController2.sayHi();

在这里插入图片描述

2、构造方法注入

package com;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;/*** 使用构造方法实现 bean 注入*/
@Controller
public class UserController3 {private UserService userService;// 构造方法注入(官广推荐写法)@Autowiredpublic UserController3(UserService userService) {
//        userService = new UserService(); // 传统的写法this.userService = userService;}public void sayHi() {userService.sayHi();}}

注:如果当前类只存在一个构造方法,那么@Autowired注解可以省略;

启动类App:

ApplicationContext context= new ClassPathXmlApplicationContext("spring-config.xml");
UserController3 userController3 = context.getBean(UserController3.class);
userController3.sayHi();

在这里插入图片描述

3、Setter方法注入

package com;import org.springframework.stereotype.Controller;import javax.annotation.Resource;/*** 使用 Setter 实现 bean 注入*/
@Controller
public class UserController4 {private UserService userService;@Resourcepublic void setUserService(UserService userService) {this.userService = userService;}public void sayHi() {userService.sayHi();}}

启动类App:

ApplicationContext context= new ClassPathXmlApplicationContext("spring-config.xml");
UserController4 userController4 = context.getBean(UserController4.class);
userController4.sayHi();

在这里插入图片描述

4. 属性注入和构造方法注入以及 Setter 注入的区别是什么?

  1. 属性注入:特点写法简单。但是通用性不好,它只能运行在 IoC 容器下,如果是非 IOC 容器就会出现问题。
  2. Setter 注入:早期 Spring 版本推荐的写法,Setter 注入通用性没有构造方法注入通用。
  3. 构造方法注入: 通用性更好、它能确保在使用注入对象之前,此注入对象一定初始化过了。当构造方法注入参数过多时,此时开发者就要检查自己所写的代码是否符合单一设计原则的规范了,此注入方式也是 spring后期版本中推荐的注入方式。

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

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

相关文章

33【Aseprite 作图】树——拆解

1 树叶 画树叶真累啊,可以先画一个轮廓,细节一点点修 2 1 2 ;2 2 2 (横着横),这样一点点画树叶 填充颜色,用了喷雾工具 2 树干部分 轮廓部分,左边的是3 3 3 ;上下都是…

网页音频提取在线工具有哪些 网页音频提取在线工具下载

别再到处去借会员账号啦。教你一招,无视版权和地区限制,直接下载网页中的音频文件。没有复杂的操作步骤,也不用学习任何代码。只要是网页中播放的音频文件,都可以把它下载到本地保存。 一、网页音频提取在线工具有哪些 市面上的…

【数据结构】二叉树:简约和复杂的交织之美

专栏引入: 哈喽大家好,我是野生的编程萌新,首先感谢大家的观看。数据结构的学习者大多有这样的想法:数据结构很重要,一定要学好,但数据结构比较抽象,有些算法理解起来很困难,学的很累…

Transformer中的位置编码PE(position encoding)

Transformer中的位置编码PE(position encoding) 1.提出背景 transformer模型的attention机制并没有包含位置信息,即一句话中词语在不同的位置时在transformer中是没有区别的 2.解决背景 给encoder层和decoder层的输入添加了一个额外的向量Positional Encoding&a…

【专利 超音速】一种光伏检测系统

申请号CN202410053901.0公开号(公开)CN118032774A申请日2024.01.12申请人(公开)超音速人工智能科技股份有限公司发明人(公开)张俊峰(总); 叶长春(总); 许春夏 摘要 本发明公开一种光伏检测系统&#xff0…

iotdb时序库在火电设备锅炉场景下的实践【原创文字,IoTDB社区可进行使用与传播】

一.概述 1.1 说明 本文章主要介绍iotdb数据库在电站锅炉工业场景下,对辅助智能分析与预警的使用介绍。 【原创文字,IoTDB社区可进行使用与传播】 1.2 项目背景 随着人工智能算法在电力领域的发展,以及燃煤锅炉设备精细化调整需求的增加&…

数据结构——经典链表OJ(二)

乐观学习,乐观生活,才能不断前进啊!!! 我的主页:optimistic_chen 我的专栏:c语言 点击主页:optimistic_chen和专栏:c语言, 创作不易,大佬们点赞鼓…

chatgpt之api的调用问题

1.调用api过程中,出现如下报错内容 先写一个测试样例 import openaiopenai.api_key "OPEN_AI_KEY" openai.api_base"OPEN_AI_BASE_URL" # 是否需要base根据自己所在地区和key情况进行completion openai.ChatCompletion.create(model"g…

【intro】GNN中异构图(heterogeneous graph)综述

本篇博客内容是读两篇论文,两篇论文连接如下: Heterogeneous graph neural networks analysis: a survey of techniques, evaluations and applications A Survey on Heterogeneous Graph Embedding: Methods, Techniques, Applications and Sources …

瓦罗兰特国际服 外服游玩教程 瓦罗兰特外服下载注册游玩指南

瓦罗兰特国际服 外服游玩教程 瓦罗兰特外服下载注册游玩指南 瓦罗兰特作为当今游戏圈顶流的一款热门FPS。游戏,作为拳头游戏公司划时代的一款游戏。游戏不仅延续了传统FPS游戏的玩法,还添加许多新玩法,这也是游戏可以吸引大批量玩家的原因之…

基于电导增量MPPT控制算法的光伏发电系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于电导增量MPPT控制算法的光伏发电系统simulink建模与仿真。输出MPPT跟踪后的系统电流,电压以及功率。 2.系统仿真结果 3.核心程序与模型 版本:MAT…

cocos creator 3.x实现手机虚拟操作杆

简介 在许多移动游戏中,虚拟操纵杆是一个重要的用户界面元素,用于控制角色或物体的移动。本文将介绍如何在Unity中实现虚拟操纵杆,提供了一段用于移动控制的代码。我们将讨论不同类型的虚拟操纵杆,如固定和跟随,以及如…

视频汇聚平台EasyCVR对接GA/T 1400视图库结构化数据:人员/人脸、非/机动车、物品

在信息化浪潮席卷全球的背景下,公安信息化建设日益成为提升社会治理能力和维护社会稳定的关键手段。其中,GA/T 1400标准作为公安视频图像信息应用系统的核心规范,以其结构化数据处理与应用能力,为公安信息化建设注入了强大的动力。…

【图解IO与Netty系列】Reactor模型

Reactor模型 Reactor模型简介三类事件与三类角色Reactor模型整体流程 各种Reactor模型单Reactor单线程模型单Reactor多线程模型主从Reactor模型 Reactor模型简介 Reactor模型是服务器端用于处理高并发网络IO请求的编程模型,与传统的一请求一线程的同步式编程模型不…

翼龙面板是什么,如何进行搭建

翼龙面板是一个开源的,用于游戏服务器管理的程序,可以方便地在网页界面中创建Minecraft,起源引擎游戏和Teamspeak3 服务器。 它使用前后端程序,因此可以创建多后端节点,对游戏服务器和服务器节点进行统一管理。 对游戏…

Vue进阶之Vue无代码可视化项目(二)

Vue无代码可视化项目 项目初始化路由子路由错误示范正确示范App.vuerouter/index.tsAboutView.vueAboutAboutview.vuerouter/index.ts项目路由router/index.tsApp.vueActionsView.vueDataSourceView.vueLayoutView.vue路由样式App.vue进一步的App.vue项目初始化 路由 router i…

synchronized 锁的到底是什么?

通过8种情况演示锁运行案例,看看我们到底锁的是什么 1锁相关的8种案例演示code package com.bilibili.juc.lock;import java.util.concurrent.TimeUnit;/*** 题目:谈谈你对多线程锁的理解,8锁案例说明* 口诀:线程 操作 资源类* 8…

LeetCode875爱吃香蕉的阿珂

题目描述 珂珂喜欢吃香蕉。这里有 n 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 h 小时后回来。珂珂可以决定她吃香蕉的速度 k (单位:根/小时)。每个小时,她将会选择一堆香蕉,从…

IntelliJ IDEA / Android Studio 方法显示Git提交人

显示方法: 设置 > 编辑器 > 嵌入提示 > Code Vision > 代码作者(勾选) IntelliJ IDEA Android Studio

springboot编写日志环境搭建过程

AOP记录日志 AOP记录日志的主要优点包括: 1、低侵入性:AOP记录日志不需要修改原有的业务逻辑代码,只需要新增一个切面即可。 2、统一管理:通过AOP记录日志可以将各个模块中需要记录日志的部分进行统一管理,降低了代…