解决自动装配歧义性

解决自动装配歧义性


我们先创建一个接口;

public interface UserService {
     void add();
}

在创建两个实现类和测试类

实现类

@Component
public class UserServiceNormal implements UserService {
    @Override
    public void add() {
        System.out.println("添加用户。。。。");
    }
}
@Component
public class UserServiceFestival implements UserService {
    @Override
    public void add() {
        System.out.println("用户注册。。。。");
    }
}

测试类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = AppConfig.class)
public class UserServiceTest {
    @Autowired
    private UserService userService;

    @Test
    public void testAdd(){
        userService.add();
    }
}

然后我们运行程序时会报错,原因在userService,因为我在上面创建了两个实现类,这是userService无法断定要选哪个实现类。
所以我们解决这个问题。

方法1

使用首选bean

两个实现类中选一个为首选bean,加==@Primary==注解。

方法2

使用限定符

在两个实现类当中使用 @Qualifier 注解,然后加限定符。

例如:UserServiceNormal类 @Qualifier(“normal”)

@Component
@Qualifier(“normal”)
public class UserServiceNormal implements UserService {
    @Override
    public void add() {
        System.out.println("添加用户。。。。");
    }
}

UserServiceFestival类 @Qualifier(“festival”)

@Component
@Qualifier(“festival”)
public class UserServiceFestival implements UserService {
    @Override
    public void add() {
        System.out.println("用户注册。。。。");
    }
}

然后在测试类中加

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = AppConfig.class)
public class UserServiceTest {
    @Autowired
    @Qualifier(“festival”)
    //@Qualifier(“normal”)
    private UserService userService;

    @Test
    public void testAdd(){
        userService.add();
    }
}

方法3

限定符和类ID结合使用

直接在@Component注解中设置类ID
例如:

@Component(“festival”)
public class UserServiceFestival implements UserService {
    @Override
    public void add() {
        System.out.println("用户注册。。。。");
    }
}

然后在测试类中用@Qualifier指定实现类。

或者不在@Component注解中明确设置类ID,spring会给这个类分配默认的ID,就是类名首写字母小写,其他的不变
例如:

UserServiceFestival类的ID是userServiceFestival
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值