如果bean被定义两次,则抛出异常?

时间:2017-09-28 11:20:05

标签: java spring spring-bean

在我的项目中,我有不同的服务。每个服务都可以定义自己的Permission。对于每个权限,将创建一个bean。这样,Authorization服务可以注入所有可用权限,而无需实际了解它们。

Permission的{​​{1}}定义如下所示:

ServiceA

@Configuration() public class ServiceAPermissions extends Permissions { private static final String BASE = "servicea"; public static final String SERVICEA_READ = join(BASE, READ); public static final String SERVICEA_WRITE = join(BASE, WRITE); @Bean() Permission getReadPermission() { return new Permission(SERVICEA_READ); } @Bean() Permission getWritePermission() { return new Permission(SERVICEA_WRITE); } } 将定义以下ServiceB s:

Permission

显然,这将以定义的bean的名称冲突结束,因为我已经定义了一个名为@Configuration() public class ServiceBPermissions extends Permissions { private static final String BASE = "serviceb"; public static final String SERVICEB_READ = join(BASE, READ); @Bean() Permission getReadPermission() { return new Permission(SERVICEB_READ); } } 的bean两次。如果我当然可以命名像getReadPermission这样的方法,那么它们将被区分,但这只是一个约定,可能会被忽略。

在这种情况下,Spring没有通知我有关重复定义的信息,它只是实例化一个并忽略另一个定义。如果bean定义了两次,有没有办法告诉Spring抛出getServiceAReadPermission?通过这种方式,人们将始终意识到重复的定义。

或者,有没有办法告诉spring,它应该使用随机bean名称而不是方法签名?我知道我可以手动给每个bean一个名字Exception,但我想避免这样做,因为开发人员不会被迫这样做,但仍然会忘记它。

1 个答案:

答案 0 :(得分:0)

这种设计似乎不合逻辑。一个bean应该只有一次可用,你以不同的方式使用它。

我建议提供一个PermissionFactory-Bean,按照

的顺序提供你需要的东西。
@Component
public class PermissionFactory {
    public Permission createFactory() {
        // create A or B permission randomly, as you wanted
    }
}