Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring-在运行时解析依赖项_Java_Spring_Dependency Injection_Spring Data - Fatal编程技术网

Java Spring-在运行时解析依赖项

Java Spring-在运行时解析依赖项,java,spring,dependency-injection,spring-data,Java,Spring,Dependency Injection,Spring Data,我用Spring数据编写Spring应用程序。我有两个实体:客户和商户。我还有两个相应的存储库和服务:CustomerRepository、MerchantRepository、CustomerService和MerchantService。CustomerService和MerchantService中的逻辑非常相似,但与不同的存储库相关(相应地CustomerRepository和MerchantRepository)。所以它看起来或多或少像这样: class Customer {

我用
Spring数据编写
Spring
应用程序。我有两个实体:
客户
商户
。我还有两个相应的存储库和服务:
CustomerRepository
MerchantRepository
CustomerService
MerchantService
CustomerService
MerchantService
中的逻辑非常相似,但与不同的存储库相关(相应地
CustomerRepository
MerchantRepository
)。所以它看起来或多或少像这样:

class Customer {
    // ...
}

class Merchant {
    // ...
}

interface CustomerRepository extends CrudRepository<Customer, Long> {
    // ...
}

interface MerchantRepository extends CrudRepository<Merchant, Long> {

}

class CustomerService {
    private CommonHelper helper;

    void method() {
        helper.commonMethod();
        // ...
    }
}

class MerchantService {
    private CommonHelper helper;

    void method() {
        helper.commonMethod();
        // ...
    }
}

class CommonHelper {

    private CrudRepository repository;

    public CommonHelper(CrudRepository repository) {
        this.repository = repository;
    }

    public void commonMethod() {
        repository.findAll();
        // ...
    }
}
class客户{
// ...
}
阶级商人{
// ...
}
接口CustomerRepository扩展了Crudepository{
// ...
}
接口商品存储扩展了CRUDREPOSITION{
}
类客户服务{
私人助理;
void方法(){
helper.commonMethod();
// ...
}
}
类别商品服务{
私人助理;
void方法(){
helper.commonMethod();
// ...
}
}
类CommonHelper{
私有积存库;
公共CommonHelper(CRUDepository存储库){
this.repository=存储库;
}
公共方法(){
repository.findAll();
// ...
}
}

我想创建第三个类,我们称之为
CommonHelper
,以避免代码重复,并将公共逻辑放在那里(操作相同,但使用不同的存储库)。但是,我需要两个具有两个不同存储库的独立实例。当然,我可以使用
new
来实例化它,但是还有更多的
Spring
方法来实现相同的目标吗?

您可以为
CommonHelper
提取一个抽象类,并定义两个bean来实现它:一个用于商户关注点,另一个用于客户关注点。
接口可以是通用的,以便能够根据实现调整API类型

例如:

public abstract class BaseService<T, K> {

    private CrudRepository<T, K> repository;

    public BaseService(CrudRepository<T, K> repository){
       this.repository = repository;
    }

    T commonMethod(K key){
        T object = repository.findById(key);
        // other processing...
    }
}
公共抽象类BaseService{
私有积存库;
公共基础服务(CrudRepository存储库){
this.repository=存储库;
}
T通用方法(K键){
T object=repository.findById(key);
//其他处理。。。
}
}
和实施:

@Service
@Qualifier("customerBaseService") 
public class CustomerBaseService extends BaseService<Customer, Long> {
    public CustomerBaseService (CustomerRepository repository){
      super(repository);
    }
}

@Service
@Qualifier("merchantBaseService") 
public class MerchantBaseService extends BaseService<Merchant, Long> {
    public MerchantBaseService (MerchantRepository repository){
      super(repository);
    }
}
@服务
@限定符(“customerBaseService”)
公共类CustomerBaseService扩展了BaseService{
公共CustomerBaseService(CustomerRepository存储库){
超级(储存库);
}
}
@服务
@限定词(“merchantBaseService”)
公共类MerchantBaseService扩展了BaseService{
公共商品数据库服务(商品存储库){
超级(储存库);
}
}

然后,通过指定与匹配的限定符,将合适的代码注入CustomerService或MerchantService。

但是,我需要两个独立的实现来编写两个独立的实现,从而复制代码。