Spring framework Day09:JSR250注入注解

前言

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 依赖
XML 复制代码
 
    <!-- 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 接口

java 复制代码
public interface UserService {

    void save();

}

UserServiceImpl 实现类

java 复制代码
@Service("userService")
@Slf4j
public class UserServiceImpl implements UserService {
    @Override
    public void save() {
        log.info("添加用户.....");
    }
}
3、在 controller 包下,新建 UserController 类
java 复制代码
@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 复制代码
<?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、测试
java 复制代码
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

相关推荐
Java水解2 分钟前
彻底解决Flask日志重复打印问题:从原理到实践
后端·flask
Nick同学3 分钟前
GatewayWorker 使用总结
后端·php
程序员岳焱5 分钟前
Java 高级泛型实战:8 个场景化编程技巧
java·后端·编程语言
钢铁男儿15 分钟前
C# 类和继承(扩展方法)
java·servlet·c#
饮长安千年月21 分钟前
JavaSec-SpringBoot框架
java·spring boot·后端·计算机网络·安全·web安全·网络安全
移动开发者1号22 分钟前
Android 大文件分块上传实战:突破表单数据限制的完整方案
android·java·kotlin
代码匠心23 分钟前
从零开始学Flink:揭开实时计算的神秘面纱
java·大数据·后端·flink
jie1889457586638 分钟前
C++ 中的 const 知识点详解,c++和c语言区别
java·c语言·c++
Livingbody41 分钟前
Transformers Pipeline 加载whisper模型实现语音识别ASR
后端
网安INF43 分钟前
RSA加密算法:非对称密码学的基石
java·开发语言·密码学