2017-01-11 6 views
0

У меня есть некоторые весьма повторяющийся код, который я решил перейти в абстрактный класс, для простоты будем считать, что класс выглядит следующим образом:Вводят общая служба боб

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; 

непосредственно без определения классов самостоятельно.

+0

Возможно, вы сможете автоподписать подкласс, но конкретный класс должен существовать, и я не думаю, что есть какой-то способ заставить Spring создать его для вас. Мне любопытно, что вы делаете в абстрактном классе, поскольку я кодировал довольно большие проекты Spring/JPA, и у меня никогда не было необходимости в этом? –

ответ

0

Нет, я уверен, что вы не можете.

Я думаю, что лучшее, что вы можете сделать, это создать сами компоненты в файле конфигурации.

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; 
+0

Да, это лучшая вещь, о которой я мог думать (хотя вы можете сохранить имя, так как это будет имя метода по умолчанию) –

+0

@KlausGroenbaek Мне нравится это как напоминание о том, что вам нужно использовать '@ Именован' в '@ Inject', но я считаю, что вы правы. – ArtB

+0

С весной вам даже не нужно имя, если у вас есть общая информация о типе. Таким образом, имя на самом деле необязательно как для компонента, так и для точки впрыска. Но я не уверен, что он будет работать в среде J2EE. –

Смежные вопросы