Spring【五大类注解的存储和读取Bean方法注解】

news2024/11/18 8:33:15

Spring【5大类注解的存储和读取Bean对象】

  • 🍎一. 五大类存储 Bean 对象
    • 🍒1.1 配置spring-config.xml扫描路径
    • 🍒1.2 添加五大类注解存储 Bean 对象
      • 🍉1.2.1 @Controller(控制器存储)
      • 🍉1.2.2 @Service(服务存储)
      • 🍉1.2.3 @Repository(仓库存储)
      • 🍉1.2.4 @Component(组件存储)
      • 🍉1.2.5 @Configuration(配置存储)
    • 🍒1.3 五大注解类小结
      • 🍉1.3.1 为什么使用五大类注解
      • 🍉1.3.2 五大类注解之间的关系
      • 🍉1.3.3 getBean() 命名
  • 🍎二.方法注解的存储
    • 🍒2.1 方法注解的存储
      • 🍉2.1.1 @Bean注解的使用
      • 🍉2.1.2 @Bean的的重命名
    • 🍒2.2 方法注解的获取(对象注⼊@Autowired 或 @Resource)
      • 🍉2.2.1 属性注⼊
      • 🍉2.2.2 Setter注入
      • 🍉2.2.2 构造方法注入
      • 🍉2.2.3 同⼀类型多个 @Bean 报错
  • 🍎三.总结
    • 🍒3.1小结
    • 🍒3.2 三种注⼊优缺点分析
    • 🍒3.3 @Autowired 和 @Resource 的区别

🍎一. 五大类存储 Bean 对象

上一篇博客我们已经可以实现基本的 Spring 读取和存储对象的操作了,但在操作的过程中我们发现读取和存储对象并没有想象中的那么“简单”,所以接下来我们要学习更加简单的操作 Bean 对象的⽅法

在 Spring 中想要更简单的存储和读取对象的核⼼是使⽤注解,也就是我们接下来要学习 Spring 中的相关注解,来存储和读取 Bean 对象

🍒1.1 配置spring-config.xml扫描路径

我们在resources文件下系创建一个带有.xml类型的文件,不是必须要设置成spring-config.xml这个名称的文件,只是方便我们辨识,或者工作中使用

之前我们存储 Bean 时,需要在 spring-config 中添加⼀⾏ bean 注册内容才⾏,这样会很麻烦,有可能我们在编写程序时忘记注册Bean的属性就会报错,不仅降低了工作效率,还增加了编程时产生的错误,⽽现在我们只需要⼀个注解就可以替代之前要写⼀⾏配置的尴尬了,不过在开始存储对象之前,我们先要来点准备:⼯作配置spring-config.xml扫描路径

<?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.beans"></content:component-scan>
</beans>

在这里插入图片描述

在这里插入图片描述

🍒1.2 添加五大类注解存储 Bean 对象

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

  1. 类注解@Controller、@Service、@Repository、@Component、@Configuration

🍉1.2.1 @Controller(控制器存储)

使⽤ @Controller 存储 bean 的代码如下所示:

@Controller
public class UserController {
    public void sayHi(String name){
        System.out.println("Hi"+ name);
    }
}

读取 bean 的代码:

public class Test {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
         UserController controller = context.getBean("userController",UserController.class);
        UserService service = context.getBean("userService",UserService.class);
        controller.sayHi("张三");
    }
}

在这里插入图片描述

🍉1.2.2 @Service(服务存储)

使⽤ @Service 存储 bean 的代码如下所示:

@Service
public class UserService {
    public void sayHi(String name) {
        System.out.println("Hi" + name);
    }
}

读取 bean 的代码:

public class Test {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
         UserController controller = context.getBean("userController",UserController.class);
        UserService service = context.getBean("userService",UserService.class);
        service.sayHi("李四");
    }
}

在这里插入图片描述

🍉1.2.3 @Repository(仓库存储)

以上同理

@Repository
public class UserRepository {
        public void sayHi(String name){
                System.out.println("你好:" + name);
        }
}
public class Test {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
         UserController controller = context.getBean("userController",UserController.class);
         UserService service = context.getBean("userService",UserService.class);
        UserRepository repository = context.getBean("userRepository",UserRepository.class);
//        controller.sayHi("张三");
//        service.sayHi("李四");
        repository.sayHi("王五");
    }
}

🍉1.2.4 @Component(组件存储)

以上同理

@Component
public class UserComponent {
    public void sayHi(String name){
        System.out.println("你好:" + name);
    }
}
public class Test {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
         UserController controller = context.getBean("userController",UserController.class);
         UserService service = context.getBean("userService",UserService.class);
        UserRepository repository = context.getBean("userRepository",UserRepository.class);
        UserComponent component = context.getBean("userComponent",UserComponent.class);
//        controller.sayHi("张三");
//        service.sayHi("李四");
//        repository.sayHi("王五");
        component.sayHi("赵六");
    }
}

🍉1.2.5 @Configuration(配置存储)

以上同理

@Configuration
public class UserConfiguration {
    public void sayHi(String name){
        System.out.println("你好:" + name);
    }
}
 public class Test {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
         UserController controller = context.getBean("userController",UserController.class);
         UserService service = context.getBean("userService",UserService.class);
        UserRepository repository = context.getBean("userRepository",UserRepository.class);
        UserComponent component = context.getBean("userComponent",UserComponent.class);
        UserConfiguration configuration = context.getBean("userConfiguration",UserConfiguration.class);
//        controller.sayHi("张三");
//        service.sayHi("李四");
//        repository.sayHi("王五");
//        component.sayHi("赵六");
        configuration.sayHi("七七");
    }
}

🍒1.3 五大注解类小结

🍉1.3.1 为什么使用五大类注解

在这里插入图片描述
我们拿去银行办业务举例:
@Controller层就是保安,先要进行检查验证,然后到达Service服务厅询问业务,不同的业务来到Repository,不同的窗口,然后进行相应的工作人员办理业务!

🍉1.3.2 五大类注解之间的关系

我们可以在注解类的源码内看到@Controller、@Service、@Repository、@Configuration都是继承@Component
也就是说@Component是@Controller、@Service、@Repository、@Configuration这四个类的父类
在这里插入图片描述

🍉1.3.3 getBean() 命名

我们会在前面的存储和获取对象时发现,为什么在getBean方法获取Bean对象时要将Bean对象的属性名输入为小驼峰型?
在这里插入图片描述
我们在源码就可以看出这三种情况,我就不过多解释了,大家应该都能读懂

🍎二.方法注解的存储

🍒2.1 方法注解的存储

🍉2.1.1 @Bean注解的使用

我们先创建一个班级类

@Component
public class User {
    private String name;
    private int Id;

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", Id=" + Id +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return Id;
    }

    public void setId(int id) {
        Id = id;
    }
}

之后在创建一个方法类我们要注意在定义方法Bean时也要定义五大类注解其一因为⽅法注解 @Bean 要配合类注解才能将对象正常的存储到 Spring 容器中才能获取到

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

public class Test {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        UserConfiguration configuration = context.getBean("userConfiguration",UserConfiguration.class);
        User user = (User) context.getBean("user1");
        System.out.println(user.toString());
    }
}

在这里插入图片描述

🍉2.1.2 @Bean的的重命名

可以通过设置 name 属性给 Bean 对象进⾏重命名操作,如下图所示:
在这里插入图片描述
这个重命名的 name 其实是⼀个数组,⼀个 bean 可以有多个名字:

@Bean(name = {"u1", "us1"})
public User user1() {
   User user = new User();
   user.setId(1);
   user.setName("Java");
   return user;
}

在Bean name重名的时候时区分大小写的
在这里插入图片描述

在这里插入图片描述
我们会发现会找不到bena name抛出错误
在这里插入图片描述

🍒2.2 方法注解的获取(对象注⼊@Autowired 或 @Resource)

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

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

🍉2.2.1 属性注⼊

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

public class Test {
    public static void main(String[] args) {
          UserConterller2 conterller2 = context.getBean(UserConterller2.class);
                  conterller2.sayHi();
    }
}
@Component
public class UserConterller2 {
   //对象注入方式1: 属性注入
   @Autowired
    private UserService userService;
    public void sayHi(){
        userService.sayHi("属性注入");
    }

在这里插入图片描述

🍉2.2.2 Setter注入

与上同理
在这里插入图片描述

🍉2.2.2 构造方法注入

在这里插入图片描述

🍉2.2.3 同⼀类型多个 @Bean 报错

当出现以下多个 Bean,返回同⼀对象类型时程序会报错,如下代码所示:

@Component
public class Users {
   @Bean
   public User user1() {
     User user = new User();
     user.setId(1);
     user.setName("Java");
     return user;
   }
     @Bean
     public User user2() {
     User user = new User();
     user.setId(2);
     user.setName("MySQL");
     return user;
    }
}
@Controller
public class UserController4 {
   // 注⼊
   @Resource
   private User user;
   public User getUser() {
     return user;
   }
}

以上程序的执⾏结果如下:
在这里插入图片描述
报错的原因是,⾮唯⼀的 Bean 对象

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

同⼀类型多个 Bean 报错处理

🍎三.总结

🍒3.1小结

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

🍒3.2 三种注⼊优缺点分析

●属性注⼊的优点是简洁,使⽤⽅便;缺点是只能⽤于 IoC 容器,如果是⾮ IoC 容器不可⽤,并且只有在使⽤的时候才会出现 NPE(空指针异常)

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

●Setter ⽅式是 Spring 前期版本推荐的注⼊⽅式,但通⽤性不如构造⽅法,所有 Spring 现版本已经推荐使⽤构造⽅法注⼊的⽅式来进⾏类注⼊了

🍒3.3 @Autowired 和 @Resource 的区别

●出身不同:@Autowired 来⾃于 Spring,⽽ @Resource 来⾃于 JDK 的注解

●使⽤时设置的参数不同:相⽐于 @Autowired 来说,@Resource ⽀持更多的参数设置,例如name ,type设置,根据名称获取 Bean

●注入方法数不同: @Autowired 可⽤于 Setter 注⼊、构造函数注⼊和属性注⼊,⽽ @Resource 只能⽤于 Setter 注⼊和属性注⼊,不能⽤于构造函数注⼊

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

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

相关文章

ADAU1860调试心得(14)单片机启动与控制ADAU1860详解

ADAU1860实现脱机运行&#xff0c;是开发这个DSP的最后一步。这颗芯片有一颗HIFI 3Z的蓝牙MCU内嵌&#xff0c;用户可以用这颗MCU来进行脱机&#xff0c;甚至直接用C来开发1860&#xff08;有专门的SDK&#xff0c;不在此做更多阐述&#xff09;&#xff0c;但是这个HIFI 3Z的软…

零代码使用air32做USB转串口

零代码实现USB转串口 环境搭建参考Air32F103使用手册 创建工程 新建工程 选择设备为AIR32F103CB 在弹出的RTE窗口勾选如下组件 配置工程 修改编译器为AC5&#xff0c;并启用MicroLIB 启用C99标准支持 添加代码 添加功能代码&#xff0c;在Source Group文件夹右键&#xff…

观测云产品更新|应用性能新增服务清单功能;用户访问监测 Session 查看器调整;事件新增移动端跳转选项等

观测云更新 应用性能新增服务清单功能 应用性能监测服务清单&#xff0c;支持实时查看不同服务的所有权、依赖关系、性能、关联的仪表版以及关联分析&#xff0c;快速发现和解决服务的性能问题&#xff0c;帮助团队高效地构建及管理大规模的端到端的分布式应用。 更多详情可…

FineReport可视化数据图表- 函数计算组成和语法示例

1.1设计报表 例如&#xff0c;使用内置数据集「销量」创建数据集ds1&#xff0c;对不同地区销量高低做判断。 将「地区」字段拖入 A2&#xff0c;将「销量」字段拖入B2&#xff0c;并设置「销量」展示方式为求和&#xff0c;然后对不同地区的销量情况进行求和&#xff0c;如下…

【吴恩达机器学习笔记】九、机器学习系统的设计

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4e3;专栏定位&#xff1a;为学习吴恩达机器学习视频的同学提供的随堂笔记。 &#x1f4da;专栏简介&#xff1a;在这个专栏&#xff0c;我将整理吴恩达机器学习视频的所有内容的笔记&…

Allegro如何用list文件抓取器件操作指导

Allegro如何用list文件抓取器件操作指导 Allegro支持list文件在PCB上抓取器件,具体操作如下 在pcb相同目录下新建一个后缀为.lst文件,任意命名一个名字比如123.lst 原理图中批量选择需要抓取器件的信息,支持批量选择,无用的信息框选进去也是可以的 复制到新建lst文件中去…

主流嵌入式操作系统有哪些

嵌入式操作系统EOS(Embedded OperatingSystem)是一种用途广泛的系统软件&#xff0c;过去它主要应用于工业控制和国防系统领域。常见的嵌入式操作系统有wince、PALM OS、linux、Android、FreeRTOS。 WINDOWS CE是微软开发的一个开放的、可升级的32位嵌入式操作系统&#xff0c;…

【Matplotlib绘制图像大全】(二十六):Matplotlib读取本地图像

前言 大家好,我是阿光。 本专栏整理了《Matplotlib绘制图像大全》,内包含了各种常见的绘图方法,以及Matplotlib各种内置函数的使用方法,帮助我们快速便捷的绘制出数据图像。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmMatp…

基于SpringBoot和Vue的厨到家服务平台的设计与实现毕业设计源码063133

springboot厨到家服务系统 摘 要 在社会快速发展的影响下&#xff0c;餐饮迅速发展&#xff0c;大大增加了餐饮服务信息管理的数量、多样性、质量等等的要求&#xff0c;使餐饮的管理和运营比过去十年更加困难。依照这一现实为基础&#xff0c;设计一个快捷而又方便的厨到家服…

十二条后端开发经验分享,纯干货

前言 本文是博主从事后端开发以来&#xff0c;对公司、个人项目的经验总结&#xff0c;包含代码编写、功能推荐、第三方库使用及优雅配置等&#xff0c;希望大家看到都能有所收获 博主github地址: github.com/wayn111 一. 优雅的进行线程池异常处理 在Java开发中&#xff0c…

【Recurrent Neural Network(RNN)】循环神经网络——李宏毅机器学习阅读笔记

Recurrent Neural Network(RNN) Example Application Slot Filling 智慧订票系统&#xff1a; How to represent each word as a vector? 但是光这样&#xff0c;feedforward Network是无法solve这一问题的&#xff0c;因为他无法区别是leave Taipei还是arrive Taipei。…

stable diffusion webui安装部署教程

系统环境&#xff1a; 腾讯云服务器&#xff0c;centos 7.6 基础环境安装 git 安装&#xff08;直接安装高版本的&#xff09; (默认安装的是1.8 版本的。没有 -c 命令&#xff0c;需要升级&#xff09; 参考&#xff1a; https://blog.csdn.net/qq_28903377/article/detai…

[附源码]Python计算机毕业设计SSM康健医药公司进销存管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[附源码]Python计算机毕业设计SSM酒店入住管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

计算机视觉专家:如何从C++转Python

有人说用 Python 编程很简单&#xff0c;6 岁小孩都能学会。计算机视觉专家和编程语言爱好者 asya f 刚开始上手 Python 时也这么想。但门槛低就仅意味着使用简单吗&#xff1f;经常调用 API 的人是不是一定比可以从零写出源码的人菜&#xff1f;在本文中&#xff0c;asya f 告…

数据生产流程——采集、清洗、分析

大家好&#xff0c;这里是小安说网控。 前几篇文章&#xff0c;我们分享了线上价格监测的重要性以及注意事项。数据监测是如何将平台上海量的数据转换为有价值的营销情报的呢&#xff1f;今天&#xff0c;我们来一个数据生产流程大揭秘&#xff01; 一、 数据采集 数据采集就是…

2022腾讯数字生态大会:腾讯云HiFlow,零代码自动化工作流助手

2022腾讯数字生态大会&#xff0c;在主题为“数字化叠变、全域新协作”的腾讯云SaaS连接专场上&#xff0c;多款产品重磅发布。 未来企业数字化转型的越来越多的使用saas是一个趋势&#xff0c;那么如何解决SaaS之间的互联互通和数据孤岛&#xff1f;腾讯云HiFlow的业务负责人…

嵌入式通用const和volatile和static inline关键字 (volatile寄存器地址修饰必不可少)

const和volatile之间的合作【1】const修饰变量【2】const修饰数组【3】const修饰指针【4】const修饰函数【5】volatile的应用【6】volatile详解【7】const和volatile配合【8】AHB (高级高性能总线)【9】APB (高级外围总线)在学习ADC之前掌握这些 #define __IO volatile …

iPayLinks艾贝盈上线委托换汇功能!

“8.11”汇改以来&#xff0c;人民币汇率市场化形成机制逐步完善&#xff0c;人民币汇率弹性不断增强&#xff0c;双向波动成为常态。 在市场化的汇率形成机制下&#xff0c;外贸人想要快、准、稳地选到合适汇率&#xff0c;降低汇损提高利润&#xff0c;仅靠自己难以实现。 …

模拟电路设计(36)---谐振型变换器

谐振型变换器 今天来介绍下谐振型变换器。脉宽调制型通过控制开关管的导通占空比来调节输出电源功率&#xff0c;而谐振型变换器以正弦形式处理功率开关管&#xff0c;使得开关管在零电流或者在零电压的情况下实现导通和关闭&#xff0c;从而降低开关功耗&#xff0c;提高变换…