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