【问题标题】:Using @Autowired and @Qualifier in the Controller to change datasource for the Service在 Controller 中使用 @Autowired 和 @Qualifier 更改服务的数据源
【发布时间】:2021-04-01 01:46:15
【问题描述】:

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

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

3Tier setup

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

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

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

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

这是否可能,我该怎么做?

【问题讨论】:

  • 不要,请不要,因为这违背了 DI 的目的。只需创建要在特殊配置中使用的存储库,以便只有一个存储库可以自动装配。

标签: java spring spring-boot spring-data-jpa


【解决方案1】:

你应该在ServiceImpl类的顶部使用@service注解 然后@autowired Controller 中的服务。

【讨论】:

    【解决方案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
    }
    

    【讨论】:

      猜你喜欢
      • 2016-12-05
      • 1970-01-01
      • 2017-04-11
      • 2011-12-12
      • 1970-01-01
      • 2020-09-01
      • 1970-01-01
      • 2019-11-15
      相关资源
      最近更新 更多