Można użyć @Named
wraz z @Inject
aby określić, które fasola wstrzyknąć.
Prosty przykład z wtryskiwanego usługi:
public class ServiceTest {
@Inject
@Named("transactionDecorator")
private Service service;
}
a odpowiadający klasie dekorator transakcji:
@org.springframework.stereotype.Service("transactionDecorator")
public class ServiceDecoratorTransactionSupport extends ServiceDecorator {
@Inject
@Named("serviceBean")
public ServiceDecoratorTransactionSupport(Service service) {
super(service);
}
}
Naraża konfigurację w kodzie, więc polecam zrobić logikę zdobienia w klasa @Configuration
i zanotuj na przykład usługę rejestrowania z @Primary
. Dzięki takiemu podejściu klasa test może wyglądać następująco:
public class ServiceTest {
@Inject
private Service service;
a klasa konfiguracji:
@Configuration
public class DecoratorConfig {
@Bean
@Primary
public ServiceDecorator serviceDecoratorSecurity() {
return new ServiceDecoratorSecuritySupport(
serviceDecoratorTransactionSupport());
}
@Bean
public ServiceDecorator serviceDecoratorTransactionSupport() {
return new ServiceDecoratorTransactionSupport(serviceBean());
}
@Bean
public Service serviceBean() {
return new ServiceImpl(serviceRepositoryEverythingOkayStub());
}
@Bean
public ServiceRepository serviceRepositoryEverythingOkayStub() {
return new ServiceRepositoryEverythingOkStub();
}
}
Mój drugi przykład nie wystawiać żadnych szczegółów, o których realizacja które będą zwracane, ale zależy od kilku klas wiosennych.
Można również łączyć oba rozwiązania. Na przykład użyj adnotacji Spring na @Primary
na dekoratorze i pozwól Springowi wstrzyknąć ten dekorator do instancji danego typu.
@Service
@Primary
public class ServiceDecoratorSecuritySupport extends ServiceDecorator {
}
Dzięki za odpowiedź. Używam Springa, więc nie jest to możliwe dla mnie, szukałem tylko pakietu 'javax.inject'. Ale i tak warto to wiedzieć. –