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 依赖
 
    <!-- 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值