如果bean被定义两次抛出异常?
Throw exception if bean is defined twice?
在我的项目中,我有不同的服务。每个服务都可以定义自己的 Permission
。对于每个权限,将创建一个 bean。这样,Authorization
服务可以注入所有可用的权限,而实际上并不知道它们。
ServiceA
的 Permission
定义如下所示:
@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
将定义以下 Permission
s:
@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
}
}
在我的项目中,我有不同的服务。每个服务都可以定义自己的 Permission
。对于每个权限,将创建一个 bean。这样,Authorization
服务可以注入所有可用的权限,而实际上并不知道它们。
ServiceA
的 Permission
定义如下所示:
@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
将定义以下 Permission
s:
@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
}
}