Spring学习笔记_17——@Primary
@Primary
1. 介绍
@Primary
注解是Spring框架提供的一个注解,用于在存在多个相同类型的bean时指定首选或主要的bean。当Spring容器需要自动注入某个类型且有多个候选者时,它会优先选择带有@Primary
注解的bean。
2. 场景
如果依赖的对象存在多个类型相同的Bean时,使用@Autowired注解已经无法正确完成Bean的装配工作。此时,可以使用@Qualifier注解明确指定要装配的Bean对象。也可以使用@Primary注解优先装配对应的Bean对象。
3. 源码
/*
* @author Chris Beams
* @author Juergen Hoeller
* @since 3.0
* @see Lazy
* @see Bean
* @see ComponentScan
* @see org.springframework.stereotype.Component
*/
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Primary {
}
4. Demo
- 创建DAO层接口
public interface DemoDAO {
}
- 创建接口的第一个实现类
public class DemoDAOImpl1 implements DemoDAO {
}
- 创建接口的第二个实现类
public class DemoDAOImpl2 implements DemoDAO {
}
- 在配置类中指定DemoDAO实现的优先级
@Configuration
public class DemoConfig {
@Bean
@Primary
public DemoDAO primaryDemo1() {
return new DemoDAOImpl1();
}
@Bean
public DemoDAO primaryDemo2() {
return new DemoDAOImpl2();
}
}
- 在Service层使用下
@Service
public class DemoService {
@Autowired
private DemoDAO demoDAO;
@Autowired
@Qualifier("primaryDemo2")
private DemoDAO demoDAO2;
@Override
public String toString() {
return "DemoService{" +
"demoDao=" + demoDao + "demoDao2=" + demoDao +
'}';
}
}