Se puede utilizar junto con @Named
@Inject
para especificar qué frijol a inyectar.
Un ejemplo sencillo con un servicio inyectada:
public class ServiceTest {
@Inject
@Named("transactionDecorator")
private Service service;
}
y la correspondiente clase decoradora de transacción:
@org.springframework.stereotype.Service("transactionDecorator")
public class ServiceDecoratorTransactionSupport extends ServiceDecorator {
@Inject
@Named("serviceBean")
public ServiceDecoratorTransactionSupport(Service service) {
super(service);
}
}
Esto expone la configuración en su código, por lo que recomiendo hacer la lógica de decoración en una clase @Configuration
y anotar, por ejemplo, el servicio de registro con @Primary
. Con este enfoque a su clase de prueba puede ser algo como esto:
public class ServiceTest {
@Inject
private Service service;
Y la clase de configuración:
@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();
}
}
Mi segundo ejemplo no expone ningún detalle acerca de qué aplicación que serán devueltos, pero depende de varias clases específicas de primavera.
También puede combinar las dos soluciones. Por ejemplo, use la anotación de Spring @Primary
en un decorador y deje que Spring inyecte este decorador en la instancia del tipo dado.
@Service
@Primary
public class ServiceDecoratorSecuritySupport extends ServiceDecorator {
}
Gracias por la respuesta. En realidad estoy usando Spring, así que esto no es posible para mí, estaba buscando usar solo el paquete 'javax.inject'. Pero es bueno saber de todos modos. –