探秘Spring中Bean的注解宝典:解读存取Bean的相关注解及用法

news2024/11/26 10:20:56

目录

  • 存储Bean对象
    • @Controller(控制器存储)
    • @Service(服务存储)
    • @Repository(仓库存储)
    • @Component(组件存储)
    • @Configuration(配置存储)
    • Bean
      • 重命名Bean
  • 获取Bean对象
    • 属性注入
    • 构造方法注入
    • Setter注入
    • @Resource(注入关键字)

存储Bean对象

将对象存储在 Spring 中,有两种注解类型可以实现:

  1. 类注解:@Controller、@Service、@Repository、@Component、@Configuration
  2. 方法注解:@Bean

@Controller(控制器存储)

如下使用@Controller存储Bean代码:

@Controller
        public class UserController {
        public void SayHi(String name){
        System.out.println("你好"+name);
    }
}

使用获取上下文的方法获取上面存储的对象

public class Test {
    public static void main(String[] args) {
        //获取spring上下文
     ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml");
    //获取指定的Bean对象名称+类型进行获取
      UserController userController =  (UserController) applicationContext.getBean("userController");
      userController.SayHi("zcx");
    }
}

效果为
在这里插入图片描述

@Service(服务存储)

如下使用@Service存储Bean代码:

@Service
public class UserService {
    public void SayHi(String name){
        System.out.println("你好"+name);
    }
}

输出结果跟@Controller一样

@Repository(仓库存储)

如下使用@Repository存储Bean代码:

@Repository
public class UserRepository {
    public void SayHi(String name){
        System.out.println("你好"+name);
    }
}

@Component(组件存储)

如下使用@Component存储Bean代码:

@Component
public class UserComponent {
    public void SayHi(String name){
        System.out.println("你好"+name);
    }
}

@Configuration(配置存储)

如下使用@Configuration存储Bean代码:

@Configuration
public class UserConfiguration {
    public void SayHi(String name){
        System.out.println("你好"+name);
    }
}

需要这么多类注解是让程序员看到类注解之后,就能直接了解当前类
的⽤途,比如:

  • @Controller:表示的是业务逻辑层
  • @Servie:表示的是服务层
  • @Repository:表示的是持久层
  • @Configuration:表示的是配置层

Bean

⽅法注解是放到某个⽅法上的要配合类注解使⽤,如以下代码的实现:

@Controller
public class Users {
    @Bean
    public User user1(){
        User user = new User();
        return user;
    }
}

public class Test {
    public static void main(String[] args) {
        //获取spring上下文
     ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml");
    //获取指定的Bean对象名称+类型进行获取
    User user =  (User) applicationContext.getBean("user1");
      user.sayHi("zcx");
    }
}

user类

@Component
public class User {

    public void sayHi(String name){

        System.out.println(name+"你好");
    }

}

结果
在这里插入图片描述

重命名Bean

可通过设置 name 属性给 Bean 对象进⾏重命名操作

@Bean(name = {"u1", "us1"})
public User user1() {
User user = new User();
return user;
}

或者

@Bean(name = {"u1", "us1"})
public User user1() {
User user = new User();
return user;
}

获取Bean对象

获取Bean对象就是把对象取出来放入某个类中,也叫对象注入或者对象装配。
对象注入有三种实现方法:

  1. 属性注⼊
  2. 构造⽅法注⼊
  3. Setter 注⼊

下⾯我们按照实际开发中的模式,将 Service 类注⼊到 Controller 类中

属性注入

属性注⼊是使⽤ @Autowired 实现的,实现代码如下:

@Service
public class UserService {

    public User user1(){
        User user = new User();
        return user;
    }
}

@Controller
public class UserController {
    @Autowired
    private UserService userService;
    public User getUser(){
 return userService.user1();
    }
}

public class Test {
    public static void main(String[] args) {
        //获取spring上下文
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml");
        //获取指定的Bean对象名称+类型进行获取
        UserController userController = applicationContext.getBean(UserController.class);
      userController.getUser().sayHi("zcx");
    }
}

在这里插入图片描述

构造方法注入

构造⽅法注⼊是在类的构造⽅法中实现注⼊,实现代码如下:

@Controller
public class UserController {
    private UserService userService;
    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }
    public User getUser(){
 return userService.user1();
    }
}

其余代码写法跟属性注入一样

Setter注入

在设置 set ⽅法的时候需要加上 @Autowired 注解

@Controller
public class UserController {
    private UserService userService;
    @Autowired
    public void SetUserController(UserService userService) {
        this.userService = userService;
    }
    public User getUser(){
 return userService.user1();
    }
}

@Resource(注入关键字)

@Controller
public class UserController {
    @Resource
    private UserService userService;
    public User getUser(){
 return userService.user1();
    }
}

使用@Resource 可以解决同⼀类型多个 Bean 报错问题
可以如下设置方法名

@Resource(name = "user1")

@Autowired 和 @Resource 的区别

  • 出身不同:@Autowired 来⾃于 Spring,⽽ @Resource 来⾃于 JDK 的注解
  • 使⽤时设置的参数不同:相⽐于 @Autowired 来说,@Resource ⽀持更多的参数设置,例如name 设置,根据名称获取 Bean
  • @Autowired 可⽤于 Setter 注⼊、构造函数注⼊和属性注⼊,⽽ @Resource 只能⽤于 Setter 注⼊和属性注⼊,不能⽤于构造函数注⼊

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

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

相关文章

00_ubuntu_开发环境的搭建

ubuntu 的版本22.04 2023-07-21 1.卸载firefox dpkg --get-selections |grep firefox // 查看安装包的信息 sudo apt-get purge firefox firefox-locale-en firefox-locale-zh-hans // 卸载相应的包 2.下载google安装包并安装 wget https://dl.google.com/linux/direct/goo…

【Window系统】安装FFmpeg教程

目录 1、下载FFmpeg 2、配置环境变量 3、检验和测试 1、下载FFmpeg 两个下载路径: Github直链下载:Releases BtbN/FFmpeg-Builds (github.com)蓝奏云下载:ffmpeg-n5.0-latest-win64-lgpl-shared-5.0.zip - 蓝奏云 2、配置环境变量 将…

15matlab数据分析多项式的相乘和相除(matlab程序)

1.简述 xlsread和xlswrit函数 在MATLAB中经常会用到数据的读取,首先是从Excel中读取数据到MATLAB中去。下面给出原始Excel数据内容: 在MATLAB读取结果如下: mxlsread(fanjufei.xls,1,A1:C3)m 1 2 3 4 5 6 …

yum镜像源更新很慢,不管是阿里源还是清华源

今天想要再Centos7上安装docker测试,但是发现不管是阿里源还是清华源 yum makecache都更新的特别慢。有大佬知道啥原因不? 坐标成都,联通宽带300M

W801 ADC功能,基于CDK Demo以及Arduino平台测试

W801 ADC功能,基于CDK Demo以及Arduino平台测试 🌼W801开发板(HLK-W801 详细资料见:https://h.hlktech.com/Mobile/download/fdetail/170.html) 📓W801 ADC简介 📑集成 4 路 12 比特 ADC&…

华为eNSP:ospf的配置

一、拓扑图 二、路由器的配置 1、路由器依据规划配置接口IP AR1: <Huawei>system-view [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 10.10.10.1 24 [Huawei-GigabitEthernet0/0/0]qu AR2: <Huawei>system-view [Huawei]int g0/0/0 [Huawei-Gi…

sql:是否在时间段内

判断给定时间是否在区间内&#xff0c;由于结束时间可能为空&#xff0c;若为空表示长期&#xff1b;希望在 end_date 可以延长180天作为最终的 end_date -- okAND ((ic.price_end_date is null and ic.price_start_date < 2022-01-22) or (ic.price_end_date is not null …

C++ GDAL找出多时相遥感影像缺失的日期并自动生成新的全零图像作为替补

本文介绍基于C 语言的GDAL库&#xff0c;基于一个存储大量遥感影像的文件夹&#xff0c;依据每一景遥感影像的文件名中表示日期的那个字段&#xff0c;找出这些遥感影像中缺失的成像日期&#xff0c;并新生成多个像元值全部为0的栅格文件&#xff0c;作为这些缺失日期当日的遥感…

PHP8知识详解:PHP语言优势

PHP起源于自由软件&#xff0c;并且得到了不断的迭代更新&#xff0c;在web开发领域独领风骚&#xff0c;得到了广大使用者的喜爱&#xff0c;PHP作为一款优秀的脚本语言&#xff0c;具有以下优势&#xff1a; 1、源码开源&#xff1a;所有的PHP源代码&#xff0c;你都能从PHP官…

HTTP 什么样的响应才会被缓存

下面来讨论什么样的响应会被缓存&#xff0c;以及使用好已经缓存好的条件是什么。 缓存分为两步&#xff0c;首先将响应缓存下来&#xff0c;第二步将要发起一个请求的时候检查当前缓存是否可以使用缓存了的响应。 (1) 请求方法可以被缓存理解&#xff08;不只于 GET 方法&…

【游戏行业部】反外挂技术的革新:如何有效应对 FPS 外挂的威胁

FPS 游戏外挂现状和泛滥原因 在线多人的 FPS 游戏是实时性要求最高的游戏类型之一。在这种游戏中&#xff0c;玩家的一瞬间判断和反应能力会直接决定胜负。然而&#xff0c;网络延迟和实时加载的问题经常会导致游戏卡顿&#xff0c;这会极大地影响玩家的游戏体验。为了解决这个…

Java-WebSocket

请点击下面工程名称&#xff0c;跳转到代码的仓库页面&#xff0c;将工程 下载下来 Demo Code 里有详细的注释 TestWebSocket

解读Lawyer LLaMA,延申专业领域大模型微调:数据集构建,模型训练

解读Lawyer LLaMA&#xff0c;延申自己领域大模型微调&#xff1a;数据集构建&#xff0c;模型训练 项目地址link 自己领域的大模型微调&#xff0c;实现思路大都和这篇文章是一样的&#xff0c;有的是基于LLaMA,或者有的是基于Chinese-LLaMA,或者是其他开源的大模型&#xf…

对话网心科技李浩| 携“边缘云+AI”之势,深入拓展算力业务场景落地

// 以ChatGPT为代表的人工智能的应用正加快改变人们的生活和工作方式&#xff0c;各种AI的应用引发了新一轮的音视频内容的生产力革命。而伴随着海量的音视频内容的生成&#xff0c;大量的内容会在边侧创建和存储&#xff0c;并在边端完成计算和分发。网心科技持续专注边缘云…

【论文阅读】2020ECCV-DFDNet

Blind Face Restoration via Deep Multi-scale Component Dictionaries 中文&#xff1a;基于深度多尺度分量字典的盲人脸复原 paper&#xff1a; code&#xff1a;https://github.com/csxmli2016/DFDNet 摘要&#xff1a; 近年来&#xff0c;基于参考的人脸恢复方法因其在真…

windows系统修改mysql8配置文件,关闭ssl验证

如何寻找配置文件 我的电脑&#xff0c;右键&#xff0c;管理&#xff0c;服务 找到MySQL8 右键&#xff0c;属性 找到配置文件位置 通常情况下的默认路径是&#xff1a; C:\ProgramData\MySQL\MySQL Server 8.0\my.ini 如何关闭SSL验证 打开 my.ini 配置内容如下&#x…

JAVA基础-集合的工具类Collections

目录 引言 一&#xff0c;Collections工具类的操作方法方法 1&#xff0c;排序操作 2&#xff0c;替换 和 查找操作 二&#xff0c;Collections工具类的使用 2.1&#xff0c;排序操作 2.1.1&#xff0c;集合的逆序 2.1.2&#xff0c;集合的随机排序 2.1.3&#xff0c;集…

第一百一十三天学习记录:C++提高:类模板(黑马教学视频)

类模板 类模板语法 类模板作用&#xff1a; 建立一个通用类&#xff0c;类中的成员 数据类型可以不具体定制&#xff0c;用一个虚拟的类型来代表。 语法&#xff1a; template<typename T> 类解释&#xff1a; template … 声明创建模板 typename … 表面其后面的符号…

SpringCloud nacos 集成 gateway ,实现动态路由

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

LeetCode刷题笔记 - 859. 亲密字符串

LeetCode刷题笔记 - 859. 亲密字符串 运行结果 题目注意点 bool buddyStrings(char* s, char* goal) {char d 0;char gd 0;int pair 0;int epair 0;char map[256] {0};if (strlen(s) ! strlen(goal)) {return false;}while (*s ! \0) {if (*s ! *goal) {if (d 0) {d *s;…