Spring中@Autowire如何实现自动装配的详细解析?
- 内容介绍
- 文章标签
- 相关推荐
本文共计558个文字,预计阅读时间需要3分钟。
在考虑Spring的@Autowire注解时,主要是按照类型还是名称来注入属性,这是一个常见的问题。今天,我写了一个测试来验证这一点。
首先,我定义了一个接口`TestService`:
javapublic interface TestService { void test();}
然后,我实现了这个接口:
java@Componentpublic class TestServiceImpl implements TestService { @Override public void test() { System.out.println(Test method executed); }}
接下来,我创建了一个配置类,并使用@Autowire注解:
java@Configurationpublic class AppConfig { @Bean @Autowire public TestService testService() { return new TestServiceImpl(); }}
最后,我编写了一个简单的测试类来执行:
javapublic class Main { public static void main(String[] args) { AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(AppConfig.class); TestService service=context.getBean(testService, TestService.class); service.test(); }}
当运行这个测试时,控制台将输出Test method executed,这表明属性是按照名称注入的。
一直在思考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注入内容请搜索易盾网络以前的文章或继续浏览下面的相关文章希望大家以后多多支持易盾网络!
本文共计558个文字,预计阅读时间需要3分钟。
在考虑Spring的@Autowire注解时,主要是按照类型还是名称来注入属性,这是一个常见的问题。今天,我写了一个测试来验证这一点。
首先,我定义了一个接口`TestService`:
javapublic interface TestService { void test();}
然后,我实现了这个接口:
java@Componentpublic class TestServiceImpl implements TestService { @Override public void test() { System.out.println(Test method executed); }}
接下来,我创建了一个配置类,并使用@Autowire注解:
java@Configurationpublic class AppConfig { @Bean @Autowire public TestService testService() { return new TestServiceImpl(); }}
最后,我编写了一个简单的测试类来执行:
javapublic class Main { public static void main(String[] args) { AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(AppConfig.class); TestService service=context.getBean(testService, TestService.class); service.test(); }}
当运行这个测试时,控制台将输出Test method executed,这表明属性是按照名称注入的。
一直在思考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注入内容请搜索易盾网络以前的文章或继续浏览下面的相关文章希望大家以后多多支持易盾网络!

