Spring中@Autowire注入的深入讲解

网友投稿 248 2022-11-21


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,则根据名称匹配,若名称未匹配上就抛出异常。

总结


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:golang实现java uuid的序列化方法
下一篇:Java二维数组与动态数组ArrayList类详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~