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

相关推荐
麦兜*12 分钟前
MongoDB 6.0 新特性解读:时间序列集合与加密查询
数据库·spring boot·mongodb·spring·spring cloud·系统架构
a5876916 分钟前
消息队列(MQ)初级入门:详解RabbitMQ与Kafka
java·分布式·microsoft·面试·kafka·rabbitmq
考虑考虑19 分钟前
Postgerssql格式化时间
数据库·后端·postgresql
千里码aicood27 分钟前
【springboot+vue】党员党建活动管理平台(源码+文档+调试+基础修改+答疑)
java·数据库·spring boot
Chan1631 分钟前
【智能协同云图库】基于统一接口架构构建多维度分析功能、结合 ECharts 可视化与权限校验实现用户 / 管理员图库统计、通过 SQL 优化与流式处理提升数据
java·spring boot·后端·sql·spring·intellij-idea·echarts
先做个垃圾出来………37 分钟前
差分数组(Difference Array)
java·数据结构·算法
库库林_沙琪马1 小时前
REST接口幂等设计深度解析
spring boot·后端
BillKu1 小时前
Java核心概念详解:JVM、JRE、JDK、Java SE、Java EE (Jakarta EE)
java·jvm·jdk·java ee·jre·java se·jakarta ee
IT_陈寒1 小时前
Redis性能提升50%的7个关键优化策略,90%开发者都不知道第5点!
前端·人工智能·后端
智商偏低1 小时前
ASP.NET Core 身份验证概述
后端·asp.net