Spring - 更简单的存取 Bean 对象(使用注解)

news2024/10/5 15:31:23

目录

一、类注解是什么

二、使用类注解 存取 Bean 对象

1. 准备工作

2. 所以使用五大类注解的规则:

三、五大类注解之间的关系

1. 首先可以查看 类注解的源码如下图:

2. 为什么需要五个类注解?

3. 为什么使用类注解的方式不能使用原类名(上面的特例除外)

4. Bean的命名的规则:

四、使用 @Bean 方法注解存储对象

1. @Bean 方法注解的使用

2. @Bean 方法注解的重命名


前言

    上一篇文章中,已经介绍了在 Spring 容器中如何存储和获取 Bean 对象,但是对于 Spring中对象的获取还是有更简单的方式的,先回顾上一篇的内容,获取 Bean 对象的三种方式是:

1. 通过 Bean 名称获取对象
Student student = (Student) context.getBean("student");//根据名称获取
2. 通过 Bean 对象的类型获取对象
Student student = context.getBean(Student.class);//根据类型获取
3. 通过 Bean 的名称 + 类型获取对象
Student student = context.getBean("student",Student.class);//根据名称 + 类型获取

    此种写法其实是比 new 对象还要麻烦一点的,所以就有了更简单存取 Bean 对象的方式:通过加 类注解。

一、类注解是什么

    五大 类注解:注:不是五大类  注解, 而是五大  类注解)

@Controller   控制器:验证用户请求的数据的正确性(将非法用户拦截在程序之外)
@Service   服务:安排和调度具体的执行的方法,(类似机场的客服中心,给游客指明目的地,只是引导作用)Service层也是一样,不会实际操作数据库,只是用户实现一个功能需要调用哪些接口,只是帮用户调用了这个接口
@Repository

   持久层:和数据库交互,例如添加一个用户的操作需要执行两个Insert,UserInsert和日志中的Insert,此时在Service层会调用两个 Repository,UserRepository 和 logRepository(Repository就是最后的执行者)

@Component

   组件(放工具类),上述几个注解都是和业务相关的,但是Component 和 业务没有什么关联,例如:在Component放一个加密的goon工具类,此时不管是什么业务,都可以使用这个工具来实现某种功能

@Configuration配置:放一些项目中的配置文件

二、使用类注解 存取 Bean 对象

1. 准备工作

    注:如果要把 Bean 对象存到 Spring 中,就需要配置 Bean 对象的扫描路径,只有配置了,此时被配置的这个包中的所有类才可以在添加了 类注解 之后 被保存到 Spring 容器中。

    这个配置的路径是否可以不设置?

    其实在 Spring 实现的角度也是可以的,但是需要配置就一定是有道理的,如果不配置,此时如果加了 类注解 之后 Spring 就要去扫描 整个项目 哪些 Bean 对象 加了类注解,但是如果配置了这个扫描路径,此时在运行 Spring 项目过程中,只会扫描当前配置的路径下的所有的包,所以效率和性能就有了提升。

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

    将上述配置信息复制到spring-config.xml 文件中,然后 将 base-package (包的根路径)设置好自己的扫描路径即可。 如下图中:

     在指定的配置路径下,创建一个 Bean 对象(StudentController类)

package com.spring.demo;

import org.springframework.stereotype.Controller;

@Controller //将当前类存储到 Spring 容器中
public class StudentController {

    public void sayHi() {
        System.out.println("do studentController sayHi()");
    }
}

     在启动类中获取 Bean 对象(使用类名 + 类型的方式)

     注:类名不是原来的类名了,是类名(小驼峰)的形式来获取 StudentController 对象(这涉及到Spring中源码的规则,下面会详细的介绍)

    特例:如果原类名首字母和第二个字母都是大写,此时就用原类名的方式来获取 Bean 对象即可。

     此时可以看到用加类注解的方式也是可以获取到 Bean 对象的,不仅仅是加 @Controller,加上其他的类注解也是一样的可以获取 Bean 对象。

2. 所以使用五大类注解的规则:

  1. <Bean>标签(在配置文件中写的那个)是可以和component-san一起使用的
  2. 五注解不可以不在compent-scan中(这个也很好理解,配置五大注解才可以是使用更加方便的方式来进行获取Bean对象,spring是要保证性能的,不配置就是性能低,配置使用注解的依赖之后才可以使用注解)
  3. 即使在component-scan下,但是如果没有加五大注解,一样是不能将当前对象存储到Spring容器中的
  4. 在component-scan下的所有子包下的类只要加了五大注解,同样能存储到Spring中。
  5. 在扫描路径下的 不同包下的 同名的类 必须要设置别名才能存储到 Spring容器中。 

三、五大类注解之间的关系

   1. 首先可以查看 类注解的源码如下图:

     如上图所示:五大类注解汇中都是基于 @Component 来实现的,说明他们是 ”@Component” 的 “子类”, 都是对 @Component 的一个扩展和升级。

   2. 为什么需要五个类注解?

   如上图所示:JavaEE阶段的标准分层至少分为3层,在企业中一般都是基于这3层再进行细化和扩展的。

    五大类注解就是基于标准分层来创建的,五大类注解在功能层面上没有很大的差别,但是在项目中的作用每个类注解都是同等重要的:起到了标识的作用,例如:在一个程序中看到了 @Controller 就了解了当前类就是用来做前端提交过来的数据的监控的,当看到一个类上有一个 @ Repository 时就知道当前类就是直接和数据库进行交互的,此时让程序猿读代码的时候能够清晰的见名知意,清除的知道当前类的作用。

    所以剩下的两个类注解 @Component 和 @Configuration 是对EE标准三层分层的补充,有的项目中可能会没有使用到这两个注解,但是如果有项目需要使用工具类和配置文件,此时就需要在标准分层之外进行额外的扩展。

3. 为什么使用类注解的方式不能使用原类名(上面的特例除外)

    此时就涉及到Spring的源码了,双击 shift 打开全局搜索,搜索 BeanName,就有了下图中的类和类方法命名的方法:

     综上所述源码的解释,

 4. Bean的命名的规则:

1. 默认情况下是首字母小写。
2. 如果类名首字母和第二个字母都为大写的情况下,Bean名称为原类名。

验证上述源码中的方法:

     如上图所示;可以看到上述代码运行结果是符合上述两个规则的。

四、使用 @Bean 方法注解存储对象

1. @Bean 方法注解的使用

    注:

1. @Bean 是方法的注解,只能加在方法的上边,是不能加在类上的。
2. @Bean 注解必须和五大 类注解配合使用才可以生效。

     先创建一个两个包,component 和 entity,分别在两个包中创建两个类,UserBeans 类 和 User 实体类,UserBeans 就代表了 Bean对象,User实体类就是传输数据的一个载体,完成如下代码:

package com.spring.demo.component;

import com.spring.demo.entity.User;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

@Component
public class UserBeans {
    @Bean
    public User user222() {
        User user = new User();
        user.setUid(1);
        user.setUsername("张三");
        user.setPassword("123456");
        user.setAge(18);
        return user;
    }
}
package com.spring.demo.entity;
public class User {
    private Integer uid;
    private String username;
    private String password;
    private Integer age;
    //...
    public Integer getUid() {
        return uid;
    }
    public void setUid(Integer uid) {
        this.uid = uid;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
}

    注:使用@Bean 方法注解之后在 getBean() 获取对象的时候,命名规则和使用五大类注解的方式不一样,方法注解,类名称就是方法的名称。

    可以看到上图中的运行结果,使用 @Bean 方法注解的方式和五大 类注解结合使用,也是可以获取到 Bean 对象的。

2. @Bean 方法注解的重命名

 可以看到下图的运行结果:

     注:此时如果是设置了别名之后,就不能再用原类名去获取 Bean 对象了,只能使用别名 或者别名之一 来获取对象。

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

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

相关文章

挖矿记录+解决方案:利用GitLab组件对服务器进行挖矿导致CPU占用200%

文章目录 什么是云服务器挖矿?事件记录事件分析产生影响解决方案后期预防什么是云服务器挖矿? 云服务器挖矿是指利用云服务器从事赚取比特币的活动。比特币是一种虚拟数字货币,挖矿是将一段时间内比特币系统中发生的交易进行确认,并记录在区块链上形成新区块的过程。 用于…

青岛大学_王卓老师【数据结构与算法】Week05_06_栈的顺序表示_学习笔记

本文是个人学习笔记&#xff0c;素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享&#xff0c; 另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权&#xff0c;请留言作删文处理。 课程视频链接&#xff1a; 数据结构与算法基础…

【数据结构】之红黑树

红黑树 红黑树的概念红黑树的性质红黑树的插入操作&#xff08;核心&#xff09;情况一&#xff1a;uncle存在且为红情况二&#xff1a;uncle不存在/存在且为黑&#xff08;在同一侧&#xff09;情况三&#xff1a;uncle不存在/存在且为黑&#xff08;在两侧&#xff09;总结 红…

三、学习分类 - 基于图像大小进行分类

天下一半剑仙是我友 谁家娘子不娇羞 我以醇酒洗我剑 谁人说我不风流 1 设置问题 根据图片的尺寸&#xff0c;把图片分为纵向图像和横向图像。这种把图像分成两种类别的问题&#xff0c;就是二分类问题。 纵向图片示例&#xff1a; 横向图片示例&#xff1a; 这样就有了两个…

【Go语言开发】简单了解一下搜索引擎并用go写一个demo

写在前面 这篇文章我们一起来了解一下搜索引擎的原理&#xff0c;以及用go写一个小demo来体验一下搜索引擎。 简介 搜索引擎一般简化为三个步骤 爬虫&#xff1a;爬取数据源&#xff0c;用做搜索数据支持。索引&#xff1a;根据爬虫爬取到的数据进行索引的建立。排序&#xf…

Wsl 错误 0x80004002 解决

wsl2安装教程&#xff1a;https://www.jianshu.com/p/6e7488440db2 我安装的过程中出现了如下错误&#xff1a; 解决办法&#xff1a; 已管理员身份运行Powershell运行以下命令以获取包的全名 Get-AppxPackage |? { $_.Name -like "*WindowsSubsystemforLinux*"…

(33)(33.3) 连接实例

文章目录 前言 33.3.1 嵌入在集体PPM/总信号通道中的RSSI 33.3.2 模拟电压型RSSI被输送到一个专用引脚 33.3.3 PWM类型的RSSI输送到一个专用引脚 前言 以下是典型的 RC 接收机 RSSI 连接方案示例&#xff1a; 33.3.1 嵌入在集体PPM/总信号通道中的RSSI 通常的做法是在一根…

NLog写日志到数据库

需求&#xff1a;NLog写日志到数据库 一、必须要安装&#xff1a; System.Data.SqlClient 二、 NLog配置&#xff1a; <?xml version"1.0" encoding"utf-8" ?> <nlog xmlns"http://www.nlog-project.org/schemas/NLog.xsd" …

存css实现动态时钟背景

代码实现 <!DOCTYPE html> <html lang"en"> <head><meta http-equiv"Content-Type" content"text/html; charsetUTF-8"><title>Title</title><meta name"referrer" content"no-referrer…

Spring的控制翻转(IOC)与依赖注入(DI)

SpringIOC 即 Inversion of Control&#xff0c;缩写为 IOC&#xff0c;就是由 Spring IoC 容器管理对象&#xff0c;而非传统实现中由程序代码直接操控. 使用IOC容器管理bean&#xff08;IOC&#xff09; 在IOC容器中将有依赖关系的bean进行关系绑定 最终达到的目的&#…

【C】回调函数和qsort详解

回调函数概念 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另一 个函数&#xff0c;当这个指针被用来调用其所指向的函数时&#xff0c;我们就说这是回调函数。回调函数不是由该 函数的实现方直接调用&#xff0c;…

七大排序算法——快速排序,通俗易懂的思路讲解与图解(完整Java代码)

文章目录 一、排序的概念排序的概念排序的稳定性七大排序算法 二、快速排序核心思想Hoare法挖坑法前后指针法(选学) 三、性能分析四、算法优化优化基准的选取优化少量数据时的排序方案优化后的完整代码 五、七大排序算法 一、排序的概念 排序的概念 排序&#xff1a;所谓排序…

基于ChatGPT和私有知识库搭建Quivr项目

准备工作 安装docker和docker-compose申请supabase账号 拉取Quivr代码 git clone https://github.com/StanGirard/Quivr.git 复制.XXXXX_env文件 cp .backend_env.example backend/.env cp .frontend_env.example frontend/.env 更新backend/.env和frontend/.env文件 ba…

靶场的安装

sqli-lab 1.将安装包解压放到WWW目录下 2.修改 db-creds.inc文件里面的数据库的用户名密码为自己的用户名密码 路径&#xff1a;D:\phpStudy_64\phpstudy_pro\WWW\sqli-labs-master\sql-connections\db-creds.inc 3. 更改php版本位5.9版本&#xff0c;不然会报错 4.安装数…

【采用有限元法技术计算固有频率和欧拉屈曲荷载】使用有限元法的柱子的固有频率和屈曲荷载(Matlab代码实现)

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

Android JNI 异常处理 (十一)

🔥 Android Studio 版本 🔥 🔥 创建包含JNI的类 JNIException.java 🔥 package com.cmake.ndk1.jni;public class JNIException {static {System.loadLibrary("exception-lib");}public native void nativeInvokeJavaException();public native void nativ…

B站这些“搬运工”还能有这么高的流量吗?

飞瓜数据&#xff08;B站版&#xff09;观察发现&#xff0c;B站经常有一些搬运视频能够获得超高流量。 比如拉取近15天的B站热门视频&#xff0c;位列前排的就有两个是搬运二创视频&#xff0c;播放量高达900万上下&#xff0c;可以说是爆款视频了。 这些视频有一个相同的点就…

Qt Https通信: TLS initialization failed 解决方法

Qt Https通信&#xff1a; TLS initialization failed 解决方法&#xff0c;Window端使用Qt 做开发请求Https资源时&#xff0c;会经常遇到 TLS initialization failed。 原因分析&#xff1a; 在Qt中并未包含 SSL所包含的库&#xff0c;因此需要开发者&#xff0c;自己将库拷贝…

最新华为鸿蒙4.0安装谷歌服务框架,安装Play商店,谷歌Google,GMS

最近华为推出了最新鸿蒙4.0开发者Beta版本&#xff0c;让用户测试体验。那么测试体验的机器主要是最近发布的几款机器为P60,P60 Pro, mate50,mate50 pro等几款产品可以先期进行体验测试鸿蒙4.0&#xff0c;那么很多的用户在疑问我升级到鸿蒙4.0。是不是还是可以使用Google谷歌服…

LINUX环境小实验

实验报告 实验名称 小环境搭设 实验目的 1.搭建DHCP服务器&#xff08;IP&#xff1a;192.168.100.253静态IP网卡vmnet1&#xff09; 2.搭建DNS&#xff08;通过DHCP服务器分到指定的IP&#xff1a;192.168.100.252&#xff09; 3.搭建网站服务&#xff08;通过DHCP服务器分…