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

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

经过前面的学习,我们已经可以实现基本的 Spring 读取和存储对象的操作了,但在操作的过程中我们发现读取和存储对象并没有想象中的那么“简单”,所以接下来我们要学习更加简单的操作 Bean 对象的方法。
在 Spring 中想要更简单的存储和读取对象的核心是使用注解,也就是我们接下来要学习 Spring 中的相关注解,来存储和读取 Bean 对象。

1.存储Bean对象

之前我们存储 Bean 时,需要在 spring-config 中添加一行bean,如下图
在这里插入图片描述
而现在我们只需要⼀个注解就可以替代之前要写一行配置的尴尬了,不过在开始存储对象之前,我们先要来点准备工作。

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

下图这里换成你的bean对象存放的包下,下图的意思是配置bean的扫描根路径,只有当前目录下的类才会扫描释放添加了注释,如果添加了注释,就将这些添加了注释的类存放到ioc容器中
在这里插入图片描述
在这里插入图片描述

1.2添加注解存储bean对象

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

  1. 类注解:@Controller、@Service、@Repository、@Component、@Configuration。
  2. ⽅法注解:@Bean。
    接下来我们分别来看

类注解

1.2.1@Controller(控制器存储)

它是前端所有访问请求的入口,校验参数的合法性(安检系统),如果前端传过来的参数不合规范,后续都不再进行

@Controller // 将对象存储到 Spring 中
public class User {public void sayHi() {System.out.println("Hi");}
}
public class Application {public static void main(String[] args) {// 1.得到 spring 上下⽂ApplicationContext context =new ClassPathXmlApplicationContext("spring-config.xml");// 2.得到 beanUser user = context.getBean(
"user",User.class);//前一个参数是首个单词小写,小驼峰// 3.调⽤ bean ⽅法user.sayHi();}
}

其他也类似,只不过把注解改了

1.2.2@Service(服务存储)

这是一个业务组装注解,它会告诉你这个业务会用到哪些方法,会调用几个接口,它只是单纯的调用方法,不会执行这个方法

相当于客服中心,比如你去坐飞机,不知道流程,你去前台问具体流程,然后你跟前台说,你想找人待着你去,前台就打电话给保安带着你去了(调用保安,没自己亲自带着去)

1.2.3@Repository(仓库存储)

它才是实际的一个业务执行处理,这一层是数据持久层,是实际和数据库打交道的

1.2.4 @Component(组件存储)

这一层是工具类层,可以理解成基础的工具,比如我去吃饭,人家店里的基础工具就是椅子

1.2.5Configuration(配置存储)

这一层是配置层,针对于当前项目做一些设置,比如我设置当前项目的端口号,当前系统的session存储时间

既然功能是⼀样的,为什么需要这么多的类注解呢?
这五个类注解就相当于车牌号的前置内容,当你看到这个前置内容之后你就知道是哪里的车了,比如天津是津,陕西是陕,然后西安是A,当你看到陕A的时候就知道是西安的,上面五个类注解也一样,当你看到哪个注解就知道对应业务的哪个方面
比如:
@Controller:表示的是业务逻辑层;
@Servie:服务层;
@Repository:持久层;
@Configuration:配置层。
程序的工程分层,调用流程如下:
在这里插入图片描述
这五个类注解关系是怎么样的呢?
其他四个注解都是基于component来实现的,也就是component是父亲,其他四个是儿子
在这里插入图片描述

只会扫描自己设置的包底下的包,及其类在这里插入图片描述

类注解存储bean命名问题

在这里插入图片描述
为什么这么设计呢?
具体看Bean生成名称源代码
这个方法所在的包是在java底下的,命名规则是java的,不是spring框架的
在这里插入图片描述
在这里插入图片描述
因此命名规则是:
满足首字母大写,第二个字母小写的话,就返回类名小驼峰,否则返回原类名

方法注解

@Bean

@Bean:将当前方法返回的对象存储到 IoC 容器

@Bean使用时候的注意事项

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

@Component
public class Articles {@Bean("article") // 将当前方法返回的对象存储到 IoC 容器public ArticleInfo getArt(){// 伪代码//不要在乎new这个对象,实际开发中都是准备好了的,这里只是为了举例子ArticleInfo articleInfo = new ArticleInfo();articleInfo.setAid(1);articleInfo.setTitle("标题?");articleInfo.setContent("今天周一!!!");articleInfo.setCreatetime(LocalDateTime.now());return articleInfo;}
}
ArticleInfo articleInfo=context.getBean("getArt",ArticleInfo.class)

和bean配合使用的类注解所注释的类也会被存储到容器中,也就是说不仅ArticleInfo 被存储到了容器,Articles 也存储到了容器

@Bean获取时候的注意事项

1.@Bean的默认命名=方法名,上述代码就是如此
在这里插入图片描述
2.还可以给@Bean重命名
在这里插入图片描述
@Bean能指定多个名称,而五大类注解最多只可以指定一个名称

3.当@Bean被命名重复的时候
1.在一个类里面,如果多个Bean使用相同的名称,那么程序不会执行出错,但是第一个Bean之后的对象不会被存放到容器中,也就是只有第一次创建Bean的时候会将名称和Bean名称关联起来,后续再有相同的Bean存储的时候,容器会自动忽略
2.不在同一个类里面的时候,可以使用**@Order(参数)**设置调用的先后顺序,这个参数越大,就越先被执行,因此就会执行参数大的@Bean所对应的方法

4.@Bean没有重载可言
在这里插入图片描述

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

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

1.属性注入(依赖注入)

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

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

Controller 类的实现代码如下:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller
public class UserController {// 注⼊⽅法1:属性注⼊@Autowiredprivate UserService userService;public User getUser(Integer id) {return userService.getUser(id);}
}

获取 Controller 中的 getUser 方法:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class UserControllerTest {public static void main(String[] args) {ApplicationContext context =new ClassPathXmlApplicationContext("spring-config.xml");UserController userController = context.getBean(UserController.cla
ss);System.out.println(userController.getUser(1).toString());}
}

最终结果如下
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
优点:使用简单
缺点:
1.功能性问题:无法注入final修饰的变量,要想注入final修饰的变量,可以给被final修饰的变量初始化,或者在构造方法里初始化final
在这里插入图片描述
2.通用性问题:使用Autowired只能适应于IoC容器,因为Autowired依赖于ioc容器的,有ioc容器才有Autowired的
3.设计原则问题:更容易违背单一设计原则。
使用属性注入的方式,因为使用起来很简单,所以开发者很容易在一个类中同时注入多个对象,而这些对象的注入是否有必要?是否符合程序设计中的单一职责原则?就变成了一个问题。但可以肯定的是,注入实现越简单,那么滥用它的概率也越大,所以出现违背单一职责原则的概率也越大。注意:这里强调的是违背设计原则(单一职责)的可能性,而不是一定会违背设计原则,二者有着本质的区别。

2.Setter注入

@RestController
public class UserController {// Setter 注入private UserService userService;@Autowired//Autowired不能省略public void setUserService(UserService userService) {this.userService = userService;}@RequestMapping("/add")public UserInfo add(String username, String password) {return userService.add(username, password);}
}

优点:通常Setter只set一个属性,所以setter注入更符合单一设计原则
缺点:
1.无法注入一个final修饰的变量
2.Setter注入的对象可能被修改。因为setter本来是一个方法,既然是一个方法就有可能被多次调用和修改

3.构造方法注入(官方推荐)

在这里插入图片描述
如果当前的类中只有一个构造方法,那么 @Autowired 也可以省略,在setter注入那里不能省略,在这里可以省略,因为构造方法的注入式官方推荐的,官方做了一些优化
如果有多个构造方法就不能省略,因为不知道哪些构造方法需要注入,哪些不需要注入,这时候就需要加上Autowired 了
优点:
1.可以注入一个final修饰的变量了
2.注入的对象不会被修改,因为构造方法只执行一次
3.可以保证注入对象会被完全初始化,因为构造方法执行的时机是比较靠前的
4.通用性更好。构造方法和属性注入不同,构造方法注入可适用于任何环境,无论是 IoC 框架还是非 IoC 框架,构造方法注入的代码都是通用的,所以它的通用性更好。
缺点:
1.写法比属性注入更复杂
2.无法解决循环依赖的问题

@Resource:另⼀种注入关键字

在进行类注入时,除了可以使⽤ @Autowired 关键字之外,我们还可以使用 @Resource 进行注入,如下代码所示:

@Controller
public class UserController {// 注⼊@Resourceprivate UserService userService;public User getUser(Integer id) {return userService.getUser(id);}
}

@Autowired和@Resource区别
1.出身不同:@Autowired 来自于 Spring,而 @Resource 来自于 JDK 的注解;

2.使用时设置的参数不同:相比于 @Autowired 来说,@Resource 支持更多的参数设置,例如name 设置,根据名称获取 Bean。
在获取对象的时候,如果对象有多个,可以用@Resource来设置获取的对象的名字

3.@Autowired 可用于 Setter 注入、构造函数注入和属性注入,而@Resource 只能用于 Setter 注入和属性注入,不能用于构造函数注入。

4.idea兼容性不同:使用@Autowired 在idea专业版下可能会误报,而@Resource 则不会。
因为@Autowired 是spring框架提供的,在jvm加载的时候是先加载java的jdk的(@Resource 就是jdk提供的),后加载spring框架的

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

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

相关文章

【简单了解一下红黑树】

文章目录 红黑树1.简介2.为什么需要红黑树&#xff1f;3.性质4. 红黑树的效率4.1 红黑树效率4.2 红黑树和AVL树的比较 5.AVL树 vs 红黑树5.1 AVL树5.2 红黑树5.3 如何选择 红黑树 1.简介 红黑树是一种自平衡的二叉查找树&#xff0c;是一种高效的查找树。它是由 Rudolf Bayer …

【image captioning】CaMEL: Mean Teacher Learning for Image Captioning(实现流程)

CaMEL: Mean Teacher Learning for Image Captioning(实现流程) 作者:安静到无声 个人主页 目录 CaMEL: Mean Teacher Learning for Image Captioning(实现流程)环境设置数据准备Evaluation训练程序推荐专栏参考代码: CaMEL: Mean Teacher Learning for Image Captioning.…

视频二维码的制作方法,支持内容修改编辑

现在学生经常会需要使用音视频二维码&#xff0c;比如外出打开、才艺展示、课文背诵等等。那么如何制作一个可以长期使用的二维码呢&#xff1f;下面来给大家分享一个二维码制作&#xff08;免费在线二维码生成器-二维码在线制作-音视频二维码在线生成工具-机智熊二维码&#x…

Vue+element开发Simple Admin后端管理系统页面

最近看到各种admin&#xff0c;头大&#xff0c;内容太多&#xff0c;根本不知道怎么改。所以制作了这个项目&#xff0c;只包含框架、和开发中最常用的表格和表单&#xff0c;不用自己从头搭建架构&#xff0c;同时也容易上手二次开发。可以轻松从其他开源项目整合到本项目。项…

C/C++:[Error] ld returned 1 exit status 解决方案

好久没用了&#xff0c;今天写了会儿代码&#xff0c;各种BUg,emmmmmm 出现了很多次以下这个问题&#xff1a;[Error] ld returned 1 exit status 可能问题&解决方式&#xff1a; 常见的语法/单词拼写错误&#xff1a;常见的Main,printf,scanf等拼写错误 函数名或者声明有…

QT商业播放器

QT商业播放器 总体架构图 架构优点&#xff1a;解耦&#xff0c;采用生产者消费者设计模式&#xff0c;各个线程各司其职&#xff0c;通过消息队列高效协作 这个项目是一个基于ijkplayer和ffplayer.c的QT商业播放器, 项目有5部分构成&#xff1a; 前端QT用户界面 后端是集成了…

制作电子期刊没模板?请疯狂看我

你们是不是也在为制作电子期刊而烦恼&#xff1f;没有合适的模板&#xff0c;内容再精彩也难以展现。今天给大家分享一个超级实用的秘籍&#xff01;✨ 首先&#xff0c;我们要明白&#xff0c;电子期刊制作的关键在于模板的选择。一个好的模板可以让你的内容瞬间焕发光彩。但是…

分类预测 | MATLAB实现SSA-FS-SVM麻雀算法同步优化特征选择结合支持向量机分类预测

分类预测 | MATLAB实现SSA-FS-SVM麻雀算法同步优化特征选择结合支持向量机分类预测 目录 分类预测 | MATLAB实现SSA-FS-SVM麻雀算法同步优化特征选择结合支持向量机分类预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 MATLAB实现SSA-FS-SVM麻雀算法同步优化特征选择结…

OOTD | 美式复古穿搭耳机,复古轻便的头戴式耳机推荐

复古耳机更能带来年代感的复古数码产品&#xff0c;头戴式耳机就好似是时光滤镜的时髦配饰&#xff0c;不说功能实用性&#xff0c;在造型上添加就很酷。 随着时代的发展&#xff0c;时尚有了新的定义。对如今的消费者来说&#xff0c;时尚不仅是美学与个性的展现&#xff0c;…

C10K问题:高并发模型设计

一、循环服务器模型 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <signal.h> #include <sys/types.h> #include <sys/socket.h> //*******// #include &l…

头戴式耳机怎么戴好看?头戴式耳机正确代法

走在大街上总能看到那么一些人&#xff0c;他们眼神时而朦胧涣散&#xff0c;时而精神奕奕&#xff0c;全身上下始终散发着#请勿打扰#的气息&#xff0c;因为他们都戴着头&#xff01;戴&#xff01;式&#xff01;耳&#xff01;机&#xff01;但是头戴式耳机把头压得扁扁的&a…

《C和指针》笔记31:多维数组的数组名、指向多维数组的指针、作为函数参数的多维数组

文章目录 1. 指向多维数组的数组名2. 指向多维数组的指针3. 作为函数参数的多维数组 1. 指向多维数组的数组名 我们知道一维数组名的值是一个指针常量&#xff0c;它的类型是“指向元素类型的指针”&#xff0c;它指向数组的第1个元素。那么多维数组的数组名代表什么呢&#x…

[管理与领导-113]:IT人看清职场中的隐性规则 - 10 - 看清人的行动、行为、手段、方法背后的动机与背景条件

目录 前言&#xff1a; 一、冰山模型 1.1 冰山模型&#xff0c;系统思考的工具 1.2 冰山模型&#xff1a;发现人行为背后的动机 二、动机、行为模型 "说一套"&#xff1a; "做一套"&#xff1a; "演一套"&#xff1a; "学一套&quo…

【已解决】 Expected linebreaks to be ‘LF‘ but found ‘CRLF‘.

问题描述 团队都是用mac&#xff0c;只有我自己是windows&#xff0c;启动项目一直报错 Expected linebreaks to be ‘LF‘ but found ‘CRLF‘. 但我不能因为自己的问题去改团队配置&#xff0c;也尝试过该vscode配置默认是LF还是报错 思路 看文章vscode如何替换所有文件的…

深入剖析红黑树:优雅地平衡二叉搜索树

目录 一.红黑树的概念二.插入操作三.与AVL树的比较 一.红黑树的概念 在之前的学习中&#xff0c;我们了解了二叉搜索平衡树&#xff0c;AVL树通过控制每个结点中的平衡因子的绝对值不超过1&#xff0c;实现了一个高性能的树。而相较于AVL的高度平衡&#xff0c;红黑树觉得AVL为…

传输层协议—UDP协议

传输层协议—UDP协议 文章目录 传输层协议—UDP协议传输层再谈端口号端口号范围划分pidofnetstat UDP协议端格式UDP报文UDP特点UDP缓冲区基于UDP的应用层协议 传输层 在学习HTTP/HTTPS等应用层协议时&#xff0c;为了方便理解&#xff0c;可以简单认为HTTP将请求和响应直接发送…

JMeter性能分析实战一:日常登录接口

负载测试 日常需求&#xff1a;负载测试&#xff01; 对于桥的负载测试&#xff1a;我给你20t的一排车辆&#xff0c;看你能不能撑得住20t&#xff01; 对于系统的负载测试&#xff1a; 逐步增加负载&#xff0c;便于问题的发现和定位&#xff0c;不要操之过急。逐步增加负载…

Stable Diffusion云服务器部署完整版教程

Stable Diffusion云服务器部署完整版教程 2023年07月04日 22:30 3607浏览 18喜欢 22评论 <span class"bili-avatar-icon bili-avatar-right-icon "></span> </div>薯片_AI 粉丝&#xff1a; 1513 文章&#xff1a; 1 设置分组取消关注 已关注 …

【MySql】3- 实践篇(一)

文章目录 1. 普通索引和唯一索引的选择1.1 查询过程1.2 更新过程1.2.1 change buffer1.2.2 change buffer 的使用场景 1.3 索引选择和实践1.4 change buffer 和 redo log2. MySQL为何有时会选错索引?2.1 优化器的逻辑2.1.1 扫描行数是怎么判断的?2.1.2 重新统计索引信息 2.2 …

C语言中柔性数组的讲解与柔性数组的优势

前言:也许你从来没有听说过柔性数组&#xff08;flexible array&#xff09;这个概念&#xff0c;但是它确实是存在的。C99 中&#xff0c;结构中的最后一个元素允许是未知大小的数组&#xff0c;这就叫做"柔性数组"成员。 目录标题 柔性数组什么是柔性数组呢&#…