spring @Primary 注解

@Primary注解

在Spring中常用的@Autowired 默认是根据类型Type来自动注入,例如有如下代码:

1
2
3
4
//api
public interface MyInterface{

}

有两个以下的实现类

1
2
3
4
@Component
public class ClassA implements MyInterface{

}

1
2
3
4
@Component
public class ClassB implements MyInterface{

}

当有Bean注入 MyInterface的时候

1
2
3
4
5
6
@Component
public class Demo(){
@Autowired
private MyInterface myInf;

}

这时候Spring IOC启动的时候就会报错,因为发现有两个Bean实现MyInterface接口,当用@Autowired注解的时候,容器不知道你用哪个。当然我们也可以用@Resource@Qualifier来区分获取哪个bean,但是如果是IOC容器内所使用的bean,又或者其他已经封装好的jar包,例如springboot里面的DataSource,只能有一个的时候,这时候这个方法就不能用了。

为了解决这个问题,@Primary的作用就来了,@Primary可以标记哪个bean是默认使用的,也就是说是@Autowired自动导入的bean,以上的两个bean修改如下:

1
2
3
4
@Component
public class ClassA implements MyInterface{

}
1
2
3
4
5
@Primary
@Component
public class ClassB implements MyInterface{

}

当有Bean注入 MyInterface的时候就会默认获取ClassB的类型的Bean了
`
@Component
public class Demo(){
@Autowired
private MyInterface myInf;

}