Spring 更简单的读取和存储对象、使用注解存取对象

news2024/9/30 1:43:09

文章目录

  • 1.前言
  • 2.存储 Bean对象
    • 2.1 前置任务:配置扫描路径(重中之重)
    • 2.2 添加注解存储 Bean 对象
      • 2.2.1 类注解
      • 2.2.2 方法注解 @Bean
  • 3.获取 Bean对象
    • 3.1 属性注入
    • 3.2 构造方法注入
    • 3.3 Setter 注⼊
    • 3.4 三种注释的优缺点
    • 3.5 另⼀种注⼊关键字:@Resource

1.前言

我们知道物件都会随着时代的发展,越变越简单的。Spring 框架也不意外;我们在之前存储Bean对象是在配置文件中添加<bean></bean>来存入Bean对象到Spring当中的,使用那个类对象就要存入那个,一个两个类对象还好,如果需要的对象多了,就会非常麻烦。现在,随着 Spring 发展不用再担心这个了,我们可以通过配置轻松解决这件事。往下看,看看怎么个事吧!

2.存储 Bean对象

2.1 前置任务:配置扫描路径(重中之重)

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

注意:想要将对象成功的存储到 Spring 中,我们需要配置⼀下存储对象的扫描包路径(base-package=""这个选项),只有被配置的包下的所有类,添加了注解才能被正确的识别并保存到 Spring 中。

2.2 添加注解存储 Bean 对象

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

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

2.2.1 类注解

在类注解中虽然它们的五个名字各不相同,但是他们的作用都是一样的,一会解释为啥这样设计;并且这里面@Component是其他四个类注解的父类。

注:它们五个作用是一样,这里举例就用五个类注解其中一个来举例了,这里使用@Controller。如果想验证它们是否作用一样,可以将例子代码的@Controller换成其他类注解验证。

例子:
将 Bean对象 存储到 Spring 的代码:

@Controller //将对象存储到 Spring 中
public class UserController {
    public void sayHi() {
        System.out.println("唱跳rap");
    }
}

我们可以在启动项中验证一下是否放入成功,如何验证呢?那就是我们在 Spring 中去取存入的对象看能不能取出来就行了。代码如下:

public class App {

    public static void main(String[] args) {
        //1.加载 Spring 上下文
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        //2.取对象
        UserController userController = context.getBean("userController", UserController.class);
        //3.使用 Bean对象
        userController.sayHi();
    }
}

看控制台非常成功的完成了唱跳rap,这样证明我们完成使用@Controller将 Bean对象存储到了Spring当中了:
在这里插入图片描述

✨五大类注解作用一样,为啥不合并?
既然功能一样,为啥需要那么多的类注解呢?
这里举一个特别好理解的例子,我们知道咱国家的车牌号组成是 城市名称缩写+ 字母+编号 ,就像我们开封的就是 豫 B: ×××××× ,我们首都就是 京:×××××× 。我们看车票号就能看出来它是哪里的。五大类注解也是这样,有五大类注解,我们看到那个注解就知道这个注解是使用在那个范围的!

这里说到了五大类注解使用范围不一样,那就看看它们使用范围:
五大类注解用途:

  1. @Controller(控制器):归属于业务逻辑层,用来控制用户的行为,它用来检查用户参数的有效性。
  2. @Service(服务):归属于服务层,调用持久化类实现相应的功能。【不直接和数据库交互的,它类似于控制中心】
  3. @Repository(仓库):归属于持久层,是直接和数据库进行交互的。通常每一个表都会对应一个@Repository
  4. @Configuration(配置):归属于配置层,是用来配置当前项目的一些信息。
  5. @Component(组件):归属于公共工具类,提供某些公共方法。

五大类分工不同,那它们是如何串联起来工作的呢?看下方:
在这里插入图片描述

2.2.2 方法注解 @Bean

类注解是添加到某个类上的,而方法注解是放到某个⽅法上的,只使用 @Bean是不能完成对象的存储的,需要配合五大类注解使用才能存储成功,使用方法如下:

存储对象过程:

@Component
public class UserBeans {
    @Bean
    public User user1() {
        //这里是伪代码
        User user =new User();
        user.setId(1);
        user.setName("张三");
        return user;
    }
}

这里注意,@Bean存储的是方法的返回值,比如上面这个方法,它存入就是方法中newuser这个实例对象。

在使用@Bean时,可以通过设置 name 属性给 Bean 对象进⾏重命名操作,如下代码:

@Component
public class UserBeans {
    @Bean(name = {"u1","u2"})
    public User user1() {
        //这里是伪代码
        User user =new User();
        user.setId(1);
        user.setName("张三");
        return user;
    }
}

可以看出这个name属性是个数组,因此我们可以给这个方法其很多个别名;这里起是别名,因此使用原来的名字user1也是可以取到这个对象的,也就是说,现在这个对象有三个名字分别是u1u2user1

3.获取 Bean对象

获取 bean 对象也叫做对象装配(对象注入),是把对象取出来放到某个类中,就是我们原原来写的成员变量,我们可以给他赋值,现在只是将赋值的这个过程给到 Spring 了。

对象装配(对象注入)的实现方法有三种:

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

下面我们通过三种不同的实现方法,将Service类注入到Controller类中。

这里需要有前置工作,就是将Service类先存入到 Spring 当中,代码如下:

@Service
public class UserService {
    public User getUser(int id) {
    // 伪代码,不连接数据库
        User user = new User();
        user.setId(id);
        user.setName("Java-" + id);
        return user;
    }
}

3.1 属性注入

注入代码如下:

public class UserController {
    //属性注入
    @Autowired
    private UserService userService;
    public User getUser(int id) {
        return userService.getUser(id);
    }
}

3.2 构造方法注入

注入代码如下:

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

注意:如果只有⼀个构造⽅法,那么 @Autowired 注解可以省略;但是如果类中有多个构造⽅法,那么需要添加上 @Autowired 来明确指定到底使⽤哪个构造⽅法,否则程序会报错.

3.3 Setter 注⼊

Setter 注⼊和属性的 Setter ⽅法实现类似,只不过在设置 set ⽅法的时候需要加上 @Autowired 注解

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

3.4 三种注释的优缺点

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

3.5 另⼀种注⼊关键字:@Resource

在进⾏类注⼊时,除了可以使⽤ @Autowired 关键字之外,我们还可以使⽤ @Resource 进⾏注⼊。

🎉 @Autowired 和 @Resource 的区别

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

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

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

相关文章

python学习——时间序列

目录 1 生成时间1.1 pd.Timestamp1.2 pd.to_datetime 最常用1.2.1 单个转换为时间戳1.2.2 多个时间转换为时间戳1.2.3 日期在前 dayfirst1.2.4 处理特殊格式 format1.2.5 处理无效时间 errors1.2.6 和timestamp互转 1.3 固定跨度时间的生成 pd.date_range 2 时间格式转换 .dt.s…

AI工具在不同领域的应用范围分享,让我们一起了解

随着人工智能技术的不断发展&#xff0c;越来越多的领域开始应用AI工具来解决问题、提高效率和创造力。无论是在医疗、金融、教育还是其他行业&#xff0c;AI工具都展现出了巨大的潜力和价值。今天&#xff0c;我将分享一些常见的AI工具在不同领域的应用范围&#xff0c;让我们…

Consul:什么是Consul? ①

一、思想 微服务、分布式应用的特点就是拆分&#xff0c;拆分带来的问题就是服务器数量成倍增多&#xff0c;两个很重要的原因&#xff0c;需要抽离出来一个项目专门管理这些服务信息。 1、对信息的管理思想&#xff0c;统一化、中心化一直是一套比较常规成熟的标准。 2、并且它…

开源工具系列8:Spring Security

Spring Security 是一套认证授权框架, 支持认证模式如 HTTP BASIC 认证头 (基于 IETF RFC-based 标准), HTTP Digest 认证头 ( IETF RFC-based 标准), Form-based authentication (用于简单的用户界面), OpenID 认证等, Spring Security使得当前系统可以快速集成这些验证机制亦…

Matplotlib---等高线图

1. 等高线图 等高线图&#xff1a;也称水平图&#xff0c;是一种在二维平面上显示 3D 图像的方法。 x np.linspace(-5, 5, 100) y np.linspace(-5, 5, 100)# 将上述数据变成网格数据形式 X, Y np.meshgrid(x, y)# 定义Z与X, Y之间的关系 Z np.sqrt(X**2 Y**2)# 画等高线…

Win11 系统Java17的安装教程:最新版JDK 17.07下载、安装、卸载详解

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

如何利用AI高效率快速调色

在设计行业中&#xff0c;时间是非常宝贵的资源&#xff0c;而设计师们常常需要应对繁忙的工作日程和紧迫的截止日期。为了提高工作效率和节省时间&#xff0c;越来越多的设计师开始利用人工智能&#xff08;AI&#xff09;技术中的高效调色功能。本文将介绍如何利用AI高效率快…

震惊!国产AI模特已经可以做到这个程度了,未来可期

自从GhatGPT火了之后 AI就成为网络热词 并且渗透到各行各业中 你敢相信下面这些图模特图 竟然都是AI生成的&#xff01; 简直不要太逼真 这次AI真的可以取代一部分模特了 假人模特 神采PromeAI生成 神采PromeAI生成 从生成效果来看 AI模特已非常接近真人 对于电商企业或…

springboot开发PC端桌面应用

一、需求描述&#xff1a; 1、要求桌面能在window、Linux和macos系统上运行 2、用户自定义数据筛选策略&#xff0c;策略可通过excel导入导出 3、选择多个excel文件通过策略过滤生成新的excel 二、技术选型及集成环境配置&#xff1a; 1、PC端跨平台直接选用javafx来作为桌…

go实现的简单压测工具

1、参数概览 依赖github.com/ddliu/go-httpclient进行http接口请求 依赖github.com/antlabs/pcurl解析curl 输入参数&#xff1a; -c&#xff0c;concurrency&#xff0c;并发数&#xff0c;启动协程数-n&#xff0c; totalNumber&#xff0c;单个协程发送的请求个数-u&…

Zookeeper源码解析(上)

序&#xff1a; Zookeeper最早起源于雅虎研究院的一个研究小组&#xff0c; 在当时&#xff0c; 研究人员发现&#xff0c;在雅虎内部有很大大型的系统都是需要一个依赖一个类似的系统来进行分布式协调&#xff0c;但是在系统往往都存在分布式单点问题&#xff0c;所以雅虎的开…

佩戴舒适度极好的蓝牙耳机推荐,五款佩戴舒适的蓝牙耳机推荐

​说到真无线蓝牙耳机&#xff0c;很多人会问音质表现好不好&#xff0c;佩戴上耳舒适性怎么样&#xff1f;等等问题。面对这些常会问的问题&#xff0c;我总结出来&#xff0c;也整理出来几款质量好、佩戴舒适的蓝牙耳机给大家&#xff0c;来看看有哪些。 一、南卡OE PRO开放…

安装SSL证书会拖慢网站访问速度吗?

&#x1f482; 个人网站:【海拥】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 前言什么是SSL证书SSL证…

Python程序设计基础:程序流程控制(一)

文章目录 一、条件表达式1、关系运算符2、逻辑运算符3、条件表达式 二、选择结构1、单分支结构if语句2、双分支结构if-else语句3、多分支结构if-elif-else语句4、嵌套的if结构 一、条件表达式 程序流程的基本结构主要有三种&#xff0c;顺序结构、选择结构和循环结构&#xff…

5.3.3 绝对路径与相对路径

除了需要特别注意的FHS目录配置外&#xff0c;在文件名部分我们也要特别注意。因为根据文件名写法的不同&#xff0c;也可将所谓的路径&#xff08;path&#xff09;定义为绝对路径&#xff08;absolute&#xff09;与相对路径&#xff08;relative&#xff09;。 这两种文件名…

Java IO 学习总结(五)OutputStreamWriter

Java IO 学习总结&#xff08;一&#xff09;输入流/输出流 Java IO 学习总结&#xff08;二&#xff09;File 类 Java IO 学习总结&#xff08;三&#xff09;BufferedInputStream Java IO 学习总结&#xff08;四&#xff09;BufferedReader 缓冲字符流 Java IO 学习总结&…

JDK HTTPS 400错误 微软数据湖数据拉取(DataLake Landing Zone API)避坑指南

文章目录 坑1&#xff1a;微软Azure数据湖landing zone API不支持TLSv1.1协议注意JDK1.8高版本 坑2&#xff1a;拉取的文件内容开头带BOM 数据湖号称新一代数据仓库产品。数据被写进数据湖文件之后会被自动同步到landing zone&#xff0c;可以通过landing zone API读取文件内容…

一文梳理清楚 Python OpenCV 的知识体系

本篇文章为你详细罗列 Python OpenCV 的学习路线与重要知识点。核心分成 24 个小节点&#xff0c;全部掌握&#xff0c;OpenCV 入门阶段就顺利通过了。 1. OpenCV 初识与安装 本部分要了解 OpenCV &#xff08;Open Source Computer Vision Library&#xff09;的相关简介&…

常见的性能测试缺陷

目录 前言&#xff1a; 性能测试缺陷分类 一、硬件 二、网络 三、应用 四、配置 五、数据库 六、中间件 前言&#xff1a; 性能测试是测试系统在特定条件下的响应时间、并发用户数、吞吐量、内存使用率、CPU利用率、网络延迟等各项指标&#xff0c;以验证其性能是否符…

ActiveMQ消息队列的介绍以及部署

文章目录 1.ActiveMQ消息队列中间件1.1.什么是ActiveMQ1.2.ActiveMQ支持的消息传递类型 2.部署ActiveMQ消息队列2.1.安装JDK环境2.2.部署ActiveMQ消息队列2.3.启动ActiveMQ消息队列2.4.ActiveMQ的端口号2.5.使用ActiveMQ的后台管理系统 ActiveMQ官网&#xff1a;https://active…