简单存 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 注解的子类


相关文章
|
Java 网络安全 Maven
简记:一个flutter构建错误A problem occurred configuring project ‘:smart_auth‘. > Could not res
简记:一个flutter构建错误A problem occurred configuring project ‘:smart_auth‘. > Could not res
997 0
|
4月前
|
人工智能 自然语言处理 API
全面认识MCP:大模型连接真实世界的“USB-C接口”
MCP(模型上下文协议)由Anthropic提出,是AI时代的“万能接口”,旨在标准化大模型与工具、数据源的连接。它降低开发复杂度,提升AI任务执行能力,推动智能体生态发展,被誉为AI应用落地的关键技术范式。
|
8月前
|
消息中间件 负载均衡
RabbitMQ的工作模型?
RabbitMQ 核心模型包括交换机、队列和绑定,支持五种消息模式:简单队列、工作队列、发布/订阅、路由和主题模式,适用于不同场景的消息通信与分发。
1292 0
|
机器学习/深度学习 数据采集 人工智能
【紧跟AI浪潮】深度剖析:如何在大模型时代精准捕获用户心声——提高召回率的实战秘籍
【10月更文挑战第5天】在深度学习领域,大型模型常面临召回率不足的问题,尤其在信息检索和推荐系统中尤为关键。本文通过具体代码示例,介绍如何提升大模型召回率。首先,利用Pandas进行数据预处理,如清洗和特征工程;其次,选择合适的模型架构,如使用PyTorch构建推荐系统;再者,优化训练策略,采用合适的损失函数及正则化技术;此外,选择恰当的评估指标,如召回率和F1分数;最后,通过后处理优化结果展示。以上方法不仅提升召回率,还增强了模型整体性能。
844 0
|
设计模式 算法 Java
策略模式与模版模式的区别与应用
策略模式与模版模式的区别与应用
299 4
|
存储 传感器 监控
《探秘鸿蒙Next:模型轻量化的能源效益衡量之道》
在鸿蒙Next生态中,模型轻量化显著提升设备能源效益。通过功耗指标(CPU、GPU、整体设备)、运行时间与能耗比值、电池续航(实际场景和极端测试)、散热情况(温度变化、散热能耗)及资源占用(内存、存储)的综合衡量,可全面评估轻量化模型对能源效率的优化效果,为设备性能提升提供依据。
430 10
《探秘鸿蒙Next:模型轻量化的能源效益衡量之道》
|
前端开发 开发者 容器
彻底学会CSS 弹性布局flex
【4月更文挑战第1天】 彻底学会CSS 弹性布局flex
343 0
|
定位技术 API 开发工具
iOS语言本地化/国际化宝典
iOS语言本地化/国际化宝典
1046 0
iOS语言本地化/国际化宝典
|
机器学习/深度学习 搜索推荐 算法
降维·预测·救命:PCA、随机森林与乳腺癌
降维·预测·救命:PCA、随机森林与乳腺癌
428 1
|
弹性计算 Linux 应用服务中间件
【ECS生长万物之开源】部署并使用Docker
Docker是一款开源的应用容器引擎,具有可移植性、可扩展性、高安全性和可管理性等优势。开发者可将应用程序和依赖项打包到一个可移植的容器中,快速发布到Linux机器上并实现虚拟化,实现更高效地构建、部署和管理应用程序。本文介绍如何在云服务ECS实例上,部署并使用Docker。

热门文章

最新文章