JavaEE——Spring中存取Bean的注解

目录

一、存储Bean对象

1、定义

2、存储方式

(1)、类注解

【1】、@Controller(控制器存储)

【2】、@Service(服务存储)

【3】、@Repository(仓库存储)

【4】、@Component(组件存储)

【5】、@Configuration(配置存储)

(2)、方法注解@Bean

3、重命名Bean

二、获取Bean对象

1、注入关键字@Autowired

(1)、属性注入

(2)、Setter注入

(3)、构造方法注入

2、注入关键字@Resource

3、@Autowired和@Resource的区别

4、解决同一类型多个@Bean报错

(1)、使用 @Resource 注解

(2)、使用 @Qualifier 注解


一、存储Bean对象

1、定义

  • @Controller:业务逻辑层;
  • @Service:服务层;
  • @Repository:持久层;
  • @Configuration:配置层;

注:@Controller、@Service、@Repository、@Configuration等注解都是属于@Component的"子类"。

2、存储方式

(1)、类注解

【1】、@Controller(控制器存储)

@Controller
public class UserController {public void func1() {System.out.println("func1");}
}
public class App {public static void main(String[] args) {ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");UserController userController=context.getBean("userController",UserController.class);userController.func1();}
}

【2】、@Service(服务存储)

@Service
public class UserService {public void func2() {System.out.println("func2");}
}
class App {public static void main(String[] args) {ApplicationContext context= new ClassPathXmlApplicationContext("spring-config.xml");UserService userService =context.getBean("userService",UserService.class);userService.func2();}
}

【3】、@Repository(仓库存储)

@Repository
public class UserRepository {public void func3() {System.out.println("func3");}
}
class App {public static void main(String[] args) {ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");UserRepository userRepository =context.getBean("userRepository",UserRepository.class);userRepository.func3();}
}

【4】、@Component(组件存储)

@Component
public class UserComponent {public void func4() {System.out.println("func4");}
}
class App {public static void main(String[] args) {ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");UserComponent userComponent =context.getBean("userComponent",UserComponent.class);userComponent.func4();}
}

【5】、@Configuration(配置存储)

@Configuration
public class UserConfiguration {public void func5() {System.out.println("func5");}
}
class App {public static void main(String[] args) {ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");UserConfiguration userConfiguration=context.getBean("userConfiguration",UserConfiguration.class);userConfiguration.func5();}
}

(2)、方法注解@Bean

在Spring框架的设计中,方法注解@Bean要配合类注解才能将对象正常的存储到Spring容器中。

@Component
public class Users {@Beanpublic User user1() {User user = new User();user.setName("张三");return user;}
}

3、重命名Bean

可以通过设置name属性给Bean对象进行重命名操作,此时我们使用user1就可以获取到User对象。

@Component
public class Users {@Bean(name = "user1")public User user() {User user = new User();user.setName("张三");return user;}
}

这个重命名的name是⼀个数组,因此一个bean可以有多个名字,并且name={}也可以省略。

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

二、获取Bean对象

获取 bean 对象也叫做对象装配,是把对象取出来放到某个类中,有时候也叫对象注⼊。
对象装配(对象注⼊)的实现⽅法以下 3 种:属性注⼊、Setter 注⼊、构造⽅法注⼊

1、注入关键字@Autowired

(1)、属性注入

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller
public class UserController {@Autowiredprivate UserService userService;public void show() {System.out.println(userService.name)}
}
  • 优点:使用简洁方便
  • 缺点:只能用于 IoC 容器,非 IoC 容器不可用;无法注入被 final 修饰的对象;容易违背单一性原则

(2)、Setter注入

Setter注入和属性的Setter方法类似,但在设置set方法时需要加上@Autowired的注解。

@Controller
public class UserController {private UserService userService;@Autowiredpublic void setUserService(UserService userService) {this.userService = userService;}public void show() {System.out.println(userService.name)}
}
  • 优点:不容易违背单一性原则
  • 缺点:通用性不如构造方法;无法注入被final修饰的对象;容易被非法调用

(3)、构造方法注入

构造方法注入是在类的构造方法中实现注入的。如果只有一个构造方法,那么@Autowired注解可以省略,但如果类中有多个构造方法,那么需要添加上@Autowired来明确指定到底使用哪个构造方法,否则程序会报错。

@Controller
public class UserController {private UserService userService;@Autowiredpublic UserController(UserService userService) {this.userService = userService;}public void show() {System.out.println(userService.name)}
}
  • 优点:构造器是Spring推荐的注入方式,同时构造器注入的通用性较强,能够注入被final修饰的对象
  • 缺点:使用复杂

2、注入关键字@Resource

在进行类注入时除了可以使用@Autowired关键字之外,还可以使用@Resource进行注入。

@Controller
public class UserController {@Resourceprivate UserService userService;public void show() {System.out.println(userService.name)}
}

3、@Autowired和@Resource的区别

  • 出身不同:@Autowired 来自于Spring;@Resource 来自于JDK的注解;
  • 设置参数不同:相比于@Autowired,@Resource支持更多的参数设置;
  • 注入种类不同:@Autowired可用于属性注入、Setter注入和构造函数注入;@Resource只能用于属性注入和Setter注入,不能与于构造函数注入;

4、解决同一类型多个@Bean报错

@Component
public class Users {@Beanpublic User user1() {User user = new User();user.setName("张三");return user;}@Beanpublic User user2() {User user = new User();user.setName("李四");return user;}
}

报错的原因是非唯一的Bean对象,解决同一个类型的多个bean的解决方案有以下两个

(1)、使用 @Resource 注解

@Controller
class UserController4 {@Resource(name = "user1")private User user;public User getUser() {return user;}
}

(2)、使用 @Qualifier 注解

@Controller
public class UserController5 {@Autowired@Qualifier(value = "user2")private User user;public User getUser() {return user;}
}

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

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

相关文章

9个可用于图片转文本的最佳免费 OCR 软件

光学字符识别 (OCR) 软件可帮助将不可编辑的文档格式(例如 PDF、图像或纸质文档)转换为可编辑和可搜索的机器可读格式。 OCR 应用程序通常用于从 PDF 和图像中捕获文本,并将文本转换为可编辑格式,例如 Word、Excel 或纯文本文件。…

Unity小游戏——武士打怪兽(总)

Unity小游戏——武士击杀小怪兽(无限滚动的背景)_七七喝椰奶的博客-CSDN博客 Unity小游戏——无限滚动的背景的改良_七七喝椰奶的博客-CSDN博客 Unity小游戏——怪物出现模式的管理_七七喝椰奶的博客-CSDN博客 Unity小游戏——武士和怪物的碰撞检测_七…

uniapp页面通信学习笔记

1、利用url传参进行通讯 A页面向B页面传递参数 uni.navigateTo({ url: test/test?id1&url encodeURIComponent(https://dcloud.io) }); B页面接收A页面传递的参数 export default { onLoad: function (option) { //option为object类型,会序列化上个页面…

将Windows的文件打包为Linux、Ubuntu可打开的格式

设置共享文件夹具体操作 设置共享文件夹 上述这篇文章完整讲述了如何设置一个可以在Windows及虚拟机之间互传文件的文件夹 7zip下载地址 Download 打包具体操作 a. 安装7-ZIP以后,直接在你想要打包的文件上点右键菜单,会有一个7-ZIP的子菜单栏&#…

STM32 HEX文件和BIN文件格式区别keil中的配置与生成

一、区别 HEX 文件: 是包括地址信息的,在烧写或下载HEX文件的时候,一般都不需要用户指定地址,因为HEX文件内部的信息已经包括了地址。HEX文件是用ASCII来表示二进制的数值。例如一般8-BIT的二进制数值0x3F,用ASCII来表示就需要分别表示字符3和字符F,每个字符需要一个BYTE…

【LeetCode每日一题】——946.验证栈序列

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 栈 二【题目难度】 中等 三【题目编号】 946.验证栈序列 四【题目描述】 给定 pushed 和 p…

C++OpenCV(6):图像阈值操作

🔆 文章首发于我的个人博客:欢迎大佬们来逛逛 🔆 OpenCV项目地址及源代码:点击这里 文章目录 图像阈值化 图像阈值化 阈值又叫临界值,是指一个效应能够产生的最低值或最高值。 例如我们选择的阈值为125,则…

[SQL挖掘机] - union/union all 使用注意事项

因为当使用union和union all操作符时,有一些注意事项需要考虑: 1. 列数和数据类型匹配: 要使用union或union all合并结果集,两个或多个查询的 select 语句必须返回相同数量和类型的列。确保每个查询返回相同的列数,并…

WPF实战学习笔记12-创建备忘录接口

创建备忘录接口 添加文件 新建文件 MyToDo.Api ./Controllers/MemoController.cs ./Service/IMemoService.cs ./Service/MemoService.cs MyToDo.Share ./Parameters/QueryParameter.cs QueryParameter.cs 查询参数类 using System; using System.Collections.Generic…

智能网关实现混凝土搅拌机无人自动化

“以前的搅拌站生产时,是需要人工巡检的,运送物料和搅拌时产生的大量粉尘污染和噪音,让工人苦不堪言。但是如果有了物联网搅拌站监测系统智慧园区项目落地后,工人也不用去现场忍受噪音和粉尘了。” 行业痛点 传统模式下的混泥土…

机器学习实战11-基于K-means算法的文本聚类分析,生成文本聚类后的文件

大家好,我是微学AI,今天给大家介绍机器学习实战11-基于K-means算法的文本聚类分析,生成文本聚类后的文件。文本聚类分析是NLP领域的一个核心任务,通过将相似的文本样本分组,可以帮助我们发现隐藏在文本数据中的模式和结…

力扣题库刷题笔记73--矩阵置零

1、题目如下: 2、个人Python代码实现 3、个人Python代码思路 a、声明2个空数组p、q,用于存放值为0的元素matrix[i][j]的下标 b、首先遍历二维数组matrix,找到值为0的元素matrix[i][j],将下标i加入数组p,将下标j加入数…

在Android中使用新版proguard混淆器的方式

文章目录 一、Proguard混淆器二、新版混淆器使用方式(插件版)三、R8与proguard四、参考链接 一、Proguard混淆器 Proguard是Android开发时经常会用到的一个混淆工具,在Android SDK中已经集成了一个免费的Proguard版本,位于/tools/proguard目录中。对于A…

微信小程序-----刷新页面3种方式

微信小程序要实现页面刷新,简单的说就是在不同的地方重新执行 onLoad 周期函数。 需要注意在刷新时是否要初始化变量。因为小程序都是异步操作,所以很多时候,可能会造成服务器相应慢的问题,导致页面显示的时候会有延迟、造成闪烁的…

高通WLAN框架学习(37)-- TDLS(Tunneled Direct Link Setup)通道直接链路建立

一 TDLS概述 隧道直连设置(TDLS)基于IEEE 802.11z-2010IEEE标准802.11z标准(无线局域网介质访问控制(MAC)和物理层(PHY)规范。 TDLS允许与同一AP关联的设备之间建立直接链路。Wi-Fi Direct允许设备之间直接连接,而不需要AP。Wi-Fi联盟认证可用于IEEE 802.11a和802.11g设备的T…

[SQL挖掘机] - WHERE语句

介绍: 往往我们在获取数据的时候, 会有一些限制条件, 这些限制条件很多就是需要通过where进行体现. 当我们在进行数据库查询时, 有时候我们需要从表中筛选出符合特定条件的数据. 这时就可以使用 where 子句来添加一个条件, 以便只选择满足条件的数据行. where 子句用于在查询…

如何创建vue2,vue3项目

前提需安装node.js和Vue CLI node.js:https://nodejs.org/zh-cn Vue CLI: npm install -g vue/cli 如何创建一个vue2项目 (1) 使用cmd终端直接创建 进入到vue项目所创建的目录里(我是直接创建在桌面上) 选择vue2 …

入局元宇宙,所谓的无限可能到底在哪里?

最近的热点新闻表明,人们似乎认为元宇宙已经走向“死亡”。但实际上,市场应该重新定义对元宇宙的看法,以及正视它最大的机会所在——游戏领域。 1937年5月6日,一架名为兴登堡号的巨大氢能齐柏林飞艇飞临新泽西州曼彻斯特镇上空&a…

学好Linux的必经之路

学习动机的培养对于一个人学习习惯的形成有着重要的作用。当我们在学习某一个事物时,建立属于我们自己的学习方法,以此培养我们学习Linux系统的学习动机。 当前,Linux系统属于热门的计算机操作系统,因此学习Linux显得重要起来。同…

面试题汇总——设计模式

简单介绍 设计模式共有23种,创建型模式5种,结构型模式7种,行为型模式11种 创建型: 关注对象的创建过程,将对象的创建和使用分开,在使用对象时无须知道对象的创建细节。对象实例化的模式,创建型模式用于解耦对象的实例化过程。单例模式、工厂方法模式、抽象工厂模式、建造…