将bean放入地图以按名称从工厂获取bean

问题描述 投票:0回答:1

我需要通过名字从工厂获取豆。我想知道是否有更优雅的方式来处理这个问题?我的工作代码现在看起来像这样。这是我的界面服务和“工厂”

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");
    }
}
java spring
1个回答
2
投票

在上面的代码中,这段代码是完全冗余的

 @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的密钥为germanGreetingServiceImplenglishGreetingServiceImpl,值为bean本身。

如果要将密钥设为“en”和“de”而不是bean名称,则可以将bean命名为“en”和“de”。像这样

@Service("en")
public class EnglishGreetingServiceImpl implements GreetingService {
 ......
}

@Service("de")
public class GermanGreetingServiceImpl implements GreetingService {
 ......
}
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.