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

Throw exception if bean is defined twice?

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

ServiceAPermission 定义如下所示:

@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 将定义以下 Permissions:

@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 定义了一个 bean 两次。如果我当然可以将这些方法命名为 getServiceAReadPermission 这样它们将被区分,但这只是一个约定,可能会被忽略。

在这种情况下,Spring 不会通知我有关重复定义的信息,它只会实例化一个定义而忽略另一个定义。如果一个 bean 被定义了两次,有没有办法告诉 Spring 抛出一个 Exception?这样一来,人们就会始终意识到重复的定义。

或者,有没有办法告诉 spring 它应该使用随机 bean 名称而不是方法签名?我知道我可以手动为每个 bean 命名 @Bean(name = "A name"),但我想避免这种情况,因为开发人员不会被迫这样做并且仍然可能忘记它。

这样的设计好像不太符合逻辑。一个 bean 应该只可用一次,您正在以不同的方式使用它。

我建议提供一个 PermissionFactory-Bean,它可以满足您的需求,符合

@Component
public class PermissionFactory {
    public Permission createFactory() {
        // create A or B permission randomly, as you wanted
    }
}