具有相同类名(不同包)的两个Spring Service Bean即使使用限定符也会抛出Error

时间:2018-05-01 18:39:25

标签: java spring spring-boot

我有以下......

package package1;

@Service
@Qualifier("kb")
public class UserService {
...
}

package package2;

@Service
@Qualifier("user")
public class UserService {
...
}

@Autowired
@Qualifier("user")
package2.UserService p2;
@Autowired
@Qualifier("kb")
package1.UserService p1;

但是当我尝试运行时,我得到......

  

org.springframework.beans.factory.BeanDefinitionStoreException:无法解析配置类[boot.Application];嵌套异常是org.springframework.context.annotation.ConflictingBeanDefinitionException:注释指定的bean名称' userService' for bean class [package1.UserService]与同名和类的现有的,不兼容的bean定义冲突[package2.UserService]

我如何拥有2个同名服务?

2 个答案:

答案 0 :(得分:3)

从班级中删除@Qualifier,仅在自动装配时使用@Qualifier

@Service("kb")
public class UserService {
...
}

package package2;

@Service("user")
public class UserService {
...
}

来自@Qualifier javadoc

**
 * This annotation may be used on a field or parameter as a qualifier for
 * candidate beans when autowiring. It may also be used to annotate other
 * custom annotations that can then in turn be used as qualifiers.
 */

答案 1 :(得分:3)

你需要在这里了解@Qualifier的目的。

  

当您创建多个bean时,可能会出现这种情况   相同的类型,并希望只使用属性连接其中一个。在这样的   例如,您可以将@Qualifier注释与@Autowired一起使用   通过指定将连接哪个确切的bean来消除混淆。

您正在尝试创建两个具有相同名称但在不同包中的类。为此,您需要将服务的名称指定为@Service注释的值参数,以区分这两者:

package package1;

@Service("kb")
public class UserService {
...
}

package package2;

@Service("user")
public class UserService {
...
}

@Autowired
@Qualifier("user")
package2.UserService p2;
@Autowired
@Qualifier("kb")
package1.UserService p1;