Spring中@Autowire注入的深入讲解

 更新时间:2020年09月20日 15:12:55   作者:Real dream  
这篇文章主要给大家介绍了关于Spring中@Autowire注入的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一直在思考spring的@Autowire注入属性时到底是按类型注入还是按名称注入,今天写了一个测试来证明一下。

定义接口TestService

public interface TestService {
 void test();
}

定义接口实现:TestServiceImpl1和TestServiceImpl2

@Service
public class TestServiceImpl1 implements TestService {

 public void test() {
  System.out.println(1111);
 }
}
@Service
public class TestServiceImpl2 implements TestService {

 public void test() {
  System.out.println(2222);
 }
}

定义一个bean依赖TestService,

@Controller
public class TestController {
	//此时的beanBame=testService
 @Autowired
 TestService testService;

 public void test(){
  testService.test();
 }
}

编写测试类:

@Configuration
@ComponentScan("test")
public class Test {
 public static void main(String[] args) {
  AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext();
  context.register(Test.class);
  context.refresh();
  TestService bean = context.getBean(TestService.class);
  bean.test();
 }
}

启动项目跟踪源码:在spring工厂初始化Bean填充属性的时候,AbstractAutowireCapableBeanFactory.populateBean()方法中会执行后置处理器AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues() ,继续跟踪,在DefaultListableBeanFactory.doResolveDependency()方法中的findAutowireCandidates()根据类型匹配到两个Bean,见截图:

由于获取的Bean超过两个,spring会根据名称去匹配,如果匹配成功则返回对应的bean;如果匹配失败,则会抛出异常。如图:

到此为止,我们已经能发现@Autowire注解注入属性的原理:先根据类型注入,如果获取到多个Bean,则根据名称匹配,若名称未匹配上就抛出异常。

总结

到此这篇关于Spring中@Autowire注入的文章就介绍到这了,更多相关Spring中@Autowire注入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java数据类型转换实例解析

    Java数据类型转换实例解析

    这篇文章主要介绍了Java数据类型转换实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • 解决JSTL foEach标签 刷新报错的方法

    解决JSTL foEach标签 刷新报错的方法

    本篇文章是对JSTL foEach标签刷新报错的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • Mybatis使用连表查询的操作代码

    Mybatis使用连表查询的操作代码

    这篇文章主要介绍了Mybatis如何使用连表查询,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • java生成excel报表文件示例

    java生成excel报表文件示例

    本篇文章主要介绍了java生成excel报表文件示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • SpringSecurity登录使用JSON格式数据的方法

    SpringSecurity登录使用JSON格式数据的方法

    这篇文章主要介绍了SpringSecurity登录使用JSON格式数据的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-02-02
  • java线程封闭之栈封闭和ThreadLocal

    java线程封闭之栈封闭和ThreadLocal

    这篇文章主要介绍了java线程封闭之栈封闭和ThreadLocal,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • IntelliJ IDEA失焦自动重启服务的解决方法

    IntelliJ IDEA失焦自动重启服务的解决方法

    在使用 IntelliJ IDEA运行 SpringBoot 项目时,你可能会遇到一个令人困扰的问题,一旦你的鼠标指针离开当前IDE窗口,点击其他位置时, IDE 窗口会失去焦点,你的 SpringBoot 服务就会自动重启,所以本文给大家介绍了IntelliJ IDEA失焦自动重启服务的解决方法
    2023-10-10
  • java list集合排序按某一属性排序操作

    java list集合排序按某一属性排序操作

    这篇文章主要介绍了java list集合排序按某一属性排序操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Java 对象深拷贝工具类的实现

    Java 对象深拷贝工具类的实现

    本文主要介绍了Java 对象深拷贝工具类的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • 如何解决Nacos服务下线报错问题

    如何解决Nacos服务下线报错问题

    这篇文章主要介绍了如何解决Nacos服务下线报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07

最新评论