簡體   English   中英

注入通用服務bean

[英]Inject generic service bean

我有一些高度重復的代碼,我決定進入一個抽象類,為簡單起見,讓我們假設該類看起來像:

class AbstractEntityService<E extends MyEntity, REPO extends MyRepository<E>> {

      @Autowired
      private REPO repo;

      ... // methods

}

而且我有大約10個單獨的類需要此功能,所以我有

@Service
class MyService1 extends AbstractEntityService<MyEntity1, MyEntity1Repo> {}

@Service
class MyService2 extends AbstractEntityService<MyEntity2, MyEntity2Repo> {}

...

MyService1 ... MyService10除了鞏固用於彈簧自動檢測的類型之外,實際上並沒有做任何其他事情。

我想知道我是否可以不定義它們並注入

@Autowired
private AbstractEntityService<MyEntity2, MyEntity2Repo> myEntity2Repo;

直接定義自己的類。

不,我敢肯定你不能。

我認為最好的方法是在配置文件中自行創建bean。

import javax.inject.Inject; 
import org.springframework.context.annotation.Bean;

@org.springframework.context.annotation.Configuration
public MyConfic {

    @Inject MyEntity1Repo myEntity1Repo;
    @Inject MyEntity2Repo myEntity2Repo;

    @Bean(name="myEntity1Service")
    AbstractEntityService<MyEntity1, MyEntity1Repo> myEntity2Service(){
        return new AbstractEntityService<> myEntity1Service( myEntity2Repo );
    }

    @Bean(name="myEntity2Service")
    AbstractEntityService<MyEntity2, MyEntity2Repo> myEntity2Service(){
        return new AbstractEntityService<> myEntity2Service( myEntity2Repo );
    }

}

至少通過這種方式,您不必為每個實體創建單獨的子類。

你要知道,現在你不能因為你的力擦除類型做注射myEnity1Service你將有相同的類型myEnity2ServiceAbstractEntityService 使用類似

@Inject @Named("myEntity2Service" )
AbstractEntityService<MyEntity2, MyEntity2Repo> myEntity2Service;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM