首页 > 其他分享 >Spring学习笔记_15——@Resource

Spring学习笔记_15——@Resource

时间:2024-10-29 23:17:03浏览次数:3  
标签:Java Spring Resource JNDI bean dataSource 注解 15

@Resource

1. 介绍

@Resource注解是JSR250规范中提供的注解,主要作用就是通过JNDI技术查找依赖的组件并注入到类、字段和方法中来。

默认情况下,不指定注解任何属性时,会默认按照byName的方式装配Bean对象,如果指定了name属性,没有指定type属性,则采用byName的方式装配Bean对象,

如果没有指定name属性,而是指定了type属性,则按照byType的方式装配bean对象。

当同时指定了type属性和name属性,则两个属性都会校验,任何一个不符合条件就会报错。

当存在多个类型相同的bean时,可以指定@Resource注解的name属性指定装配哪个bean对象。相当于@Autowired注解与@Qualifier注解的组合。

@Resource注解与@Qualifier注解也可以搭配使用,通过@Qualifier注解指定装配哪个bean。

2. @Resource && @Autowired

  • @Resource注解时JSR250规范中提供的注解,如果使用的JDK8版本,则无需额外导入依赖,如果使用的JDK版本低于8或高于11,则需要额外导入依赖;@Autowired注解时基于Spring框架提供的注解。
  • @Resource注解默认通过byName的方式装配bean,找不到bean的话,就通过byType的方式装配Bean;@Autowired注解默认根据byType的方式装配bean,如果需要根据名称装配bean,则需要结合@Qualifier注解一起使用。
  • @Resource注解标注到类、字段和方法上。@Autowired注解标注到构造方法、方法、参数、字段、其他注解上。

3. 源码

package jakarta.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(Resources.class)
public @interface Resource {
    // 资源JNDI名称,装配指定名称的bean
    String name() default "";
    // 装备指定类型的bean
    String lookup() default "";
    // 引用指向的资源名称,可以使用JNDI名称只想任何兼容的资源。
    Class<?> type() default Object.class;
    // 执行身份验证类型
    enum AuthenticationType {
        CONTAINER,
        APPLICATION
    }
    Resource.AuthenticationType authenticationType() default Resource.AuthenticationType.CONTAINER;
    // 执行当前bean是否可以在多个组件之间共享
    boolean shareable() default true;
    // 指定资源的映射名称
    String mappedName() default "";
    // 指定资源的描述
    String description() default "";
}
4. Demo
  • 在构造方法上使用
import jakarta.annotation.Resource;
import javax.sql.DataSource;

public class DatabaseService {

    private final DataSource dataSource;

    // 使用@Resource注解注入DataSource
    @Resource(name = "myDataSource")
    public DatabaseService(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    public void performDatabaseOperation() {
        // 使用dataSource执行数据库操作
    }
}
  • 在Setter方法上使用
import jakarta.annotation.Resource;
import javax.sql.DataSource;

public class DatabaseService {

    private DataSource dataSource;

    // 使用@Resource注解注入DataSource
    @Resource(name = "myDataSource")
    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    public void performDatabaseOperation() {
        // 使用dataSource执行数据库操作
    }
}
  • 在字段上使用
import jakarta.annotation.Resource;
import javax.sql.DataSource;

public class DatabaseService {

    // 使用@Resource注解注入特定类型的DataSource
    @Resource(type = CustomDataSource.class)
    private DataSource dataSource;

    public void performDatabaseOperation() {
        // 使用dataSource执行数据库操作
    }
}

5. 补充

5.1 JDNI

JNDI是Java Naming and Directory Interface的缩写,即Java命名和目录接口。它是Java平台的一个标准扩展,提供了一组接口、类和关于命名空间的概念。JNDI是一个provider-based的技术,这意味着任何基于名字的技术都能通过JNDI提供服务,只要JNDI支持这项技术。JNDI目前所支持的技术包括LDAP、CORBA Common Object Service(COS)名字服务、RMI、NDS、DNS、Windows注册表等。

JNDI通过绑定的概念将对象和名称联系起来。在一个文件系统中,文件名被绑定给文件;在DNS中,一个IP地址绑定一个URL;在目录服务中,一个对象名被绑定给一个对象实体。JNDI中的一组绑定作为上下文来引用,每个上下文暴露的一组操作是一致的,例如查找操作,返回指定名字的相应对象,以及绑定和撤除绑定名字到某个对象的操作。

JNDI使用通用的方式来暴露命名空间,即使用分层上下文以及使用相同命名语法的子上下文。很多J2EE技术,包括EJB都依靠JNDI来组织和定位实体。简而言之,JNDI为Java应用程序提供了一个查找和访问各种命名和目录服务的通用统一的接口。

5.2 JSR

SR是Java Specification Requests的缩写,意思是“Java规范提案”。它是一种向Java社区进程(Java Community Process,简称JCP)提出的正式请求,用于新增一个标准化技术规范。任何人都可以提交JSR,以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准,它允许Java开发者和授权者共同制定标准,这些标准随后会被软件厂商实现,从而推动Java技术的发展。

JCP是一个由来自世界各地的Java代表成员组成的组织,负责监督Java的发展。JCP维护的规范包括Java SE、Java EE、Java ME、XML、OSS、JAIN等。通过JSR,组织成员可以提交Java技术规范、参考实现(RI)和技术兼容包(TCK),这些内容最终会成为下一版本的规范的一部分。

5.3 JSR中定义的部分注解

  • @Resource:这是JSR-250标准中定义的注解,用于依赖注入,可以完成属性注入。@Resource注解是JDK扩展包中的一部分,属于标准注解,具有通用性。它可以指定名称(name)和类型(type)等参数来注入特定的资源。
  • @PostConstruct@PreDestroy:这两个注解也是JSR-250标准中定义的,分别用于标注在方法上,表示在构造函数执行之后(@PostConstruct)和在销毁之前(@PreDestroy)需要执行的方法。
  • @Inject:这是JSR-330标准中定义的注解,用于依赖注入。它提供了一种声明式的方式来实现依赖注入,可以替代@Autowired注解在某些场景下的使用。
  • @Named@Singleton:这些注解来自JSR-330,@Named用于标注一个bean的名称,@Singleton用于标注一个bean的作用域为单例。
  • @Provider:这是JSR-330中定义的注解,用于标注一个实现了javax.inject.Provider接口的类,该接口提供了一个方法get()来获取bean的实例。

标签:Java,Spring,Resource,JNDI,bean,dataSource,注解,15
From: https://blog.csdn.net/LuckyLay/article/details/143352464

相关文章

  • 基于springboot的校园管理系统的设计与实现(含源码)
    随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,校园管理系统当然也不能排除在外。校园管理系统是以实际运用为开发背景,运用软件工程原理和开发方法,采用springboot框架构建的一个管理系统。整个开发过程首先对软件系......
  • 深入浅出:SpringBoot启动流程源码分析(持续更新中......)最新日期:2024年10月29日
    Hello,大家好,我是此林。今天来深入底层讲一讲SpringBoot是如何启动的,也就是我们单击运行SpringBoot启动类,它底层发生了什么?SpringBoot启动类很简单,只有一行代码。我们点进run()方法。我们发现,它底层其实进行了两步操作。第一步是new出一个SpringApplication对象,第二个是......
  • Spring Boot 和 Spring Cloud 的区别
    在Java开发领域,SpringBoot和SpringCloud都是非常流行的框架,它们为开发者提供了便捷的开发方式和强大的功能。但很多人对这两个框架的区别并不十分清楚。本文将详细介绍SpringBoot和SpringCloud的区别。一、SpringBoot简介SpringBoot是一个用于快速构建独立的、......
  • springmvc-servlet.xml和web.xml文件的存放路径是哪里?项目添加到Tomcat上运行后就报错
        用eclipse写了一个简单的web项目,springmvc-servlet.xml文件和web.xml文件都配置好了,运行起来能看见hello的web页面,但是有一堆报错,不知道是什么原因                                     ......
  • 基于SpringBoot+Vue的社区居民诊疗健康服务平台设计与实现
    ......
  • 基于Java+SpringBoot+Mysql实现的古诗词平台功能设计与实现七
    一、前言介绍:1.1项目摘要随着信息技术的迅猛发展和数字化时代的到来,传统文化与现代科技的融合已成为一种趋势。古诗词作为中华民族的文化瑰宝,具有深厚的历史底蕴和独特的艺术魅力。然而,在现代社会中,由于生活节奏的加快和信息获取方式的多样化,古诗词的传播和阅读面临着一定的挑......
  • 基于Java+SpringBoot+Mysql实现的古诗词平台功能设计与实现八
    一、前言介绍:1.1项目摘要随着信息技术的迅猛发展和数字化时代的到来,传统文化与现代科技的融合已成为一种趋势。古诗词作为中华民族的文化瑰宝,具有深厚的历史底蕴和独特的艺术魅力。然而,在现代社会中,由于生活节奏的加快和信息获取方式的多样化,古诗词的传播和阅读面临着一定的挑......
  • 『模拟赛』多校A层冲刺NOIP2024模拟赛15
    Rank一般A.追逐游戏(chase)签,但是保龄。上来发现情况好像是有限的,于是直接分讨,不过漏了n种情况,小样例水,大样例vscose自带的compare跑不出来,注销一遍之后甚至进度条都没了导致我以为过了,最后10min才发现(赛后发现二分是可做的,但是倍增的巨大常数加上逆天评测速度......
  • springboot+vue彩妆品牌网站【开题+程序+论文】
    系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展和电子商务的蓬勃兴起,彩妆行业迎来了前所未有的发展机遇。现代消费者越来越倾向于通过线上渠道了解和购买彩妆产品,他们追求个性化、便捷化的购物体验,同时希望获取详尽的产品信息和专业的美妆建议。在这一背景......
  • springboot+vue采购系统的设计与实现【开题+程序+论文】
    系统程序文件列表开题报告内容研究背景在当今竞争激烈的商业环境中,企业的高效运营与成本控制成为了其持续发展的关键要素。采购作为企业生产经营活动的起点,其管理效率直接影响到企业的生产成本、产品质量和市场竞争力。传统的手工采购模式不仅耗时费力,还容易因信息不对称和......