概述
这几个都是实现注入Bean,使用 @Autowired 注解是 Spring 依赖注入的绝好方法,但是当实现类很多就不知道注入哪个了。
- @Autowired 按类型装配 Spring Bean
- @Resource 按名称即为@Autowired+@Qualifier
多个实现类
如果直接使用@Autowired
,则抛出NoUniqueBeanDefinitionException
,搭配@Qualifier
完成使用。
public interface MultiService {
/**
* 多实现类型
*
* @param name 名称
*/
void sayHello(String name);
}
实现类1
@Service("one")
public class MultiServiceOneImpl implements MultiService {
/**
* 多实现类型
*
* @param name 名称
*/
@Override
public void sayHello(String name) {
System.out.println("name=" + name + ",i am one,hello!");
}
}
实现类2
@Service("two")
public class MultiServiceTwoImpl implements MultiService {
/**
* 多实现类型
*
* @param name 名称
*/
@Override
public void sayHello(String name) {
System.out.println("name=" + name + ",i am two,hello!");
}
}
如果直接使用@Autowired
@RunWith(SpringRunner.class)
@SpringBootTest(classes = BootApp.class)
public class TestServiceApp {
@Autowired
//@Qualifier("one")
//@Resource(name = "one")
MultiService multiService;
@Test
public void test() {
multiService.sayHello("小明");
}
}
@Qualifier 和 @Primary
还有另一个名为 @Primary 的注解,我们也可以用来发生依赖注入的歧义时决定要注入哪个 bean。当存在多个相同类型的 bean 时,此注解定义了首选项。除非另有说明,否则将使用与 @Primary 注释关联的 bean 。
@Service
@Primary
public class MultiServiceOneImpl implements MultiService {}
使用
@Autowired
//@Qualifier("one")
//@Resource(name = "one")
MultiService multiService;
@Resource
@Resource有两个重要属性,分别是name和type
此外查看源码,可以从CommonAnnotationBeanPostProcessor
开始,Spring容器在每个Bean实例化之后,调用后置处理器CommonAnnotationBeanPostProcessor
的postProcessMergedBeanDefinition
方法,查找该Bean是否有@Resource
注解。