Spring framework Day09:JSR250注入注解

news2025/2/25 16:51:31

前言

JSR 250 是 Java Specification Request 的缩写,它定义了一组用于依赖注入和生命周期管理的注解。这些注解是在 Java EE 5 规范中引入的,用于简化和标准化开发企业级应用程序的依赖注入和生命周期管理。

一、开始学习

本次需要学习的依然是注解,本次学习的注解是 @Resource。

@Resource 是 Java EE 规范中定义的注解之一,它用于标记一个成员变量或方法,表示该变量或方法需要依赖注入。@Resource 注解主要有以下几个属性:

  1. name:指定需要注入的 Bean 的名称。如果不指定,则默认使用成员变量名或方法名作为 Bean 的名称,容器会自动查找对应的 Bean 进行注入。

  2. type:指定需要注入的 Bean 的类型。如果不指定,则默认使用成员变量或方法的类型作为 Bean 的类型,容器会自动查找对应类型的 Bean 进行注入。

  3. lookup:指定需要注入的 Bean 的 JNDI 地址。如果指定了该属性,则 nametype 属性将被忽略。

除了以上三个属性,@Resource 还支持 mappedName 属性和 shareable 属性。其中,mappedName 属性用于指定 Bean 的 JNDI 名称,shareable 属性用于指定是否可以在多个线程之间共享 Bean 实例。

需要注意的是,@Resource 注解是 Java EE 规范中定义的注解,如果使用 Spring 等其他框架,建议使用对应框架中提供的注解进行依赖注入。

本次我们主要介绍的是 name 属性的使用。

1、新建项目,结构如下

2、添加 spring 依赖
 
    <!-- spring 的核心依赖 -->
    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.23</version>
        </dependency>
 
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.4.5</version>
        </dependency>

        <!-- @Resource 需要用到的依赖 -->
        <dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>javax.annotation-api</artifactId>
            <version>1.2</version>
        </dependency>

 
 
    </dependencies>

注意:@Resource 在 JDK 11 中被移除了,如果要使用需要额外添加依赖,我使用的是 JDK 11,所以需要自己添加依赖使用 @Resource 注解。

3、在 service 包下新建 UserService 接口,在 impl 包下新建 UserServiceImpl 实现类

UserService 接口

public interface UserService {

    void save();

}

UserServiceImpl 实现类

@Service("userService")
@Slf4j
public class UserServiceImpl implements UserService {
    @Override
    public void save() {
        log.info("添加用户.....");
    }
}
3、在 controller 包下,新建 UserController 类

@Controller
public class UserController {


    private UserService userService;


    public UserController(UserService userService) {
        this.userService = userService;
    }

    /**
     * name 指定需要注入的 bean 的 id
     *
     * @param userService
     */
    @Resource(name = "userService")
    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    public void add() {
        userService.save();
    }

}

这是一个使用注解和构造函数进行依赖注入的示例代码。代码中的 UserController 类使用了 @Controller 注解来声明一个控制器类,并定义了一个 userService 成员变量和一个构造函数。

在构造函数中,通过将 UserService 对象作为参数传入构造函数,实现了对 userService 的依赖注入。这样,创建 UserController 对象时就会自动注入所需的 UserService 对象。

另外,代码中还使用了 @Resource 注解来标记 setUserService() 方法,该方法用于注入 userService 对象。通过指定 name 属性为 "userService",使得容器可以根据该名称找到对应的 UserService Bean,并将其注入到 userService 成员变量中。

最后,在 add() 方法中调用了 userServicesave() 方法,实现了对 userService 的使用。

这样,通过注解和构造函数的方式,实现了对 userService 的依赖注入,使得 UserController 能够正常使用 UserService 的功能。

 注意:使用 JSR250(Java 规范提案),它设计了 @Resource 注解来支持依赖注入
 spring 对这个注解也实现了支持,需要注意的时这个注解只能用在字段或者 set
 方法上,并不支持构造方法注入,默认也是按照类型注入。

4、在 resources 下新建一个 spring 的 xml 文件 application.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:context="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">

    <!-- 启用包扫描 -->
    <context:component-scan base-package="edu.nf.ch09"/>

</beans>
 5、测试
public class Main {
 
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        UserController bean = context.getBean(UserController.class);
        bean.add();
    }
 
}

运行结果

 二、使用 @Service @Controller @Resource开发有什么好处

使用@Service@Controller@Resource等注解开发具有以下好处:

  1. 简化配置:通过使用注解,可以减少配置文件的编写,使代码更加简洁。注解能够自动完成配置和装配工作,提高开发效率。

  2. 提供声明式事务管理:@Service注解表示该类为服务层组件,可以使用声明式事务管理。在需要进行事务管理的方法上,使用@Transactional注解,就可以实现对方法的事务控制。

  3. 实现控制反转(IoC)和依赖注入(DI):@Controller@Service注解都是用来标识组件的,它们作为容器的组件扫描的目标。在Spring容器中,可以使用@Resource注解将一个对象引用注入到另一个对象中,实现依赖注入。

  4. 统一管理和组织代码:使用注解可以更好地组织和管理代码,通过注解的方式,可以清晰地标识出不同层次的组件,并且使得代码结构更加清晰。

  5. 提高可读性和可维护性:使用注解可以使代码更加直观和易读,通过注解的方式,可以清晰地表达出代码的意图和作用。同时,也方便维护和修改,减少了繁琐的配置。

总体而言,使用@Service@Controller@Resource等注解开发可以简化配置、提供声明式事务管理、实现控制反转和依赖注入,统一管理和组织代码,并提高可读性和可维护性。

三、gitee 案例

案例完整地址:https://gitee.com/qiu-feng1/spring-framework.git

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

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

相关文章

淘宝商品品牌数据采集接口,淘宝商品详情数据接口,淘宝API接口

采集淘宝商品品牌数据&#xff0c;可以按照以下步骤进行&#xff1a; 确定采集目标&#xff1a;确定要采集的淘宝商品品牌和具体的产品类型。选择采集工具&#xff1a;可以选择爬虫、数据抓取工具等采集工具进行数据采集。设置采集参数&#xff1a;设置采集参数&#xff0c;包…

ROS中的图像数据

无论是USB摄像头还是RGBD摄像头&#xff0c;发布的图像数据格式多种多样&#xff0c;在处理这些数据之前&#xff0c;我们首先需要了解这些数据的格式。 二维图像数据 连接USB摄像头到PC端的USB接口&#xff0c;通过以下命令启动摄像头&#xff1a; roslaunch usb_cam usb_ca…

PHP 员工工资管理系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP 员工工资管理系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 php员工工资管理系统 代码 https://download.csdn.net/download/qq_41221322/884215…

睿趣科技:未来抖音开网店还有前景吗

随着科技的快速发展&#xff0c;电商平台已经成为了人们生活中不可或缺的一部分。在中国&#xff0c;抖音作为一个短视频平台&#xff0c;近年来迅速崛起&#xff0c;吸引了大量的用户和商家。那么&#xff0c;在未来&#xff0c;抖音是否还能为商家提供一个有效的电商平台呢?…

【LeetCode】2319. 判断矩阵是否是一个X矩阵

难度&#xff1a;简单 题目 如果一个正方形矩阵满足下述 全部 条件&#xff0c;则称之为一个 X 矩阵 &#xff1a; 矩阵对角线上的所有元素都 不是 0矩阵中所有其他元素都是 0 给你一个大小为 n x n 的二维整数数组 grid &#xff0c;表示一个正方形矩阵。如果 grid 是一个…

小谈设计模式(28)—解释器模式

小谈设计模式&#xff08;28&#xff09;—解释器模式 专栏介绍专栏地址专栏介绍 解释器模式角色分析抽象表达式&#xff08;Abstract Expression&#xff09;终结符表达式&#xff08;Terminal Expression&#xff09;非终结符表达式&#xff08;Non-terminal Expression&…

opencv图像卷积操作和常用的图像滤波函数

文章目录 opencv图像卷积操作原理&#xff0c;opencv中常用的图像滤波函数一、图像卷积操作原理&#xff1a;1、卷积操作原理图&#xff1a; 二、opencv常用的图像滤波函数&#xff1a;这些函数的主要作用是对图像进行平滑处理或去除噪声(核心目的是减少图像中的噪声&#xff0…

PG14归档失败解决办法archiver failed on wal_lsn

问题描述 昨晚RepmgrPG14主备主库因wal日志撑爆磁盘&#xff0c;删除主库过期wal文件重做备库后上午进行主备状态巡查&#xff0c;主库向备库发送wal文件正常&#xff0c;但是查主库状态时发现显示有1条归档失败的记录。 postgres: archiver failed on 000000010000006F000000…

spring自动装配byType和@Autowired依赖注入源码分析(史上最详细的Spring源码分析系列一)

写在前面&#xff1a;阅读spring源码需要读者对Java反射和动态代理有一定了解。关于这部分内容&#xff0c;可以参考这篇博客&#xff1a;Spring源码分析准备工作及java知识补充 一、Spring依赖注入的方式 关于spring的依赖注入&#xff0c;可以参考官方文档&#xff1a;Spring…

分享一下公众号怎么添加在线挂号功能

公众号添加在线挂号功能 一、准备阶段 在开始之前&#xff0c;你需要了解公众号在线挂号的基本流程和需求。在线挂号需要实现以下功能&#xff1a;患者可以通过公众号预约挂号、填写个人信息、选择医生和时间等。在公众号上添加在线挂号功能&#xff0c;需要结合医疗资源、时…

android 与 flutter 之间的通信

文章目录 前言集成 flutter 混合开发android 与 flutter 之间的通信总结 一、前言 因为flutter 具有跨平台的属性&#xff0c;既可以在android上跑&#xff0c;也能在ios 上跑&#xff0c;所以为了节约开发的成本&#xff0c;减少人力&#xff0c;势必就会用到它。然而已有的…

跨语言深入探讨如何实现方法增强:Java Go的多策略实现

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

YB4014是可以对单节磷酸铁锂电池进行恒流/恒压充电管理的集成电路。

概述&#xff1a; YB4014是可以对单节磷酸铁锂电池进行恒流/恒 压充电管理的集成电路。该器件内部包括功率晶 体管&#xff0c;不需要外部的电流检测电阻和阻流二极管 YB4014只需要极少的外围元器件&#xff0c;非常适合于 便携式应用的领域。热调制电路可以在器件的功 耗比较大…

基于SSM的在线教育平台的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

用获取手机号归属地详情,精准高效的API接口服务为标题

获取企业联系人网站API接口是一种非常有用的工具&#xff0c;它可以帮助我们快速获取企业的联系人信息。在这篇博文中&#xff0c;我们将介绍如何使用这个API接口&#xff0c;并讲解其原理和功能。 一、什么是API接口&#xff1f; API是“应用程序编程接口”的缩写&#xff0c…

瑞芯微RK3568核心板在边缘服务器产品中的应用-迅为电子

迅为RK3568核心板在边缘服务器产品中可以发挥关键作用&#xff0c;为边缘计算应用提供高性能的计算和多媒体处理能力。边缘服务器通常用于处理和存储数据&#xff0c;执行本地计算任务&#xff0c;并支持与远程云服务的通信。以下是RK3568核心板在边缘服务器产品中的应用方案&a…

Red Giant Trapcode Suite 红巨星粒子插件

Red Giant Trapcode Suite是一款用于在After Effects中模拟和建模3D粒子和效果的软件&#xff0c;由Red Giant Software公司开发。 该软件包包含11种不同的工具&#xff0c;可以帮助用户模拟火、水、烟、雪等粒子效果&#xff0c;以及创建有机视觉效果和3D元素。它还支持在AE与…

【mysql】 bash: mysql: command not found

在linux 服务器上安装了mysql 也可以正常运行。 但是执行命令&#xff0c;系统提示&#xff1a;bash: mysql: command not found bash:mysql:找不到命令 执行的命令是&#xff1a; mysql -u root -h 127.0.0.1 -p由于系统默认会查找的 /usr/bin/ 中下的命令&#xff0c;如…

Mysql8在Windows上离线安装时忘记root密码

场景 Mysql在Windows上离线安装与配置&#xff1a; Mysql在Windows上离线安装与配置_mysql 离线包 配置 及 自动启动 windows_霸道流氓气质的博客-CSDN博客 基于以上离线安装Msyql后&#xff0c;服务器重新做了系统&#xff0c;但是没有格式化磁盘或者说从 别的服务器将安装…

Jetson Orin NX 开发指南(9): MAVROS 的安装与配置

一、前言 由于 Jetson 系列开发板常作为自主无人机的机载电脑&#xff0c;而无人机硬件平台如 PX4 和 ArduPilot 等通过 MAVLink 进行发布无人机状态和位姿等信息&#xff0c;要实现机载电脑与 MAVLink 的通信&#xff0c;必须借助 Mavros 功能包&#xff0c;因此&#xff0c;…