【问题标题】:How do I inject just a Map<Object, List<Object>> with spring-boot?如何使用 spring-boot 仅注入 Map<Object, List<Object>>?
【发布时间】:2019-05-01 15:05:00
【问题描述】:

我有以下课程:

@Configuration
public class ActionsConfig {

  private Map<ObjectType, List<Action>> map = new HashMap<>();

  @Bean
  public Action1 action1() {

    return new Action1();
  }


  @Bean
  public Action2 action2(){

    return new Action2();
  }

  @Bean
  public Action3 action3(){

    return new Action3();
  }

  private void fillMap(){
     //here I am filling my map
  }

  public Map<ObjectType, List<Action>> getMap(){
    return this.map;
  }
}

Action1Action2Action3 类实现了一个通用的Action 接口。 然后,在我的服务中,我自动连接 ActionsConfig 类并获取地图。

@Service
public class BasketService {
     @Autowired
     private ActionsConfig actionsConfig;
     ...
     public void doSomething(){
        ...
        actionsConfig.getMap()...
        ...
     }
}

有没有办法只自动连接地图,从而直接使用地图中的值?

【问题讨论】:

  • 将@Bean 添加到getMap() 方法(尝试想出一个更好的名称),并在需要的地方@Autowire 映射。但是,fillMap() 可能会在 一些 的布线已经完成之后被调用,这可能是一个问题,具体取决于地图的使用方式 - 只需确保在使用之前填充它。此外,请注意并发性 - 如果需要,将地图设为 ConcurrentHashMap。
  • @AndrewS 谢谢,我这样做了,我按照下面给出的答案进行操作,但是,我应该自动装配方法,而不是地图本身吗?
  • 这取决于你,但请参阅other discussion,它建议使用构造函数注入。

标签: java spring spring-boot autowired


【解决方案1】:

您可以创建一个带有@Bean 注释的方法。

  @Bean
  public Map<ObjectType, List<Action>> getMap() {

    Map<ObjectType, List<Action>> map = new HashMap<>();
    fillMap()

    return map;
  }

然后您可以使用@Autowired 自动装配地图。

@Autowired
private Map<ObjectType, List<Action>> myMap;

【讨论】:

  • 感谢您的回答。只是一个问题-我想我应该自动装配方法的名称,对吗? (即@Autowired private Map&lt;ObjectType, List&lt;Action&gt;&gt; getMap;)。不是myMap?
  • 不。变量名不必与方法名相同。 Spring 容器将注入 Map>. 类型的 bean
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
  • 1970-01-01
  • 2020-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多