springboot中⼀个service接⼝多个实现类,如何注⼊
⼀般来说我们的service接⼝都是只有⼀个实现类⽽已,但有些时候,确实会有两个实现类的情况,那这个时候我们怎么⾃动注⼊这个接⼝呢?
1、⾸先,有⼀个接⼝PersonService,然后再写两个实现类PersonServiceImp1、PersonServiceImp2
2、进⾏测试
如果我们直接注⼊接⼝的话,idea就会给我们报错
3、解决办法
其实⾃动注⼊时,它⾸先会先根据class类型来到相应的实现类,如果这⾥有两个相同类型的实现类时,那我们可以通过实现类的id 来,⽐如说PersonServiceImp1可以通过personServiceImp1这个id来
除此之外还可以通过注解@Qualifier
我们也可以通过@Resource来代替@Autowired,通过我们指定我们指定的名字进⾏注⼊
⾸先要先在实现类上指定名字
resource和autowired注解的区别然后我们在注⼊的时候⽤@Resource来代替@Autowired
1. ⾸先, Interface1 接⼝有两个实现类 Interface1Impl1 和 Interface1Impl2
Interface1 接⼝:
ample.service;
/**
* Created by liuzh on 2018-05-29.
* 接⼝1
*/
public interface Interface1 {
void fun1();
}
以下是接⼝的两个实现类,请注意@service注解的使⽤⽅式,这⾥给每个实现类标注了不同的名称,⽅便在@Resource注⼊时区别注⼊Interface1 接⼝实现类1:
@Service("s1")
public class Interface1Impl1 implements Interface1 {
@Override
public void fun1() {
System.out.println("接⼝1实现类 ...");
}
public void fun2(){
System.out.println("接⼝1实现类1 fun2 ...");
}
}
Interface1 接⼝实现类2:
@Service("s2")
public class Interface1Impl2 implements Interface1 {
@Override
public void fun1() {
System.out.println("接⼝1实现类 ...");
}
public void fun2(){
System.out.println("接⼝1实现类2 fun2 ...");
}
}
2. 通过 @Autowired 和 @Qualifier 配合注⼊
@Autowired
@Qualifier("interface1Impl1")
Interface1 interface1; //正常启动
3. 使⽤@Resource注⼊,根据默认类名区分
@Resource(name = "interface1Impl1")
Interface1 interface1; //正常启动
4. 使⽤@Resource注⼊,根据@Service指定的名称区分
@Resource(name = "s1")
Interface1 interface1; //正常启动
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论