简单存 Bean 对象 -- 五大类注解以及 Bean 方法(上)

简介: 简单存 Bean 对象 -- 五大类注解以及 Bean 方法(上)

一. 配置扫描路径



前面创建 Spring 项目和简单使用一文中说到(如何创建一个 Spring 项目并简单使用), 在获取 Spring 的上下文对象时, 是先去 配置文件中读取, 获得 Spring 容器. 因此, 在使用更简单的存 Bean 对象的注解时, 我们也需要进行配置文件


<?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">
<!--  配置扫描路径, 指定要扫描那个路径底下的类注解, 不在该包底下或者在该包底下不加五大类注解都不能读取  -->
<!--  在component-scan 下的子包下加了五大类注解一样可以加入到bean中  -->
    <content:component-scan base-package="demo1.java"></content:component-scan>
</beans>


想要用注解的方式将 Bean 对象注册到 Spring 容器中 , 就需要配置 content: component-scan base-package="具体包路径", 只有配置包路径地下的所有类, 添加了注解才能被正确识别到注册到 Spring 中

image.png


二. 简单存储 Bean 的五大类注解



1. @Controller 注解


同样的, 要进行注册到 Spring 容器中, 需要先创建 Bean 对象(普通 Java 对象)

c374c1a5a9bc4779bbde4605b82973f1.png


创建好了对象以后, 采用三步走获取 Bean 对象并使用

e644363ec14449978165d2d71992cde7.png


调用方法成功, 表示成功获取指定 Bean 对象

e6846994220c4974b90a2e2721b4bd17.png


@controller 表示的是业务逻辑层


2. @Service 注解


同上面一样, 创建 Bean 对象并添加注解进行获取使用

4ab2c149734d403cb3fb11dfa58db536.png


调用方法成功

eb9e5bcc8a3e49918f7608bac59f5a59.png


3. @Repository 注解

acdb2065f7e340c6b21b124a12df9951.png

调用方法成功

670975235da8498bab755f5b1a61f1b5.png


4. @Component 注解


image.png


调用方法成功

image.png


@Component 组件存储


5. @Configuration 注解


e0e7d273cbcd43e49531418052dda5d9.png


调用方法成功

2a5d22bf09bf48d4b60272019c11e6e7.png


6. Bean 的命名规则


上面的五大类注解中, 都会发现一个问题: 那就是这里的获取 Bean 对象时, 使用的不在是 spring-config.xml 里的指定 Bean 标签的 id 和类 类型的组合获取 Bean 对象, 哪该如何获取类注解下注入的 Bean 对象呢?


下面看一组示例

1359f36d2b874c5b8c698f71abb7bf3d.png


调用方法验证

image.png


此时我们发现, 和上面五大类注解讲解的时候是一样的获取方法, 但是现在却报错了这是为什么? 仔细看不难发现, 之前的五大类讲解时, 都是类名首字母大写, 而这里是类名的首字母和第二个字母都大写, 因此, 此处我们就要去看看 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);
    }


以上为 BeanName 的命名源码, 从上面源码可以看出, 当 首字母和第二个字母都大写的时候, 直接放回当前类名

733704c8b4ad450f9132e4b7ef831e13.png


7. 为什么有这么多相同功能的类注解


细心的可以发现, 上面五大类注解都干了同一件事, 那就是将 Bean 对象注入到 Spring 容器中, 那为什么还需要搞这么多个类注解呢? 是否有这个疑问?


8. 五大类注解之间有关系嘛?


既然功能都是差不多, 那么他们之间有什么关系嘛?

就这个问题, 去看他们的源码


1. @Controller 源码


e05ac510a4774d6fb4c13f5676c4fd66.png


2. @Service 源码


cdd33c6894044748a9a29ef3a7de1011.png


3. @Repository 源码


1c4cbde44bc44abfac1a96e3e7f8935d.png


4. @Configuration 源码


image.png


5. @Component 源码


image.png


通过观察上述源码, 发现五大类注解中, 都包含有 @Target @Retention @Documented 注解 ,

同时 除了 @Component 注解外, 其余四个注解都包含了 @Component 注解

因此, 我们可以知道, 其他四个注解都是 @Component 注解的子类


相关文章
|
Kubernetes 关系型数据库 MySQL
制品库 Jfrog Artifactory 搭建私服
JFrog Artifactory 功能最强大的二进制制品仓库。在 Google、Apple、思科、甲骨文、华为、腾讯等众多世界500强公司中都有大规模使用,在二进制软件制品管理领域处于绝对领先地位。与其他服务不同,JJFrog Artifactory 在版本发行上分类较多且杂。
1807 0
制品库 Jfrog Artifactory 搭建私服
|
前端开发 开发者 容器
彻底学会CSS 弹性布局flex
【4月更文挑战第1天】 彻底学会CSS 弹性布局flex
272 0
|
5G 网络安全 数据安全/隐私保护
小米路由器MINI刷Breed并刷写第三方潘多拉固件教程(上)
小米路由器MINI刷Breed并刷写第三方潘多拉固件教程
906 0
|
机器学习/深度学习 搜索推荐 算法
降维·预测·救命:PCA、随机森林与乳腺癌
降维·预测·救命:PCA、随机森林与乳腺癌
343 1
|
存储 机器学习/深度学习 运维
提升数据中心能效:现代运维策略与实践
【5月更文挑战第6天】 在数字化时代,数据中心作为信息处理的核心设施,其能源消耗和环境影响成为业界关注的焦点。本文将探讨如何通过现代运维策略和技术手段提升数据中心的能效,同时保证系统的可靠性和服务的连续性。文章将详细分析数据中心能耗的主要来源,介绍先进的能效优化措施,并通过案例分析展示这些措施的实际效果,为数据中心管理者提供实用的能效改进建议。
|
弹性计算 Linux 开发工具
学生如何领取阿里云服务器,阿里云服务器学生优惠教程
2023年学生如何领取阿里云服务器,阿里云服务器学生优惠教程,在通过学生身份认证及续费任务后,最多可领取1+6个月免费云服务器ECS资源
1212 0
|
弹性计算 Linux 应用服务中间件
【ECS生长万物之开源】部署并使用Docker
Docker是一款开源的应用容器引擎,具有可移植性、可扩展性、高安全性和可管理性等优势。开发者可将应用程序和依赖项打包到一个可移植的容器中,快速发布到Linux机器上并实现虚拟化,实现更高效地构建、部署和管理应用程序。本文介绍如何在云服务ECS实例上,部署并使用Docker。
|
编解码 C++
SDR 与 HDR:您应该了解什么
HDR vs SDR,你知道它们的具体区别吗?SDR 和 HDR 代表什么?在这篇文章中,您将熟悉最专业的 HDR 到 SDR 转换程序。请继续阅读以了解详细信息。
|
存储 缓存 API
FATFS函数浅谈 看完学会FATSFS,建议收藏
FATFS函数浅谈 看完学会FATSFS,建议收藏
|
中间件 数据库 程序员
阿里云中间件是什么-阿里云中间件介绍
这其实是一个比较虚的概念。广义的中间件范围很广。起沟通作用的都可以认为是中间件。甚至ODBC这样的东西你也可以认为是中间件。   使用了中间件之后,以前直接连接的前台应用程序和数据库之前就多了个中间件,现在前台程序把请求发给中间件,中间件再把请求发给数据库,数据库处理结束之后把结果返回到中间件,中间件再把结果送回给前台。
4543 96