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注入内容请搜索179885.Com以前的文章或继续浏览下面的相关文章希望大家以后多多支持179885.Com!

猜你在找的Spring中@Autowire注入的深入讲解相关文章

今天学习了一个新技能SpringBoot实现异步任务,所以特地整理了本篇文章,文中有非常详细的介绍及代码示例,需求的大佬可以参考下
了rabbitmq中routingkey的作用说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
今天给大家整理的文章是SpringBoot定时任务的相关知识点,文中有非常详细的介绍及代码示例,对正在学习SpringBoot任务的小伙伴们很有帮助,需求的大佬可以参考下
今天给大家整理的文章是SpringBoot邮件任务的相关知识点,文中有非常详细的介绍及代码示例,对正在学习SpringBoot任务的小伙伴们很有帮助,需求的大佬可以参考下
本文给大家分享小编一些心得体会,主要是学习SSM框架之后的收获吧,重点给大家介绍SSM框架流程以及原理分析,通过图文实例相结合给大家介绍的非常详细,需要的朋友参考下
今天带大家学习Java设计模式的相关知识点,文中对Java行为型模式做了非常详细的介绍及代码示例,对正在学习java的小伙伴们很有帮助,需求的大佬可以参考下
今天带大家学习Java并发编程的相关知识,文中对Fork/Join框架作了非常详细的介绍,对正在学习有关知识的小伙伴们很有帮助,需求的大佬可以参考下
今天给大家带来的文章是Java并发编程的相关知识,文中对java同步容器与并发容器做了非常详细的介绍及代码示例,需求的大佬可以参考下
在实际开发中需要将操作系统编码、文件编码、页面编码以及tomcat服务器编码保持一致,而tomcat在默认情况下是使用UTF-8,这就使得其打印的日志文件出现中文乱码,因此
我们知道分库分表是针对某些数据量持续大幅增长的表,比如用户表、订单表等,而不是一刀切将全部表都做分片,了springboot整合shardingjdbc实现分库分表最简单demo,需
了解决SpringSecurity 一直登录失败的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
了request如何获取body的json数据操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教