【Java】Spring更简单的读取和存储

news/2024/4/20 6:22:53/文章来源:https://blog.csdn.net/qq_63474430/article/details/129189863

文章目录

  • Spring更简单的读取和存储对象
    • 1. 存储Bean对象
      • 1.1 前置工作:配置扫描路径
      • 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 Bean命名规则
      • 1.4 方法注解
        • 1.4.1 方法注解要配合类注解来使用
        • 1.4.2 重命名Bean
    • 2. 获取Bean对象(对象装配)
      • 2.1 属性注入
      • 2.2 构造方法注入
      • 2.3 Setter注入
      • 2.4 三种注入的优缺点
      • 2.5 @Resource:另一种注入关键字
      • 2.6 同一个类型多个@Bean报错
    • 3. 总结

Spring更简单的读取和存储对象

我们现在已经可以实现基本的Spring读取和存储对象的操作了,但在操作过程当中。我们发现并没有那么简单。在Spring当中想要更简单的存储和使用对象的核心是使用注解接下了就了解下,如何使用注解来存储和获取Bean

1. 存储Bean对象

之前存储Bean对象,需要添加一行bean才能注册,如下图所示:

在这里插入图片描述

而现在只需要一个注解,就可以代替一行的配置,但是我们先要来点准备工作

1.1 前置工作:配置扫描路径

注意:想要把Bean成功的存储到Spring当中,我们需要配置一下存储对象的扫描包路径,只有被配置的包下的所有类,添加了注解才能被正确识别并保存到Spring当中

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

在这里插入图片描述

圈起来的是扫描路径,表示所有要存放到Spring中的Bean的根目录

1.2 添加注解存储Bean对象

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

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

接下来,分别来看:

1.2.1 @Controller(控制器存储)

@Controller
public class UserController {public void sayHi() {System.out.println("你好Controller");}
}

这时我们按照之前的方法获取到Spring中的Bean

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

1.2.2 @Service(服务存储)

@Service
public class UserService {public void sayHi() {System.out.println("你好Service");}
}

1.2.3 @Repository(仓库存储)

@Repository
public class UserRepository {public void sayHi() {System.out.println("你好Repository");}
}

1.2.4 @Component(组件存储)

@Component
public class UserComponent {public void sayHi() {System.out.println("你好Component");}
}

1.2.5 @Configuration

@Configuration
public class UserConfiguration {public void sayHi() {System.out.println("你好Configuration");}
}

1.3 为什么要这么多类注解

既然功能都是一样的,为什么需要这么多呢?

这和为什么每个省/市都有自己的车牌号是一样的?比如陕西车牌号就是:陕XXXXXX,北京车牌号是:京XXXXXXXX。甚至一个省不同的县区车牌号都是不一样的。这样做的好处就是节约了号码,更重要的是可以直观的标识一辆车的归属地

那么为什么需要这么多类的注解也是相同的原因,就是让程序员看到类注解之后,就直接了解当前类的用途。

让代码的可读性提高,让程序员能够直观的判断当前类的用途

比如:

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

程序的工程分层,调用流程如下:

在这里插入图片描述

1.3.1 类注解之间的关系

查看@Controller、@Service、@Repository、@Configuration等注解可以发现:<img 在这里插入图片描述

这些类注解里面都有一个注解@Component,说明它们本身就属于@Component的“子类”

1.3.2 Bean命名规则

通过场面的例子我们可以看出,通常我们bean使用的都是标准大驼峰的命名,而读取的时候首字母小写就可以获取到bean了。

然后当我们首字母和第二个字母都大写的时候,就不能正常的读取到Bean了

这个时候我们就要查询Spring关于Bean存储时生成的命名规则了在这里插入图片描述

源码如下:

public static String decapitalize(String name) {if (name == null || name.length() == 0) {return name;}if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) &&Character.isUpperCase(name.charAt(0))){return name;}char chars[] = name.toCharArray();chars[0] = Character.toLowerCase(chars[0]);return new String(chars);
}

1.4 方法注解

类注解是添加到某个类上的,而方法注解是放到某个方法当中,如以下代码实现:

public class UserBean {@Beanpublic void sayHi() {System.out.println("你好bean");}
}

但是我们发现根本获取不到。这是为什么?

1.4.1 方法注解要配合类注解来使用

在Spring框架当中,方法注解@Bean要配合类注解才能将对象正常的存储到Spring容器当中,如下代码:

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

1.4.2 重命名Bean

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

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

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

2. 获取Bean对象(对象装配)

获取bean对象也叫对象装配,是把对象取出来放到某个类当中,也时候也叫作对象注入

对象装配的实现有以下3中方法:

  1. 属性注入
  2. 构造方法注入
  3. Setter注入

2.1 属性注入

在这里插入图片描述

2.2 构造方法注入

在这里插入图片描述

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

2.3 Setter注入

在这里插入图片描述

2.4 三种注入的优缺点

  • 属性输入的优点是简介、使用方便;缺点是只能用于IOC容器,如果不是IOC容器不可用,并且只有在使用的时候才会出现NPE(空指针异常)
  • 构造方法注入是Spring推荐的注入方式。它的缺点是如果有多个注入会显得比较臃肿,但是出现这种情况应该考虑一下当前类是否符合程序的单一职责的设计模式了,它的有点在于通用性,在使用之前,一定能保证注入的类不为空
  • Setter方式是Spring前期版本推荐的注入方式,但是通用性不如构造方法,所有Spring版本已经推荐使用构造方法来注入了

2.5 @Resource:另一种注入关键字

@Autowired和@Resource的区别:

  • 出身不同:@Autowired 来自于Spring,而@Resource来自于JDK的注解
  • 使用时设置的参数不同:@Resource支持更多的参数设置,例如name设置,根据名称获取Bean
  • @Autowired可用于Setter注入、够着函数注入、属性注入,而@Resource只能用于Setter和属性注入,不用用于构造函数注入

2.6 同一个类型多个@Bean报错

解决方案有以下两种:

  • 使用@Resource(name=“user1”)定义
  • 使用@Qualifier注解定义名称
@Controller
public class UserController5 {// 注⼊@Autowired@Qualifier(value = "user2")private User user;public User getUser() {return user;}
}

3. 总结

  1. 将对象存储到Spring中:
    1. 使用类注解:@Controller、@Service、@Repository、@Configuration、@Component【它们之间的关系】
    2. 使用方法注解:@Bean【注意事项:必须配合类注解一起使用】
  2. Bean的命名规则:首字母和第二个字母都不是大写,首字母小写来获取Bean,如果首字母和第二个字母都是大写,那么直接使用Bean名来获取Bean
  3. 从Spring中获取对象
    1. 属性注入
    2. Setter注入
    3. 构造方法注入(推荐)
  4. 注入的关键字有
    1. @Autowired
    2. @Resource
  5. @Autowired 和 @Resource 区别:出身不同;使用是设置参数不同@Resource支持更多的参数设置
  6. 解决同一个类型多个Bean的报错
    1. 使用@Resource(name = “”)
    2. 使用@Qualifier(“”)

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

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

相关文章

结构建模设计——Solidworks软件之装配体操作基本总结三(高级配合、机械配合、快捷菜单功能)

【系列专栏】&#xff1a;博主结合工作实践输出的&#xff0c;解决实际问题的专栏&#xff0c;朋友们看过来&#xff01; 《QT开发实战》 《嵌入式通用开发实战》 《从0到1学习嵌入式Linux开发》 《Android开发实战》 《实用硬件方案设计》 长期持续带来更多案例与技术文章分享…

如何设计一个通用的权限管理系统

一个系统&#xff0c;如果没有安全控制&#xff0c;是十分危险的&#xff0c;一般安全控制包括身份认证和权限管理。用户访问时&#xff0c;首先需要查看此用户是否是合法用户&#xff0c;然后检查此用户可以对那些资源进行何种操作&#xff0c;最终做到安全访问。身份认证的方…

K8s调度器Scheduler

当创建k8s pod的时候调度器会决定pod在哪个node上被创建且运行&#xff0c;调度器给apiserver发出了一个创建pod的api请求&#xff0c;apiserver首先将pod的基本信息保存在etcd&#xff0c;apiserver又会把这些信息给到每个node上的kubelet进程&#xff0c;kubelet一直在监听这…

【python】anaconda 管理 python 环境

anaconda 管理虚拟环境anaconda 简介python 虚拟环境的安装查看当前 anaconda中所有的虚拟环境创建新的虚拟环境激活所创建的虚拟环境删除指定的虚拟环境退出当前虚拟环境查看当前虚拟环境中所有安装的库安装常用包pycharmpycharm 下环境配置pycharm 使用anaconda 简介 anacon…

springBoot使用ShardingJDBC实现分表

ShardingSphere的介绍 ShardingSphere是一款起源于当当网内部的应用框架。2015年在当当网内部诞 生&#xff0c;最初就叫ShardingJDBC。2016年的时候&#xff0c;由其中一个主要的开发人员张亮&#xff0c; 带入到京东数科&#xff0c;组件团队继续开发。在国内历经了当当网、…

LeetCode 622.设计循环队列

设计你的循环队列实现。 循环队列是一种线性数据结构&#xff0c;其操作表现基于 FIFO&#xff08;先进先出&#xff09;原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里&a…

注意啦!如何通过广告吸引客户直接下单?

2023年跨境电商越来越突出&#xff0c;据业内相关人士称&#xff0c;在未来几年与跨境电商相关的政策仍会继续倾斜甚至加大力度&#xff0c;因此各行各业都响应政策&#xff0c;在新政策落实之前致力于平台的转型升级&#xff0c;做新时代创新型的高质量发展&#xff0c;其实细…

Linux下的命令执行绕过技巧合集(渗透测试专用)

一、通配符* 代表『0个到无穷多个』任意字符&#xff0c;包括空字符? 代表『一定有一个』任意字符[ ] 同样代表『一定有一个在括号内』的字符(非任意字符)。例如 [abcd] 代表『一定有一个字符&#xff0c; 可能是 a, b, c, d 这四个任何一个』[ - ]若有减号在中括号内时&#…

(考研湖科大教书匠计算机网络)第六章应用层-第五节:文件传送协议FTP

获取pdf&#xff1a;密码7281专栏目录首页&#xff1a;【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一&#xff1a;概述二&#xff1a;工作原理三&#xff1a;控制连接与数据连接本节对应视频如下 【计算机网络微课堂&#xff08;有字幕无背景音乐版&#xff09;】…

求职3个月,简历大多都石沉大海,一听是手工测试都纷纷摇头....太难了

距离被上家公司裁员已经过去了3个月了&#xff0c;3个月的求职经历真的让我痛不欲生&#xff0c;我也从中理解感叹到了很多&#xff0c;想写出来&#xff0c;告诫跟我一样的经历的人。 我今年26岁&#xff0c;大学是一所普通的大专&#xff0c;学的是机电专业&#xff0c;如何…

Python自动化测试框架封装和调用

封装与调用函数与参数化前言 面实现了参数的关联&#xff0c;那种只是记流水账的完成功能&#xff0c;不便于维护&#xff0c;也没什么可读性&#xff0c;接下来这篇可以把每一个动作写成一个函数&#xff0c;这样更方便了。参数化的思维只需记住一点&#xff1a;不要写死 登录…

类与对象(this 关键字、构造器)

目录一、面向对象二、类与对象三、对象内存图四、成员变量和局部变量区别五、this关键字六、构造器/构造方法一、面向对象 一种编程思想:也就是说我们要以何种思路&#xff0c;解决问题&#xff0c;以何种形式组织代码 当解决一个问题的时候&#xff0c;面向对象会把事物抽象成…

分享app的测试技巧

前言 今天笔者想和大家来唠唠app测试&#xff0c;现在的app有非常的多&#xff0c;这些app都是需要经过测试之后才能发布到应用市场中&#xff0c;app已经成为了我们日常生活中不可或缺的一部分了&#xff0c;但它的功能必须强大&#xff0c;才能受到消费者的重视&#xff0c;…

已解决from cryptography.hazmat.backends import default_backend导包错误

已解决Python连接FTPS抛出异常&#xff1a;CryptographyDeprecationWarning: Python 3.6 is no longer supported by the Python core team. Therefore, support for it is deprecated in cryptography. The next release of cryptography (40.0) will be the last to support …

pyaudio声卡信息中hostApi是什么意思?

hostApi是声卡驱动协议&#xff0c;声卡驱动模式&#xff0c;有如下很多类。下面的类型是网上找的PortAudio的类&#xff0c;不不确定是不是python的。typedef enum PaHostApiTypeId{paInDevelopment0, /* use while developing support for a new host API */paDirectSound1,p…

深度学习之“制作自定义数据”--torch.utils.data.DataLoader重写构造方法。

深度学习之“制作自定义数据”–torch.utils.data.DataLoader重写构造方法。 前言&#xff1a; ​ 本文讲述重写torch.utils.data.DataLoader类的构造方法&#xff0c;对自定义图片制作类似MNIST数据集格式&#xff08;image, label&#xff09;&#xff0c;用于自己的Pytorc…

推荐系统从入门到入门(3)——基于MapReuduce与Spark的分布式推荐系统构建

本系列博客总结了不同框架、不同算法、不同界面的推荐系统&#xff0c;完整阅读需要大量时间&#xff08;又臭又长&#xff09;&#xff0c;建议根据目录选择需要的内容查看&#xff0c;欢迎讨论与指出问题。 目录 系列文章梗概 系列文章目录 三、MapReduce 1.MapReduce详…

【视频】海康摄像头、NVR网络协议简介

1、软硬件整体架构 2、涉及的网络协议 3、协议简介 3.1 海康私有协议 设备发现SADP:进行设备的发现、激活、修改网络参数、忘记密码等; SDK:4200、系统平台的接入前端设备,协议不对外开放,但对外提供接口库; ISAPI:Intelligent Security API(智能安全API),基于HTTP传输…

2023新的一年软件测试还值得学习吗?

最近因为疫情等各种原因&#xff0c;大厂裁员&#xff0c;失业等等频频受到关注。不解释&#xff0c;确实存在&#xff0c;各行各业都很难&#xff0c;但是&#xff0c;说软件测试行业不吃香&#xff0c;我还真不认同&#xff08;不是为培训机构说好话&#xff0c;大环境不好&a…

Odoo丨Odoo框架源码研读三:异常处理与定制化开发

Odoo丨Odoo框架源码研读三&#xff1a;异常处理与定制化开发 Odoo源码研读的第三期内容&#xff1a;异常处理与定制化开发。 *异常处理* Odoo中的Exception是对Python内置异常做了继承和封装&#xff0c;设定了自己核心的几个Exception。 而对异常的处理和Python内置异常的…