首页 > 解决方案 > 在 Controller 中使用 @Autowired 和 @Qualifier 更改服务的数据源

问题描述

我是使用 Spring Boot 的新手,目前遇到了问题。

我有一个具有 3 层的应用程序,控制器、服务和存储库。TL:DR,在这里找到我的设置图:

3层设置

那么我该如何进行这项工作呢?能够在控制器类中切换存储库吗?

控制器调用服务,然后使用存储库中的类返回正确的数据(在需要时执行逻辑魔术之后)。我还使用 Hibernate 和 H2 inmemory 使 SQL 连接更容易,但是出于测试目的,我希望在另一个存储库类中硬编码数据和方法。我的控制器通过服务使用 H2 inmem 数据源,而我的测试类使用硬编码数据源。

使用简单的依赖注入,我可以将所需的存储库类添加到服务类构造函数中,并且取决于使用测试类或控制器类,这可以正常工作。

但是,我想使用@Autowired注释,并发现您可以@Qualifier在服务类中使用来在自动装配的 repo 类之间切换。但是,我不想在服务类中执行此操作(在那里对其进行硬编码),而是动态执行此操作,并让控制器或测试类注入数据源选择。

这甚至可能吗,我该怎么做?

标签: javaspringspring-bootspring-data-jpa

解决方案


您的包结构应如下所示:

  • 实体
  • 存储库
  • 服务和服务工具
  • 控制器

实体示例:

@Entity
@Table(name = "table_name")
public class NameEntiy implements Serializable {

private static final long serialVersionUID = 1L;

@Id
private Long id;

@Column(name = "name_column_in_your_database")
private String data;

// constructors, getter, setter, hascode, equals and string methods
}

存储库示例:

@Repository("nameEntityRepositoryQualifier")
public interface INameEntityRepository extends JpaRepository<NameEntity, Long> {

}

服务示例:

public interface INameEntityService {
    public void save(NameEntity entity);
    //yours methods
}

服务实现示例:

@Service("nameEntityServiceQualifier")
public class NameEntityServiceImpl implements INameEntityService {

    @Autowired
    @Qualifier("nameEntityRepositoryQualifier")
    INameEntityRepository nameEntityRepository ;

    @Override
    public void save(NameEntity entity) {
       nameEntityRepository.save(entity);
    }
}

控制器示例:

@Controller or @RestController
@RequestMapping("/pathController")
public class YourController {

    @Autowired
    @Qualifier("nameEntityServiceQualifier")
    private INameEntityService nameEntityService;

    //yours controller methods
}

推荐阅读