2017-08-11 1 views
0

je peux autowire une liste de service beans dans le démarrage de ressort mais j'ai besoin d'un moyen de choisir celui dont j'ai besoin en utilisant le name qu'ils ont donné.autowire une liste de haricots et les identifier séparément

@Service("myService") 
public class DefaultService implements MyService { 
} 

@Service("myService2") 
public class DefaultService2 implements MyService { 
} 


@Autowire 
List<MyService> services; 

est-il possible d'obtenir DefaultService2 et DefaultService séparement dans la liste.

+0

lorsque vous extrayez votre 'list' essayer d'obtenir votre en utilisant le nom de la classe' Service' désirée lorsque vous itérer il. – msagala25

Répondre

1

Si vous voulez obtenir vos services par nom, mettre en œuvre l'usine de modèle comme ci-dessous:

Vos implémentations de service:

public interface MyService { 
    void sayHello(); 
} 


public class DefaultService implements MyService { 
    private static Logger log = LoggerFactory.getLogger(DefaultService.class); 
    @Override 
    public void sayHello() { 
     log.info("Hello from DefaultService"); 
    } 
} 

public class DefaultService2 implements MyService { 
    private static Logger log = LoggerFactory.getLogger(DefaultService2.class); 
    @Override 
    public void sayHello() { 
     log.info("Hello from DefaultService2"); 
    } 
} 

L'interface d'usine:

public interface MyServiceFactory { 
    public MyService getMyServiceByName(String name); 
} 

Les haricots usine :

@Configuration 
public class MyServiceFactoryBean { 
    @Bean 
    public FactoryBean serviceLocatorFactoryBean(){ 
     ServiceLocatorFactoryBean factoryBean = new ServiceLocatorFactoryBean(); 
     factoryBean.setServiceLocatorInterface(MyServiceFactory.class); 
     return factoryBean; 
    } 

    @Bean("myService") 
    @Scope(scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE) 
    public DefaultService defaultService(){ 
     return new DefaultService(); 
    } 

    @Bean("myService2") 
    @Scope(scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE) 
    public DefaultService2 defaultService2(){ 
     return new DefaultService2(); 
    } 
} 

Utilisation:

@Autowired 
    MyServiceFactory myServiceFactory; 

    @Override 
    public void run(String... strings) throws Exception { 
     myServiceFactory.getMyServiceByName("myService").sayHello(); 
     myServiceFactory.getMyServiceByName("myService2").sayHello(); 
    } 

Résultats:

2017-08-11 11:32:31.126 INFO 12827 --- [ restartedMain] c.m.test.DefaultService : Hello from DefaultService 
2017-08-11 11:32:31.129 INFO 12827 --- [ restartedMain] c.m.test.DefaultService2 : Hello from DefaultService2 
1

Juste une supposition, mais avez-vous essayé ?:

@Autowire 
MyService myService; 

@Autowire 
MyService myService2; 

Le nom du champ doit être assez indice au printemps. Sinon, utilisez @Qualifier comme expliqué par albert_nil.

+0

est-il possible d'obtenir le bean que je veux de la liste autowired. – Priyamal

+0

@Priyamal Eh bien, oui, vous pouvez toujours l'itérer et appeler 'isinstance' sur les objets. –

+0

merci. c'est possible aussi, mais j'ai vraiment besoin d'un moyen de le faire en utilisant le nom du bean. – Priyamal

1

Ajouter une annotation @Qualifier:

@Autowired 
@Qualifier("myService") 
MyService myService; 
+0

est-il possible d'obtenir le bean que je veux de la liste autowired. – Priyamal

1

Vous pouvez utiliser:

@Autowired 
@Qualifier("myService") 
MyService myService; 

Ou utiliser l'annotation des ressources. Ça devrait marcher.

@Resource 
MyService myService; 



@Resource 
MyService myService2; 
0

je peux prendre les fèves par le tri séparement autowire order .naming n'est pas nécessaire maintenant.

@Order(value=1) 
@Service 
public class DefaultService implements MyService { 
} 

@Service 
@Order(value=2) 
public class DefaultService2 implements MyService { 
} 
1

Essayez de itérer votre haricot dans le List et identifier chaque haricot utilisant la réflexion api .getClass().getSimpleName(). Cela renverra le nom String de votre classe.

for(MyService service : services) { 
    if(service.getClass().getSimpleName().equals("DefaultService")) { 
     MyService defaultService = service; // This is DefaultService class 
    } 
    if(service.getClass().getSimpleName().equals("DefaultService2")) { 
     MyService defaultService2 = service; // This is DefaultService2 class 
    } 
} 

Avec ceci, vous saurez quel serait le service que vous utilisez.