2017-08-11 46 views
0

我可以自動裝配在春季啓動服務beans的清單,但我需要一種方法來挑一個,我需要使用他們已經給了name自動裝配Bean的列表,並確定他們seperately

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

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


@Autowire 
List<MyService> services; 

,纔有可能從列表中得到DefaultService2DefaultService seperately。

+0

當你提取您'List'嘗試使用類的名字,當你重複它來獲得你想要的'Service'。 – msagala25

回答

1

如果你想通過名稱來獲得你的服務,實現如下格局工廠:

您的服務實現:

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"); 
    } 
} 

工廠接口:

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

工廠豆:

@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(); 
    } 
} 

用法:

@Autowired 
    MyServiceFactory myServiceFactory; 

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

結果:

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

只是一個猜測,但你嘗試過這個?:

@Autowire 
MyService myService; 

@Autowire 
MyService myService2; 

字段名稱應該是足夠的暗示春。否則,使用@Qualifier由albert_nil解釋。

+0

是有可能得到我從自動裝配Autowired列表中選擇所需的豆。 – Priyamal

+0

@Priyamal嗯,是的,你總是可以重複它,並調用'isinstance'上的項目。 –

+0

謝謝。這也是可能的,但我實際上需要通過使用bean名稱來實現這一點。 – Priyamal

1

添加@Qualifier註解:

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

是否有可能從自動裝配列表中獲取我想要的bean。 – Priyamal

1

您可以使用:

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

或者使用資源註解。它應該工作。

@Resource 
MyService myService; 



@Resource 
MyService myService2; 
0

我可以seperately通過排序autowire order .naming不是現在需要取出咖啡豆。

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

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

嘗試重複你的bean在List並確定使用反射API .getClass().getSimpleName()每個bean。這將返回你的類的字符串名稱。

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 
    } 
} 

有了這個,你就會知道你正在使用的服務是什麼。

相關問題