Java 自动关联bean列表并单独标识它们
我可以在spring boot中自动连接服务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
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。当您提取列表时
尝试在迭代时使用类的名称来获取所需的服务列表
尝试在迭代类时使用类的名称来获取所需的服务
。