Spring源码从入门到精通---@Resource&@Inject(十二)

简介: Spring源码从入门到精通---@Resource&@Inject(十二)

上篇文章介绍了自动装配的@Autowired注解

1)、AnnotationConfigApplicationContext.getBean(Bookdao.class)默认是按类型去IOC容器中找组件,若同一个对象找到两个以上组件,则会调用AnnotationConfigApplicationContext.getBean(""),按组件名称查到。

2)、他可以 和@Qualifier()一起用,指定组件名称。

3)、也可以设置@Autowired(required=false),默认是true,表示若ioc容器没有当前组件则报错,若设置为false,则会返回组件null,不会报错。

4)、也可以和@Primary注解指定主加载组件一起用。

感兴趣的同学可以点 下面链接🔗看看,上篇文章链接:

Spring源码从入门到精通---@Autowired&@Qualtify(十一)


这篇文章主要介绍@Resource和@Inject自动装配注解

@Autowired主要是spring的注解,@Resource和@Qualitifier是java的规范,JRE标准。

@Resource不可以和@Primary,也不支持@Autowired(required=false)一起用,可以直接加name参数定制加载的组件名称。

@Inject需要导入javax.inject包,和@Autowired一样,但也不支持@Autowired(required=false)

他们都是通过我们之前文章学的AutowiredAnnotationBeanPostProcessor类加载。


一、@Resource


bookDao继续用@Repository注解,默认注入bookDao组件,config也用@Bean加一个bookDao2组件2,修改bookService,注释掉之前的@Autowired注解,加上@Resource(name="bookDao2")注解,junitTest不变,和上篇一样,为了方便阅读 再贴一份代码:

@Service
public class BookService {
    //@Autowired(required = false)
    //@Qualifier("bookDao2")
    @Resource(name = "bookDao2")
    //@Inject
    private BookDao bookDao;
    public void print() {
        System.out.println("BookService注入的bookDao:" + bookDao);
    }
    @Override
    public String toString() {
        return "BookService{" +
            "bookDao=" + bookDao +
            '}';
    }
}
@Configuration
@ComponentScan(value = {"com.alibaba.controller", "com.alibaba.service", "com.alibaba.dao"})
public class ConfigOfAutowired {
    @Primary
    @Bean("bookDao2")
    public BookDao bookDao() {
        BookDao bookD = new BookDao();
        bookD.setLable("2");
        return bookD;
    }
}
@Repository
public class BookDao {
    private String lable = "1";
    public String getLable() {
        return lable;
    }
    public void setLable(String lable) {
        this.lable = lable;
    }
    @Override
    public String toString() {
        return "BookDao{" +
            "lable='" + lable + '\'' +
            '}';
    }
}
public class IOCTestAutowired {
    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(
        ConfigOfAutowired.class);
    @Test
    public void test1() {
        //getBeanNames(applicationContext);
        BookService bookService = applicationContext.getBean(BookService.class);
        //BookDao bookDao = applicationContext.getBean(BookDao.class);
        System.out.println("bookService:" + bookService);
        //System.out.println("bookDao:" + bookDao);
        applicationContext.close();
    }
    private void getBeanNames(AnnotationConfigApplicationContext applicationContext) {
        String[] names = applicationContext.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
    }
}


打印结果可以看到,若指定name组件,则加载bookDao2,若没有指定,则加载bookDao:

image.png


二、@Inject


这个注解用的很少,需要导入mvn包,之后就把@Resource注释,加上这个,也可以自动装配组件,代码如下。

<!-- https://mvnrepository.com/artifact/javax.inject/javax.inject -->
    <dependency>
        <groupId>javax.inject</groupId>
        <artifactId>javax.inject</artifactId>
        <version>1</version>
    </dependency>
@Service
public class BookService {
    //@Autowired(required = false)
    //@Qualifier("bookDao2")
    //@Resource(name = "bookDao2")
    @Inject
    private BookDao bookDao;
    public void print() {
        System.out.println("BookService注入的bookDao:" + bookDao);
    }
    @Override
    public String toString() {
        return "BookService{" +
            "bookDao=" + bookDao +
            '}';
    }
}
相关文章
|
10天前
|
小程序 JavaScript Java
高校宿舍信息|基于Spring Boot的高校宿舍信息管理系统的设计与实现(源码+数据库+文档)
高校宿舍信息|基于Spring Boot的高校宿舍信息管理系统的设计与实现(源码+数据库+文档)
18 0
|
17天前
|
XML Java 数据格式
Spring框架入门:IoC与DI
【5月更文挑战第15天】本文介绍了Spring框架的核心特性——IoC(控制反转)和DI(依赖注入)。IoC通过将对象的创建和依赖关系管理交给容器,实现解耦。DI作为IoC的实现方式,允许外部注入依赖对象。文章讨论了过度依赖容器、配置复杂度等常见问题,并提出通过合理划分配置、使用注解简化管理等解决策略。同时,提醒开发者注意过度依赖注入和循环依赖,建议适度使用构造器注入和避免循环引用。通过代码示例展示了注解实现DI和配置类的使用。掌握IoC和DI能提升应用的灵活性和可维护性,实践中的反思和优化至关重要。
34 4
|
17天前
|
监控 Java 应用服务中间件
Spring Boot 源码面试知识点
【5月更文挑战第12天】Spring Boot 是一个强大且广泛使用的框架,旨在简化 Spring 应用程序的开发过程。深入了解 Spring Boot 的源码,有助于开发者更好地使用和定制这个框架。以下是一些关键的知识点:
32 6
|
17天前
|
Java 应用服务中间件 测试技术
深入探索Spring Boot Web应用源码及实战应用
【5月更文挑战第11天】本文将详细解析Spring Boot Web应用的源码架构,并通过一个实际案例,展示如何构建一个基于Spring Boot的Web应用。本文旨在帮助读者更好地理解Spring Boot的内部工作机制,以及如何利用这些机制优化自己的Web应用开发。
42 3
|
10天前
|
小程序 JavaScript Java
小程序商城|基于Spring Boot的智能小程序商城的设计与实现(源码+数据库+文档)
小程序商城|基于Spring Boot的智能小程序商城的设计与实现(源码+数据库+文档)
19 0
小程序商城|基于Spring Boot的智能小程序商城的设计与实现(源码+数据库+文档)
|
10天前
|
安全 JavaScript Java
在线问卷调查|基于Spring Boot的在线问卷调查系统的设计与实现(源码+数据库+文档)
在线问卷调查|基于Spring Boot的在线问卷调查系统的设计与实现(源码+数据库+文档)
22 0
|
Java Spring
通过Spring Resource接口获取资源(6)
通过Spring Resource接口获取资源
1043 0
|
Java Spring 数据格式
Spring Resource接口获取资源
1.1.1. Resource简介  在Spring内部实现机制,针对于资源文件(配置的xml文件)有一个统一的接口Resource。   1.1.1.1. 接口定义的方法 1.exists():判断资源文件是否存在。
1540 0
|
Java Spring 数据格式
通过Spring Resource接口获取资源
通过Spring Resource接口获取资源 目录 1       Resource简介 2       通过ResourceLoader获取资源 3       在bean中获取Resource的方式   1       Resource简介        在Spring内部,针对于资源文件有一个统一的接口Resource表示。
877 0
|
17天前
|
Java 应用服务中间件 Maven
SpringBoot 项目瘦身指南
SpringBoot 项目瘦身指南
69 0