注入通用服务bean

时间:2017-01-11 13:58:51

标签: java spring spring-mvc spring-boot

我有一些高度重复的代码,我决定进入一个抽象类,为了简单起见,我们假设该类看起来像:

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;

直接自己没有定义类。

1 个答案:

答案 0 :(得分:0)

不,我很确定你不能。

我认为你能做的最好的事情就是你自己在配置文件中创建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您将使用与myEnity2Service相同的类型:AbstractEntityService。使用像

这样的东西
@Inject @Named("myEntity2Service" )
AbstractEntityService<MyEntity2, MyEntity2Repo> myEntity2Service;