【问题标题】:Can I use a HashMap to pick which interface (DAO) to autowire in SpringBoot?我可以使用 HashMap 在 Spring Boot 中选择要自动装配的接口 (DAO) 吗?
【发布时间】:2020-08-07 13:22:18
【问题描述】:

我会尽量详细。我有很多 DAO,我的服务需要根据我得到的密钥使用其中一个。比如——

if(key.equals("abc") {
   obj = abcDAO.getOne(id);
} else if(key.equals("xyz") {
   obj = xyzDAO.getOne(id);
}

对象是父类类型,abc、xyz..都是子类。

我的想法是创建一个Map<String, ParentCLass> 来获取对象,只需传递密钥而不是 If-else,这样就可以轻松添加以进行进一步更改。如果它是一个普通的类,我会将地图初始化为

Map<String, ParentClass> map. 
map.put("abc", new Abc());

但由于 DAO 是接口并且需要 @Autowired 才能使用它们,我不知道如何继续。我是初学者。任何帮助表示赞赏。

【问题讨论】:

  • 你可以使用多态性,检查这个exemple

标签: java spring spring-boot interface dao


【解决方案1】:

如果映射以字符串为键(将包含 bean 名称)和接口作为值,则 Spring 能够在映射中注入具有相同接口的所有 bean。

public interface MyDao {
    
}

@Autowired
private Map<String, MyDao> daos;

编辑:如果你使用Spring Data Repository,已经有一个标签接口:Repository。您可以使用以下代码在一个 bean 中注入所有 DAO。

@Autowired
private Map<String, Repository> daos;

EDIT2:示例

public interface UserRepo extends JpaRepository<User, Long> { ... }

@Service
public class MyService {

    @Autowired
    private Map<String, Repository> daos;

    public List<User> findAll() {
        return daos.get("userRepo").findAll();
    }
}

【讨论】:

  • 很有趣,但是我在地图上放了什么?像 daos.put("key", new AbcDAO()) 不能正常工作吗?因为这意味着实例化抽象类..
  • Spring 不会用所有为您实现相同接口的 bean 填充映射。您可以通过 bean 名称获取它们。我的错误,我更新不需要新的 HashMap。
  • 嗯,我现在很困惑。我有不同的存储库。在您的示例中,对于所有存储库,我的用户将是 User1、User2 等。我想使用映射来选择它,我将定义一个作为我想要的存储库的字符串和值的键。这样的设计..
  • 对不起,我也迷路了......如果你可以添加一个你想用他们的密钥检索的 2 个存储库的示例。
  • 见.. 我有 2 个存储库,其类 public interface AbcDAO extends JpaRepositor 和 public interface XyzDao extends JpaRepository 现在根据输入值,我将选择哪个 dao自动接线。所以我的想法是使用 Map 字符串是键(假设“pick abc”),值将是 dao obj。所以我需要一个像 map.put("pick abc", new AbcDao()) 这样的语句。但这会给我一个错误,因为我无法实例化。有没有办法完成将道添加到地图?
【解决方案2】:

您可以使用特定名称为每个 Dao 创建不同的 bean

@Bean(name = "daoImpl1")
public Dao daoImpl1(){
return new DaoImpl1();

@Bean(name = "daoImpl2")
public Dao daoImpl2(){
return new DaoImpl2();

然后@Autowire 他们使用带有该名称的@Qualifier

@Autowired
@Qualifier("daoImpl1")
private Dao daoImpl1;

@Autowired
@Qualifier("daoImpl2")
private Dao daoImpl2;

【讨论】:

    【解决方案3】:

    我制作了一些方法来制作简单的 jpa 东西, 我将所有存储库都存储在 HashMap 中 你只需要传递子类就可以得到对应的JpaRepository

    你可以在https://github.com/fajaralmu/base_web_app看到更多

    示例:

    public List<Page> getAllPages() {
            List<Page> allPages = entityRepository.findAll(Page.class);
            
            return   allPages;
        }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-15
    • 2017-08-06
    • 2011-01-23
    • 2018-01-27
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多