更简单的读取和存储对象 (Bean)

news2024/9/24 11:31:29

怎样才能比之前更简单的 读取和存储对象 (Bean) 呢?

答: 就两个字"使用注解", 接下来就说说如何利用注解来更简单的操作 Bean

目录

一. 前置工作 (配置扫描路径)

二. 使用注解存储 Bean

2.1 注解介绍

2.1.1 类注解存储 Bean 的默认命名规则

2.2 @Controller (控制器存储)

2.3 @Service (服务存储)

2.4 @Repository (仓库存储)

2.5 @Component (组件存储)

2.6 @Configuration (配置存储)

2.7 为甚使用这么多的类注解?

2.8 方法注解 Bean

2.8.1 重命名 Bean

三. 更简单的获取 Bean 对象

3.1 属性注入

3.2 Setter 注入

3.3 构造方法注入

面试题 :

一. 依赖注入和依赖查找的区别

二. 同类型的 Bean 存储到容器多个, 获取时报错问题

三. @Autowired 和 @Resource 的区别


. 前置工作 (配置扫描路径)

为什么我们要配置存储对象的扫描包路径 ?

答: 因为只有被配置的包下的所有类, 添加了注解才能被正确的识别并保存(存储)到 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">
<!--    只有当前目录下的类,才会扫描是否添加了注解,如果添加了注解, 就将这些加了注解的类存到 Spring(Ioc) 容器中-->
<!--    使用注解存储 bean 和使用 XML 存储 bean 是一样的-->
    <content:component-scan base-package="com.java.demo">
    </content:component-scan>


</beans>

如果添加了注解, 没有配置扫描包路径, 他是不会被存储到 Spring 中的, 所以这点很重要

这样就配置完成了, 接下来看看如何使用注解存储 Bean

二. 使用注解存储 Bean

2.1 注解介绍

两种注解类型可以实现 :

1, 类注解 :

@Controller  控制器 : 检验参数的合法性 (安检系统)

@Service 服务 : 业务组装 (客服中心)

@Repository 数据持久层 : 实际业务处理 (实际办理的业务)

@Component 组件 : 工具类层 (基础的工具)

@Configuration 配置层 : 配置

类注解之间的关系 : @Component 是其他四个注解的父类

2, 方法注解 :

@Bean

2.1.1 类注解存储 Bean 的默认命名规则

  • 第一种: 首字母大写

获取方式: 首字母名小写就可以获取到对象

User user = context.getBean("user", User.class);
  • 第二种 : 首字母和第二个字母都是大写

获取方式: 使用原类名就可以

UConfig uConfig = context.getBean("UConfig",UConfig.class);

总结 :

类名如果不满足首字母是大写, 第二个字母是小写的规则时, 使用原类名就可以了

如果满足首字母大写, 第二个字母小写的情况, 首字母小写就可以了

jdk 命名规则:

2.2 @Controller (控制器存储)

核心代码: 

package com.java.demo.controller;
import org.springframework.stereotype.Controller;

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

添加了注解之后就可以直接获取到 Bean

2.3 @Service (服务存储)

核心代码:

package com.java.demo.service;

import org.springframework.stereotype.Service;

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

2.4 @Repository (仓库存储)

package com.java.demo;

import org.springframework.stereotype.Repository;

@Repository
public class User {
    public void sayHi() {
        System.out.println("Hi, User~");
    }
}

2.5 @Component (组件存储)

package com.java.demo;

import org.springframework.stereotype.Component;

@Component
public class Student {
    public void sayHi() {
        System.out.println("Hi, Student~");
    }
}

2.6 @Configuration (配置存储)

package com.java.demo;

import org.springframework.context.annotation.Configuration;

@Configuration
public class APPConfig {
    public void sayHi() {
        System.out.println("Hi APPConfig");
    }
}

2.7 为甚使用这么多的类注解?

这些注解的功能都是一样的, 但是所代表的东西是不一样的

例如 : 学校要求各个班的班长一起开会, 然后我们所有班长就去了, 虽然我们的职责是一样的但是我们的所代表的班级是不一样的, 院长看见我他就知道我是 软件工程班的,如果他想了解软件工程班的情况, 就会直接问我得到确切的消息


他们之间的调用流程:

2.8 方法注解 Bean

方法注解是配合类注解一起使用的, 如果单纯的使用 @Bean 会报错

如果不对 Bean 进行重命名, 他的默认命名就是 方法名

2.8.1 重命名 Bean

1.

@Bean(" ")  //设置单个名称

2.

@Bean(nane = " ")  //设置单个名称

@Bean(nane = {" ", " "})  //可以设置多个名称, 此时 name 可以省略

3.

@Bean(value = " ")  //设置单个名称

@Bean(value = {" ",  " "}) //可以设置多个名称

4.

@Bean ({" "," "}) //可以设置多个名称

1, 直接加双引号进行重命名就可以

获取的是实体类对象

2, 使用 name 标签设置多个名字

3, 使用 value 对 Bean 设置多个名称

name 和 value 也可以省略直接写 {"", ""}

. 更简单的获取 Bean 对象

获取 Bean 对象 : 对象装配, 把对象取出来放到某个类中, 也叫做对象注入

有三种方式 :

属性注入

构造方法注入

Setter 注入

3.1 属性注入

使用 @Autowired 注入

优点 : 使用简单

缺点 :

1 无法注入 final 修饰的变量

2 通用性问题 : 只适用于 Ioc 容器

3 更容易违背单一设计原理, 因为使用起来比较简单

使用注解 @Autowired  把 UserRepository 注入到 UserService 中

3.2 Setter 注入

优点 : 通常 Setter 只 set 一个属性, 所以 Setter 注入更符合单一设计原理

缺点 :

1 无法注入一个 final 修饰变量

2 setter 注入的对象可以被修改, setter 本来就是一个方法,既然是一个方法就有可能被多次调用和修改

3.3 构造方法注入

优点 :

1 可以注入一个 final 修饰的变量

2 注入对象不会被修改, 因为构造方法只会加载一次

3 构造方法注入可以保证注入对象完全初始化

4  构造方法的通用性更好

缺点 :

1 写法比属性注入复杂

2 使用构造方法注入, 无法解决循环依赖的问题

面试题 :

. 依赖注入和依赖查找的区别

- 依赖查找依赖的是 Bean 名称

- @Autowired 依赖注入的流程 : 首先先根据 getType (从容器中) 获取对象, 如果只获取一个, 那么直接将此对象注入到当前属性上; 如果获取到多个对象, 才会使用 getName (根据名称) 进行匹配

. 同类型的 Bean 存储到容器多个, 获取时报错问题

解决方案 :

1 将属性的名字和 Bean 的名称对应写上

2 使用 @Autowired  配合 @Qualifier(" ")  使用

. @Autowired @Resource 的区别

1 . 出身不同 : @Resource 来自于 JDK ; @Autowired 来自于 Spring 框架

2 . 支持参数不同 : @Resource 支持很多参数设置;  @Autowired 只支持一个参数设置

3 . 使用上的区别 : @Resource 不支持构造方法注入; @Autowired 支持构造方法注入

4 . idea 兼容性支持不同, 使用 @Autowired 在 idea 专业版下可能会误报; @Resource 不存在误报的问题

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

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

相关文章

手把手移植 simpleFOC (四):pwm 六相 篇

文章目录 系列文章目录前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 今天移植的内容&#xff0c;为定时器生在pwm&#xff0c;能按矢量数据控制电机到相应的位置 一、定时器的配置 通读了simpleFoc的代码&#xff0c;准备让定时器1生成的pwm波…

【玩转python系列】【小白必看】使用Python爬虫技术获取代理IP并保存到文件中

文章目录 前言导入依赖库打开文件准备写入数据循环爬取多个页面完整代码运行效果结束语 前言 这篇文章介绍了如何使用 Python 爬虫技术获取代理IP并保存到文件中。通过使用第三方库 requests 发送HTTP请求&#xff0c;并使用 lxml 库解析HTML&#xff0c;我们可以从多个网页上…

要单片机和RTOS有必要学习嵌入式linux吗?

学习嵌入式 Linux 是否有必要&#xff0c;取决于你的项目需求和职业发展目标。以下是一些考虑因素&#xff1a; 项目需求&#xff1a;如果你的项目需要处理复杂的网络、文件系统、多任务管理等功能&#xff0c;嵌入式 Linux 可能是更适合的选择。Linux 提供了丰富的开源软件包和…

生成对抗网络DCGAN实践笔记

在AI内容生成领域&#xff0c;有三种常见的AI模型技术&#xff1a;GAN、VAE、Diffusion。其中&#xff0c;Diffusion是较新的技术&#xff0c;相关资料较为稀缺。VAE通常更多用于压缩任务&#xff0c;而GAN由于其问世较早&#xff0c;相关的开源项目和科普文章也更加全面&#…

华为OD机试真题2022Q4 A + 2023 B卷(Java)

大家好&#xff0c;我是哪吒。 五月份之前&#xff0c;如果你参加华为OD机试&#xff0c;收到的应该是2022Q4或2023Q1&#xff0c;这两个都是A卷题。 5月10日之后&#xff0c;很多小伙伴收到的是B卷&#xff0c;那么恭喜你看到本文了&#xff0c;抓紧刷题吧。B卷新题库正在更…

微服务 - Consul集群化 · 服务注册 · 健康检测 · 服务发现 · 负载均衡

一、Consul 概括 Consul 是由N多个节点(台机/虚机/容器)组成&#xff0c;每个节点中都有 Agent 运行着&#xff0c;各节点间用RPC通信&#xff0c;所有节点内相同的 Datacenter 名称为一个数据中心&#xff0c;节点又分三种角色 Client/Server/Leader&#xff1a; Agent&…

Python算法笔记(3)-树、二叉树、二叉堆、二叉搜索树

树和二叉树 什么是树 树是一种非线性的数据结构&#xff0c;由n个节点构成的有限集合&#xff0c;节点数0的树叫空树&#xff0c;在任意一棵树中&#xff0c;有且仅有一个特点的称为根节点&#xff0c;当N>1时&#xff0c;其余节点可分m为互不相交的有限集。 例如如下&…

子序列,回文串相关题目

class Solution { public:int dp[2510];int lengthOfLIS(vector<int>& nums) {//dp[i]表示以nums[i]为结尾的最长子序列的长度int nnums.size();for(int i0;i<n;i){dp[i]1;}for(int i1;i<n;i){for(int j0;j<i;j){if(nums[i]>nums[j]){dp[i]max(dp[i],dp[…

因子分解机介绍和PyTorch代码实现

因子分解机&#xff08;Factorization Machines&#xff0c;简称FM&#xff09;是一种用于解决推荐系统、回归和分类等机器学习任务的模型。它由Steffen Rendle于2010年提出&#xff0c;是一种基于线性模型的扩展方法&#xff0c;能够有效地处理高维稀疏数据&#xff0c;并且在…

用Blender做一个足球烯C60

文章目录 作图思路先做一个足球球棍模型平滑 Blender初学者入门&#xff1a;做一个魔方 作图思路 C 60 C_{60} C60​是由60个碳原子构成&#xff0c;形似足球&#xff0c;又名足球烯。而足球的顶点&#xff0c;可以通过正二十面体削去顶点得到&#xff0c;原理可参照这篇&…

基于数据驱动的多尺度表示的信号去噪统计方法研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

React组件进阶之children属性,props校验与默认值以及静态属性static

React组件进阶之children属性,props校验与默认值以及静态属性static 一、children属性二、props校验2.1 props说明2.2 prop-types的安装2.3 props校验规则2.4 props默认值 三、静态属性static 一、children属性 children 属性&#xff1a;表示该组件的子节点&#xff0c;只要组…

网站创建004:跟用户交互的标签

input 系列&#xff1a; <body><input type"text" /> <!--文本输入框--><input type"password" /> <!--密码输入框--><input type"checkbox" /> <!--复选框--><input type"checkbox"…

【MySQL】使用C语言连接

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《零基础入门MySQL》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录 &#x1f449;my…

用CSS和HTML写一个水果库存静态页面

HTML代码&#xff1a; <!DOCTYPE html> <html> <head><link rel"stylesheet" type"text/css" href"styles.css"> </head> <body><header><h1>水果库存</h1></header><table>…

函数指针及其使用

类比 数组的地址 函数的地址 数组指针 函数的指针 函数指针的运用 有趣的代码1

从0到1构建基于自身业务的前端工具库

前言 在实际项目开发中无论 M 端、PC 端&#xff0c;或多或少都有一个 utils 文件目录去管理项目中用到的一些常用的工具方法&#xff0c;比如&#xff1a;时间处理、价格处理、解析url参数、加载脚本等&#xff0c;其中很多是重复、基础、或基于某种业务场景的工具&#xff0…

链表(一) 单链表操作详解

文章目录 一、什么是链表二、链表的分类1、单向或者双向2、带头或不带头3、循环或不循环 三、无头单向不循环链表的实现SList.hSList.c动态申请一个节点单链表打印单链表尾插单链表头插单链表的尾删单链表头删单链表查找在pos位置前插入单链表在pos位置之后插入x删除pos位置单链…

自动驾驶下半场的“入场券”

交流群 | 进“传感器群/滑板底盘群/汽车基础软件群/域控制器群”请扫描文末二维码&#xff0c;添加九章小助手&#xff0c;务必备注交流群名称 真实姓名 公司 职位&#xff08;不备注无法通过好友验证&#xff09; 作者 | 张萌宇 自动驾驶战争的上半场拼的是硬件和算法&…

DTC介绍

DTC 一般由3个字节组成&#xff1a; 字节1&#xff1a;High Byte bit 7-6: 对应DTC属于哪一个系统&#xff0c;P: 00动力系统、C: 01底盘、B: 10车身和U: 11通信系统bit 5-4: 用来区分DTC是标准组织所定义还是制造商自定义 00: ISO/SAE01: 制造商10: ISO/SAE11: ISO/SAE bit 3…