Spring注解驱动开发学习总结8:自动装配注解@Autowire、@Resource、@Inject

  • 1、自动装配@Autowire、@Resource、@Inject
    • 1.1 构建bookDao
    • 1.2 构建bookService
    • 1.3 构建配置文件
    • 1.4 同类型组件测试一
    • 1.5 同类型组件测试二(使用@Qualifier指定id名称)
    • 1.6 同类型组件测试三(使用@Primary)
    • 1.7 同类型组件测试四(使用@Resource)
    • 1.8 同类型组件测试五(使用@Inject)

1、自动装配@Autowire、@Resource、@Inject

1、可以使用@Autowire注解自动注入组件
  1.1 自动装配@Autowire注解,默认一定存在该bean,如果不存在就会报错。可以使用将参数required设置为false,表示该bean可以不存在:@Autowired(required = false)
  1.2 默认优先按照类型去容器中找对应的组件。如果找到了多个相同类型的组件,再将属性的名称作为组件的id去容器中查找。
    1.2.1 如果有多个同类型组件,可以使用@Qualifier(“id名称”)注解自动导入指定id名
    称的bean。
    1.2.2 如果有多个同类型组件,可以在bean上使用@Primary注解。让Spring进行自
    动装配的时候,默认使用该bean。
  1.3 @Autowire可以放在构造器、参数、方法、属性上。都是自动从容器中取参数组件的值。
    1.3.1 标注在方法上:@Bean+方法参数,参数从容器中获取。默认可以不写     @Autowire,效果是一样的,该参数也会自动从容器中获取。
    1.3.2 标注在构造器上:如果组件只有一个有参构造器,那么这个有参构造器的
    @Autowire可以省略,参数位置的组件也会自动从容器中获取。
    1.3.3 标注在参数上:上面已经演示过了。

以下还是以之前构建的bookService,bookDao进行举例。我们会在容器中添加两个同类型的bookDao,然后在bookService中自动导入,从而来测试下使用@Autowire注解自动导入的情况。

2、也可以使用Java规范的注解@Resource和@Inject自动注入组件
  2.1 @Resource注解:可以和@Autowire一样实现自动装配功能,默认是按照组件名称进行装配。不支持@Primary功能,也没有@Autowired(required = false)的功能
  2.2 @Inject注解:和@Autowire功能一样,同样也没有@Autowired(required = false)的功能。同时需要导入javax.inject的依赖包

1.1 构建bookDao

构建bookDao:com/example/dao/BookDao.java。
在BookDao上添加@Repository注解,可以将BookDao注入容器。

package com.example.dao;import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Repository;@Repository
public class BookDao {String label="1";public String getLabel() {return label;}public void setLabel(String label) {this.label = label;}@Overridepublic String toString() {return "BookDao{" +"label='" + label + '\'' +'}';}
}

1.2 构建bookService

构建bookService:com/example/service/BookService.java
在booService中自动注入BookDao类型的组件。

package com.example.service;import com.example.dao.BookDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;@Service
public class BookService {@Autowired(required = false)BookDao bookDao;public void print() {System.out.println("BookService_print: " + bookDao);}
}

1.3 构建配置文件

构建配置文件:com/example/config/MainConfigAutowire.java
在配置文件中再注入一个类型为BookDao,id为bookDao2的bean。

package com.example.config;import com.example.dao.BookDao;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;@Configuration
@ComponentScan(value = {"com.example.service", "com.example.dao"})
public class MainConfigAutowire {@Bean("bookDao2")public BookDao bookDao() {BookDao bookDao = new BookDao();bookDao.setLabel("2");return bookDao;}
}

1.4 同类型组件测试一

由1.1-1.3可以看到,目前容器中有2个BookDao组件:bookDao和bookDao2。

构建测试方法:testAutowire。测试下BookService中自动导入的组件是哪一个bean。

 @Testpublic void testAutowire() {AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigAutowire.class);System.out.println("\nioc容器已创建完成\n");BookService bean = applicationContext.getBean(BookService.class);bean.print();}

以下是运行结果。
可以看到,@Autowired注解默认优先按照类型去容器中找对应的组件。如果找到了多个相同类型的组件,再将属性的名称作为组件的id去容器中查找。因此,这里找到的是bookDao组件,该组件的label=1.

1.5 同类型组件测试二(使用@Qualifier指定id名称)

此时修改bookService,在bookService上使用@Qualifier注解,指定使用id为bookDao2的BookDao组件。

package com.example.service;import com.example.dao.BookDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;@Service
public class BookService {@Qualifier("bookDao2")@Autowired(required = false)BookDao bookDao;public void print() {System.out.println("BookService_print: " + bookDao);}
}

再次运行测试方法:testAutowire。可以看到这一次bookService确实自动导入的是bookDao2的组件。

1.6 同类型组件测试三(使用@Primary)

此时将上一步的@Qualifier注解去掉,将配置文件(MainConfigAutowire.java)中id为bookDao2的bean添加@Primary注解,表示默认首选使用这个bean。

package com.example.config;import com.example.dao.BookDao;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;@Configuration
@ComponentScan(value = {"com.example.service", "com.example.dao"})
public class MainConfigAutowire {@Primary@Bean("bookDao2")public BookDao bookDao() {BookDao bookDao = new BookDao();bookDao.setLabel("2");return bookDao;}
}

再次运行测试方法:testAutowire。可以看到这一次bookService再次自动导入的依然是bookDao2的组件。

1.7 同类型组件测试四(使用@Resource)

在bookService中不再使用@Autowired自动导入,同样可以改为使用Java规范的@Resource注解注入。

虽然@Resource不支持@Primary功能,但是它同样可以指定bena的id名称:bookDao2。

package com.example.service;import com.example.dao.BookDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import javax.inject.Inject;@Service
public class BookService {//    @Qualifier("bookDao2")
//    @Autowired(required = false)
//    @Inject@Resource(name = "bookDao2")BookDao bookDao;public void print() {System.out.println("BookService_print: " + bookDao);}
}

再次运行测试方法:testAutowire。可以看到这一次bookService再次自动导入的依然是bookDao2的组件。

1.8 同类型组件测试五(使用@Inject)

不使用@Autowired和@Resource注解,还可以使用@Inject注解,它的功能与@Autowired一致。

首先需要在pom文件中导入javax.inject依赖包:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>spring-annotation</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.3.12.RELEASE</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency><groupId>javax.inject</groupId><artifactId>javax.inject</artifactId><version>1</version></dependency></dependencies>
</project>

然后修改bookService:

package com.example.service;import com.example.dao.BookDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import javax.inject.Inject;@Service
public class BookService {//    @Qualifier("bookDao2")
//    @Autowired(required = false)@Inject
//    @Resource(name = "bookDao2")BookDao bookDao;public void print() {System.out.println("BookService_print: " + bookDao);}
}

再次运行测试方法:testAutowire。由于我们在bookDao2的组件上添加了@Primary注解,可以看到这一次bookService再次自动导入的依然是bookDao2的组件。

Spring注解驱动开发学习总结8:自动装配注解@Autowire、@Resource、@Inject相关推荐

  1. spring系列-注解驱动原理及源码-自动装配

    目录 一.spring规范的bean自动注入 1.使用@Autowired自动注入 2.使用@Qualifier指定需要装配的组件 3.使用@Autowired装配null对象 4.使用@Primar ...

  2. Spring注解驱动开发第10讲——在@Import注解中使用ImportBeanDefinitionRegistrar向容器中注册bean

    写在前面 在前面的文章中,我们学习了如何使用@Import注解向Spring容器中导入bean,不仅可以使用@Import注解快速向容器中导入bean,也可以在@Import注解中使用ImportSe ...

  3. Java(Spring)学习笔记--->自动装配(autowire)

    这篇文章笔者和大家聊一聊自动装配,首先我们学习它的时候我们应该知道何为自动装配? 举个例子:一个人他有一只狗和一只猫,他有的 这两个动物就相当于这个人的名字一样,写在一个personn类中并且生成无参 ...

  4. Spring注解驱动开发第26讲——总有人让我给他讲讲@EnableAspectJAutoProxy注解

    @EnableAspectJAutoProxy注解 在配置类上添加@EnableAspectJAutoProxy注解,便能够开启注解版的AOP功能.也就是说,如果要使注解版的AOP功能起作用的话,那么 ...

  5. 【视频分享】尚硅谷Java视频教程_Spring注解驱动开发视频教程

    <Spring注解驱动开发>是一套帮助我们深入了解Spring原理机制的教程: 现今SpringBoot.SpringCloud技术非常火热,作为Spring之上的框架,他们大量使用到了S ...

  6. spring注解驱动开发-4 Spring 自动装配

    Spring 自动装配 前言 Spring 自动装配的几种方式 1.@Autowired @Qualifier("组件id") @Primary 2.@Resource方式 3.@ ...

  7. 【Spring注解驱动开发】使用@Autowired@Qualifier@Primary三大注解自动装配组件,你会了吗?

    写在前面 [Spring专题]停更一个多月,期间在更新其他专题的内容,不少小伙伴纷纷留言说:冰河,你[Spring专题]是不是停更了啊!其实并没有停更,只是中途有很多小伙伴留言说急需学习一些知识技能, ...

  8. spring注解驱动开发-8 Spring 扩展原理

    Spring 扩展原理 前言 BeanFactoryPostProcessor 测试实例编写 ExtConfig MyBeanFactoryPostProcessor ExtTest 源码分析 Bea ...

  9. spring注解驱动开发-6 Spring AOP实现原理

    Spring AOP实现原理 前言 1.@EnableAspectJAutoProxy注解原理 2.AnnotationAwareAspectJAutoProxyCreator 分析 1.分析前工作, ...

最新文章

  1. 异步获取邮件推送结果
  2. 复杂系统如何在不停机升级同时保持稳定?你必须考虑以下几个点...
  3. 手机Excel怎么转换成PDF方法
  4. Java调用python脚本
  5. 两个input在一行让它们能对齐
  6. 曲线均匀分布_R——概率统计与模拟(三) 变换均匀分布对特定分布进行抽样
  7. 【android】3.0以后系统给广播默认加上FLAG_EXCLUDE_STOPPED_PACKAGES标记
  8. C语言经典面试题目(转的,不过写的的确好!)
  9. 中国第一个发《Nature》的竟然是清朝人!被皇帝夸天下第一,他却觉得羞耻..........
  10. Mybatis学习笔记18 - 缓存
  11. 清华提出:用于细粒度实体分类的Prompt-Learning,并提出可训练Prompt模板
  12. Linux定时任务-定时锁屏
  13. springboot社区再生资源上门回收平台毕业设计-附源码072049
  14. 《Efficient Android Threading》Chapter 3---Threads on Android (Android中的线程)
  15. Ubuntu更新显卡驱动与升级cuda版本“采坑“小记
  16. php搬家问题,PHPWIND 搬家教程 一看就会
  17. azkaban短信报警功能和项目依赖功能实现
  18. new date的含义
  19. 第一章 C语言编程(Ivor Horton)
  20. u盘忘在计算机房,基于MFC的防U盘等移动存储器的遗忘提醒系统

热门文章

  1. JNLP文件及JWS
  2. java集合系列——java集合概述(一)
  3. JavaWeb学习-案例练习-图书管理前台-9-分页功能实现
  4. win10耳机有杂音滋滋_蓝牙耳机的底噪和电流声有区别吗?双11五款高续航平价蓝牙耳机分享...
  5. 如何将DotNetFX35SP1打进安装包
  6. 2018中国十大品牌在线英语培训机构排行榜暴风来袭
  7. Hexo+NexT 如何取消下划线
  8. 三极管工作原理--我见过最通俗讲法
  9. vscode保存自动格式化加逗号解决方法
  10. MTK 轨迹球(JOG_BALL)