Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 自动关联bean列表并单独标识它们_Java_Spring Mvc_Web_Spring Boot_Autowired - Fatal编程技术网

Java 自动关联bean列表并单独标识它们

Java 自动关联bean列表并单独标识它们,java,spring-mvc,web,spring-boot,autowired,Java,Spring Mvc,Web,Spring Boot,Autowired,我可以在spring boot中自动连接服务bean的列表,但我需要一种方法来使用他们提供的名称选择我需要的服务 @Service("myService") public class DefaultService implements MyService { } @Service("myService2") public class DefaultService2 implements MyService { } @Autowire List<MyService> servic

我可以在spring boot中自动连接服务
bean的列表
,但我需要一种方法来使用他们提供的
名称
选择我需要的服务

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

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


@Autowire
List<MyService> services;
@Service(“myService”)
公共类DefaultService实现MyService{
}
@服务(“myService2”)
公共类DefaultService2实现MyService{
}
@自动连线
列出服务;

是否可以从列表中分别获取
DefaultService2
DefaultService

只是一个猜测,但您尝试过吗?:

@Autowire
MyService myService;

@Autowire
MyService myService2;

字段名应该足够提示Spring。否则,请按照albert_nil的解释使用。

只是一个猜测,但您尝试过这个吗?:

@Autowire
MyService myService;

@Autowire
MyService myService2;

字段名应该足够提示Spring。否则,按照albert_nil的解释使用。

添加@Qualifier注释:

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

添加@Qualifier注释:

@Autowired
@Qualifier("myService")
MyService myService;
您可以使用:

@Autowired
@Qualifier("myService")
MyService myService;
或者使用资源注释。它应该会起作用

@Resource
MyService myService;



@Resource
MyService myService2;
您可以使用:

@Autowired
@Qualifier("myService")
MyService myService;
或者使用资源注释。它应该会起作用

@Resource
MyService myService;



@Resource
MyService myService2;

我可以通过排序
autowire order
分别取出豆子。现在不需要命名

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

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

我可以通过排序
autowire order
分别取出豆子。现在不需要命名

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

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

尝试在
列表中迭代bean,并使用反射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
    }
}

有了这个,您将知道您正在使用的服务是什么。

尝试在
列表中迭代您的bean,并使用反射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
    }
}

有了这些,您将知道您正在使用的服务是什么。

如果您想按名称获取服务,请按如下方式实现模式工厂:

您的服务实现:

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

如果要按名称获取服务,请按如下方式实现模式工厂:

您的服务实现:

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

是否可以从“自动连线”列表中获取我想要的bean。@Priyamal好的,是的,您可以随时迭代它并调用
isinstance
,对项目执行操作。谢谢。这也是可能的,但我实际上需要一种使用bean名称的方法来实现这一点。@Priyamal这可能不太容易,因为一旦你有了列表,反射信息就会丢失。是否有可能从自动连线列表中获得我想要的bean。@Priyamal嗯,是的,您可以随时对其进行迭代,并对项目调用
isinstance
。谢谢。这也是可能的,但我实际上需要一种使用bean名称的方法来做到这一点。@Priyamal这可能不容易做到,因为一旦您拥有列表,反射信息就会丢失。是否可以从自动连线列表中获取我想要的bean。是否可以从自动连线列表中获取我想要的bean。当您提取
列表时
尝试在迭代时使用类的名称来获取所需的
服务
列表
尝试在迭代类时使用类的名称来获取所需的
服务