@Resource和@Autowired注解使用方式及区别

@Resource和@Autowired都是用于进行依赖注入的注解,用于将一个Bean注入到另一个Bean中。

  1. @Resource注解:

@Resource注解属于JDK扩展包,所以不在JDK当中,需要额外引入以下依赖:【如果是JDK8的话不需要额外引入依赖。高于JDK11或低于JDK8需要引入以下依赖。
依赖:

<dependency>
    <groupId>jakarta.annotation</groupId>
    <artifactId>jakarta.annotation-api</artifactId>
    <version>2.1.1</version>
</dependency>

源码:

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 {
    String name() default "";

    String lookup() default "";

    Class<?> type() default Object.class;

    Resource.AuthenticationType authenticationType() default 
    Resource.AuthenticationType.CONTAINER;

    boolean shareable() default true;

    String mappedName() default "";

    String description() default "";

    public static enum AuthenticationType {
        CONTAINER,
        APPLICATION;

        private AuthenticationType() {
        }
    }
}

@Resource是Java标准的注解,可以用于注入依赖对象。它有两种使用方式:

  • 通过名称注入:使用@Resource时可以指定name属性来指定要注入的Bean的名称,例如:@Resource(name = "dependency")。如果没有指定name属性,默认会按照名称匹配进行注入。
  • 通过类型注入:如果没有指定name属性,@Resource会按照类型匹配进行注入,如果存在多个符合类型的Bean,则会抛出异常。

@Resource可以用于字段、Setter方法和构造方法上。

示例:

@Service
public class UserServiceImpl implements UserService {

    @Resource(name = "myUserDao")
    private UserDao myUserDao;
}
  1. @Autowired注解:

源码:

package org.springframework.beans.factory.annotation;

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

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, 
ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
	// required属性,默认值是true,表示在注入的时候要求被注入的Bean必须是存在的,
	// 如果不存在则报错。如果required属性设置为false,表示注入的Bean存在或者
	// 不存在都没关系,存在的话就注入,不存在的话,也不报错
    boolean required() default true;
}

@Autowired是Spring框架提供的注解,用于进行依赖注入。它有以下几种使用方式:

  • 通过类型注入:使用@Autowired时,会根据类型自动注入相应的Bean。如果存在多个符合类型的Bean,则会抛出异常。可以通过@Qualifier注解结合使用,指定具体的Bean名称,例如:@Autowired @Qualifier("dependency")
  • 通过名称注入:可以使用@Autowired的required属性来设置是否必须注入,例如:@Autowired(required = false)。如果设置为false,则允许为null,否则会抛出异常。

@Autowired可以用于字段、Setter方法、构造方法和普通方法上。

示例:

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    @Qualifier("userDaoImpl") // 指定bean的名字
    private UserDao userDao;

}

区别:

  • @Resource是Java标准的注解(是JDK扩展包中的,JSR-250标准中制定的注解类型),而@Autowired是Spring框架提供的注解。
  • @Resource默认是按照名称进行注入的,而@Autowired默认是按照类型进行注入的。
  • @Resource可以用于字段、Setter方法和构造方法上,而@Autowired还可以用于普通方法上。
  • @Autowired可以与@Qualifier注解结合使用,以指定具体的Bean名称。

总的来说,两者的作用类似,都可以进行依赖注入,但使用方式和一些细节上有所不同。根据具体的需求和使用场景,可以选择适合的注解来完成依赖注入。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值