我需要通过名字从工厂获取豆。我想知道是否有更优雅的方式来处理这个问题?我的工作代码现在看起来像这样。这是我的界面服务和“工厂”
public interface GreetingService {
void getGreeting(String name);
}
public interface GreetingServiceFactory {
GreetingService getGreetingService(String region);
}
实施greetingService:
@Service
public class EnglishGreetingServiceImpl implements GreetingService {
@Override
public void getGreeting(String name) {
System.out.println("Hello " + name);
}
}
@Service
public class GermanGreetingServiceImpl implements GreetingService {
@Override
public void getGreeting(String name) {
System.out.println("Willkommen " + name);
}
}
实施工厂:
@Service
public class GreetingServiceFactoryImpl implements GreetingServiceFactory {
private Map<String, GreetingService> greetingBeanMap;
@Autowired
@Qualifier("germanGreetingServiceImpl")
private GreetingService germanGreetingService;
@Autowired
@Qualifier("englishGreetingServiceImpl")
private GreetingService englishGreetingService;
@PostConstruct
public void init () {
greetingBeanMap = new HashMap<>();
greetingBeanMap.put("en", englishGreetingService);
greetingBeanMap.put("de", germanGreetingService);
}
@Override
public GreetingService getGreetingService(String region) {
return greetingBeanMap.get(region);
}
}
带有示例代码的主类,我在一些名字后收到bean
@SpringBootApplication
public class SpringFactoryApplication implements CommandLineRunner {
@Autowired
private GreetingServiceFactory greetingServiceFactory;
public static void main(String[] args) {
SpringApplication.run(SpringFactoryApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
String config1 = "en";
GreetingService english = greetingServiceFactory.getGreetingService(config1);
english.getGreeting("John");
String config2 = "de";
GreetingService deutsch = greetingServiceFactory.getGreetingService(config2);
deutsch.getGreeting("Hans");
}
}
在上面的代码中,这段代码是完全冗余的
@Autowired
@Qualifier("germanGreetingServiceImpl")
private GreetingService germanGreetingService;
@Autowired
@Qualifier("englishGreetingServiceImpl")
private GreetingService englishGreetingService;
@PostConstruct
public void init () {
greetingBeanMap = new HashMap<>();
greetingBeanMap.put("en", englishGreetingService);
greetingBeanMap.put("de", germanGreetingService);
}
这段代码可以替换为
@Autowired
private Map<String, GreetingService> greetingBeanMap;
当你这样声明时,spring将搜索GreetingService
接口的所有实现并注入到你的地图中,并将键作为bean名称。例如,greetingBeanMap的密钥为germanGreetingServiceImpl
和englishGreetingServiceImpl
,值为bean本身。
如果要将密钥设为“en”和“de”而不是bean名称,则可以将bean命名为“en”和“de”。像这样
@Service("en")
public class EnglishGreetingServiceImpl implements GreetingService {
......
}
@Service("de")
public class GermanGreetingServiceImpl implements GreetingService {
......
}