【Spring】——17、@Resource注解和@Inject注解?

在这里插入图片描述

作者简介:zhz小白
公众号:小白的Java进阶之路
专业技能:
1、Java基础,并精通多线程的开发,熟悉JVM原理
2、熟悉Java基础,并精通多线程的开发,熟悉JVM原理,具备⼀定的线上调优经验
3、熟悉MySQL数据库调优,索引原理等,⽇志原理等,并且有出过⼀篇专栏
4、了解计算机⽹络,对TCP协议,滑动窗⼝原理等有⼀定了解
5、熟悉Spring,Spring MVC,Mybatis,阅读过部分Spring源码
6、熟悉SpringCloud Alibaba体系,阅读过Nacos,Sentinel,Seata,Dubbo,Feign,Gateway核⼼源码与设计,⼆次开发能⼒
7、熟悉消息队列(Kafka,RocketMQ)的原理与设计
8、熟悉分库分表ShardingSphere,具有真实⽣产的数据迁移经验
9、熟悉分布式缓存中间件Redis,对其的核⼼数据结构,部署架构,⾼并发问题解决⽅案有⼀定的积累
10、熟悉常⽤设计模式,并运⽤于实践⼯作中
11、了解ElasticSearch,对其核⼼的原理有⼀定的了解
12、了解K8s,Jekins,GitLab
13、了解VUE,GO
14、⽬前有正在利⽤闲暇时间做互游游戏,开发、运维、运营、推销等

本人著作git项目:https://gitee.com/zhouzhz/star-jersey-platform,有兴趣的可以私聊博主一起编写,或者给颗star
领域:对支付(FMS,FUND,PAY),订单(OMS),出行行业等有相关的开发领域
如果此文还不错的话,还请关注、点赞、收藏三连支持一下博主~

文章目录

  • 1、@Resource
    • 1.1、使用
    • 1.2、总结
  • 2、@Inject
    • 2.1、使用
  • 3、@Resource和@Inject注解与@Autowired注解的区别

1、@Resource

  • 默认按照名称进行装配,名称可以通过name属性进行指定,
  • 如果没有指定name属性,
    • 当注解写在字段上默认取字段名进行按照名称查找,
    • 如果注解写在setter方法上默认取属性名进行装配。
  • 当找不到与名称匹配的bean时才按照类型进行装配。
  • 但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配

@Resource的源码如下:
【Spring】——17、@Resource注解和@Inject注解?_第1张图片

1.1、使用

BookDao.java

package com.zhz.dao;

import org.springframework.stereotype.Repository;

/**
 * @author zhouhengzhe
 * @description: todo
 * @date 2022/11/4 10:56
 * @since v1
 */
@Repository
public class BookDao {

    private String label;

    public String getLabel() {
        return label;
    }

    public void setLabel(String label) {
        this.label = label;
    }

    @Override
    public String toString() {
        return "BookDao{" +
                "label='" + label + '\'' +
                '}';
    }
}

BookService.java

package com.zhz.service;

import com.zhz.dao.BookDao;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * @author zhouhengzhe
 * @description: todo
 * @date 2022/11/4 10:56
 * @since v1
 */
@Service
public class BookService {
    @Resource(name="bookDao1")
    private BookDao bookDao;

    @Resource(name="bookDao2")
    private BookDao bookDao2;

    @Override
    public String toString() {
        return "BookService{" +
                "bookDao=" + bookDao +
             	"bookDao2=" + bookDao2 +
                '}';
    }
}

MainConfig.java

package com.zhz.config;

import com.zhz.bean.Person;
import com.zhz.condition.AppleCondition;
import com.zhz.condition.BananaCondition;
import com.zhz.condition.WatermelonCondition;
import com.zhz.dao.BookDao;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;

/**
 * @author zhouhengzhe
 * @description: todo
 * @date 2022/11/4 10:27
 * @since v1
 */

@Configuration
@ComponentScan("com.zhz.service")
public class MainConfig {

    @Bean("bookDao1")
    public BookDao bookDao1() {
        BookDao bookDao = new BookDao();
        bookDao.setLabel("1");
        return bookDao;
    }

    @Primary
    @Bean("bookDao2")
    public BookDao bookDao2() {
        BookDao bookDao = new BookDao();
        bookDao.setLabel("2");
        return bookDao;
    }
}


test方法:

   @Test
    public void test2(){
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        BookService bookService = applicationContext.getBean(BookService.class);
        System.out.println(bookService);
    }

运行结果:
【Spring】——17、@Resource注解和@Inject注解?_第2张图片

1.2、总结

  • @Resource注解和@Autowired注解的功能是一样的,都能实现自动装配,只不过@Resource注解默认是按照组件名称(即属性的名称)进行装配的。虽然@Resource注解具备自动装配这一功能,但是它是不支持@Primary注解优先注入的功能的,而且也不能像@Autowired注解一样能添加required=false属性。

2、@Inject

  • 默认是根据参数名去寻找bean注入,支持spring的@Primary注解优先注入,@Inject注解可以增加@Named注解指定注入的bean。

源码如下所示:
【Spring】——17、@Resource注解和@Inject注解?_第3张图片

2.1、使用

依赖pom.xml:

<dependency>
    <groupId>javax.injectgroupId>
    <artifactId>javax.injectartifactId>
    <version>1version>
dependency>

只需要把上面的测试代码的dao引用改成

package com.zhz.service;

import com.zhz.dao.BookDao;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * @author zhouhengzhe
 * @description: todo
 * @date 2022/11/4 10:56
 * @since v1
 */
@Service
public class BookService {
    @Inject
    private BookDao bookDao;

    @Override
    public String toString() {
        return "BookService{" +
                "bookDao=" + bookDao +
                '}';
    }
}

然后看其运行结果,发现其跟@Autowired注解一样的,都是默认优先装配使用了@Primary注解标注的组件。。
【Spring】——17、@Resource注解和@Inject注解?_第4张图片

3、@Resource和@Inject注解与@Autowired注解的区别

不同点

  • @Autowired是spring专有注解,@Resource是java中JSR250中的规范,@Inject是java中JSR330中的规范
  • @Autowired支持参数required=false,@Resource,@Inject都不支持
  • @Autowired,和@Inject支持@Primary注解优先注入,@Resource不支持
  • @Autowired通过@Qualifier指定注入特定bean,@Resource可以通过参数name指定注入bean,@Inject需要@Named注解指定注入bean

相同点

  • 三种注解都可以实现bean的注入。

你可能感兴趣的:(#,Spring,spring,java,后端)