spring为不同的用户提供不同的bean

bvjveswy  于 2021-07-23  发布在  Java
关注(0)|答案(2)|浏览(296)

假设我有几个依赖于一个服务的组件:

public interface MyService { ... }

// in package1
@Component
public class Package1Component1 {
  @Autowired
  private final MyService myService;
}

public class Package1Component2 {
  @Autowired
  private final MyService myService;
}

// in package 2
public class Package2Component1 {
  @Autowired
  private final MyService myService;
}

public class Package2Component2 {
  @Autowired
  private final MyService myService;
}

我有两个 MyService :

@Service
public class MyServiceImpl1 implements MyService { ... }

@Service
public class MyServiceImpl2 implements MyService { ... }

我想要 MyServiceImpl2 注入 Package 中的所有组件2和 MyServiceImpl1 其他地方
我不想用 @Qualifier 为了解决歧义,当需要注入时总是需要指定它 MyService 当我需要在任何地方切换到单个实现时,我需要更改很多文件( MyServiceImpl2 是临时实现,只应在特定范围内使用)。
有没有什么方法可以指定 scope (java包?),比如在angular中,我可以重写模块提供程序( AuthService 在这种情况下):

@NgModule({
  declarations: [LoginComponent, UserInfoComponent],
  providers: [
    {
      provide: AuthService,
      useClass: FacebookAuthService,
    },
  ],
})
export class AuthModule {}
qnyhuwrf

qnyhuwrf1#

您可以引入用@qualifier注解的元注解并使用它。一旦准备好更改,只需更改元注解上的限定符。

4si2a6ki

4si2a6ki2#

我认为把Angular 特性和spring联系起来是不正确的,因为它们只是两个完全不同的基础设施,在各个方面都是如此。
你为什么不想用 @Qualifier ? 为什么?因为,你所描述的问题正是人们提出 @Qualifier 实施。
我不想使用@qualifier来解决歧义,因为当您需要注入myservice时需要始终指定它,当我需要切换到单个实现时需要更改大量文件。
不是真的。您可以为您的bean定义提供id,并且不管您稍后将使用什么实现,具有相同id的同一bean将被注入到您将限定其被注入的任何地方。您将只交换实现类。
也, package 在java中,不是bean的作用域。包是对逻辑上相似的类进行分组的工具,它可以被视为一个作用域,但用于类及其成员的可访问性/可见性,而不是bean。
bean作用域有不同的语义,您可以在这里了解它们。
另一种方法是指定,如果要注入的类型有多个实现,则bean应符合候选条件。是的 @Primary ; 然而,这 @Primary 将始终覆盖任何其他候选人 @Qualifier 您可以利用更细粒度的控制在何处注入什么。

相关问题