有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在控制器中使用@Autowired和@Qualifier更改服务的数据源

我刚开始使用Spring boot,现在遇到了一个问题

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

3Tier setup

那我该怎么做呢?能够在控制器类中切换存储库吗

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

使用简单的依赖项注入,我可以将所需的respository类添加到服务类构造函数中,这取决于使用测试类或控制器类

然而,我想使用@Autowired注释,并发现可以在服务类中使用@Qualifier在自动连接的repo类之间切换。然而,我不想在服务类中这样做(在那里硬编码),而是动态地这样做,让控制器或测试类注入数据源选择

这可能吗?我该怎么做


共 (2) 个答案

  1. # 1 楼答案

    您应该在ServiceImpl类的顶部使用@service注释 然后是控制器中的@autowired服务

  2. # 2 楼答案

    您的包结构应如下所示:

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

    实体示例:

    @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
    }