springboot @resource与private final声明式的有何区别??

简介: 【6月更文挑战第3天】在Spring Boot中,@Resource 和 private final 常用于依赖注入,但它们的用途和行为有一些重要的区别。

在Spring Boot中,@Resourceprivate final 常用于依赖注入,但它们的用途和行为有一些重要的区别。以下是对这两者的详细分析:

1. @Resource 注解

@Resource 是来自于 Java 的标准注解(在 javax.annotation 包中),用于依赖注入。它具有以下特点:

  • 按名称注入:默认情况下,@Resource 按名称进行注入。如果没有找到匹配的名称,它将按类型进行注入。如果需要按名称注入,可以通过 @Resource(name="beanName") 来指定。
  • 支持 JSR-250:它是 JSR-250 规范的一部分,适用于Java EE和Spring环境。
  • 生命周期回调:可以与 JSR-250 其他注解(如 @PostConstruct@PreDestroy)一起使用,定义Bean生命周期回调方法。

java复制代码

import javax.annotation.Resource;

public class MyService {
    @Resource
    private MyRepository myRepository;
    
    // 其他代码
}

2. private final 声明

private final 是Java语言自身的特性,private 修饰符用于表示成员变量的访问权限,而 final 修饰符表示变量一旦被赋值就无法再重新赋值。它常与构造器注入(Constructor Injection)结合使用,以确保依赖在对象创建时被注入,并且不可变:

  • 构造器注入:通过构造器注入,依赖在对象创建时被注入,这确保了依赖的不可变性和完整性。
  • 强制初始化:由于 final 修饰符,依赖必须在构造函数中初始化,这有效防止了未初始化的问题。
  • 线程安全:在多线程环境中,final 变量在对象创建后不可变,提升了安全性。

java复制代码

import org.springframework.stereotype.Service;

@Service
public class MyService {
    private final MyRepository myRepository;

    public MyService(MyRepository myRepository) {
        this.myRepository = myRepository;
    }
    
    // 其他代码
}

区别总结

  1. @Resourceprivate final 在Spring框架中用于依赖注入,但它们在用途和行为上有所不同:
  1. 依赖注入方式
  • @Resource:这是一个Spring注解,用于按名称或类型自动注入依赖。默认情况下,它按名称注入,如果找不到匹配的名称,则按类型注入。你可以通过@Resource(name="beanName")指定要注入的Bean的名称。
  • private final:通常与构造器注入一起使用,要求在构造函数中显式设置依赖。一旦赋值,该字段就不能更改,确保依赖的不可变性。
  1. 可变性
  • @Resource:注入的依赖可以在运行时更改,因为它是通过setter方法或字段注入的。
  • private final:由于使用final,注入的依赖在对象创建后不能更改,提供了不可变性。
  1. 初始化时间
  • @Resource:依赖通常在Spring容器初始化Bean时注入,这意味着你可以在对象创建后注入依赖。
  • private final:依赖在构造函数中初始化,确保在对象创建时就已设置。
  1. 类型安全
  • @Resource:如果Spring找不到匹配的Bean,可能会抛出异常,因此不是完全类型安全的。
  • private final:通过构造器注入,类型安全得到保证,因为编译器会在编译时检查类型匹配。
  1. 代码可读性
  • @Resource:依赖注入是隐式的,可能需要查看代码或配置文件来理解依赖关系。
  • private final:构造器注入更显式,直接在构造函数参数中看到依赖关系,可读性更强。
  1. 测试性
  • @Resource:在单元测试中,可能需要使用@Autowired@InjectMocks等注解来模拟依赖。
  • private final:构造器注入使得更容易在测试中使用构造函数注入mock对象。

在实践中,private final 通常被认为是一种更好的做法,因为它强调了依赖注入,提高了代码的可读性和可测试性。然而,@Resource 在某些特定情况下(如按名称注入或与Java EE集成)可能是有用的。

何时使用哪种方式?

  • 构造器注入:推荐用于大多数场景,特别是当你希望依赖是不可变的,并且在对象创建时就必须存在。这提高了代码的可测试性,因为可以轻松注入 mock 依赖。
  • @Resource 注解:适用于需要按名称注入的场景,或在使用 Java EE 标准注解的环境下。

选择何种方式主要取决于项目的具体需求和设计原则。构造器注入通常更被推荐,因为它更符合依赖注入的最佳实践,增强了代码的可维护性和可测试性。

相关文章
|
Java
SpringBoot 使用 private final 注入Bean
SpringBoot 使用 private final 注入Bean
957 0
SpringBoot 使用 private final 注入Bean
|
1月前
|
Java
springboot打包错误:Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resource
springboot打包错误:Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resource
35 0
|
1月前
|
安全 Java Spring
springboot @Resource、@AutoWaire的用法实战
【4月更文挑战第3天】在Spring Boot中,@Autowired和@Resource注解都用于自动注入依赖,但它们在底层工作方式和使用的场合上存在一些差异。理解这些差异有助于更有效地使用Spring框架。
60 1
|
1月前
|
Java 数据库连接 API
SpringBoot【问题 01】借助@PostConstruct解决使用@Component注解的类用@Resource注入Mapper接口为null的问题(原因解析+解决方法)
SpringBoot【问题 01】借助@PostConstruct解决使用@Component注解的类用@Resource注入Mapper接口为null的问题(原因解析+解决方法)
172 0
|
10月前
|
Java Spring
SpringBoot 中- HandlerInterceptor 中 @Autowired 和 @Resource 为空
SpringBoot 中- HandlerInterceptor 中 @Autowired 和 @Resource 为空
66 0
|
11月前
|
Java 测试技术
【Java】SpringBoot项目中resource目录下有多个配置文件,如何指定某个特定的配置文件生效?
【Java】SpringBoot项目中resource目录下有多个配置文件,如何指定某个特定的配置文件生效?
271 0
|
Java 测试技术 Maven
SpringBoot 3.0 新特性,内置声明式 HTTP 客户端
从 Spring 6 和 Spring Boot 3 开始,Spring 框架支持将远程 HTTP 服务代理成带有特定注解的 Java http interface。类似的库,如 OpenFeign 和 Retrofit 仍然可以使用,但 http interface 为 Spring 框架添加内置支持。
1106 1
SpringBoot 3.0 新特性,内置声明式 HTTP 客户端
|
Java
springboot打包错误:Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resource
springboot打包错误:Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resource
211 0
springboot打包错误:Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resource
|
Java
springBoot中声明式事务的使用
springBoot中声明式事务的使用
81 0