@Autowire Spring Bean с введенными аргументами конструктора?

У меня есть структура проекта, аналогичная указанной здесь: https://stackoverflow.com/a/29583882/1243462. У меня есть библиотека утилит, содержащая класс службы в одном JAR, предназначенная для использования из другой библиотеки Java / проекта Maven. Однако сам мой класс Service использует внедрение конструктора. Итак, где был исходный вопрос:

@Service
public class PermissionsService { ... }

у меня есть

@Service
public class PermissionsService {

  public PermissionsService(@Autowired PermissionsDao dao) { 
   //assign private dao field to autowired dao
  }

}

И, как и в исходном сообщении, я хочу создать экземпляр PermissionsService и внедрить его в свое клиентское / потребительское приложение. Я не уверен, как создать класс конфигурации.

 @Configuration
 public class PersistenceConfig {

   public PermissionsService getPermissionsServiceBean() {
     //What goes here?
   }
}

На данный момент у меня есть обходной путь, в котором я заменил аргумент конструктора @Autowired PermissionsDao на внедрение поля и конструктор без аргументов. Это позволяет мне:

 @Configuration
 public class PersistenceConfig {

   public PermissionsService getPermissionsServiceBean() {
     return new PermissionsService();
   }
}

Но, поскольку внедрение поля не приветствуется, как правильно структурировать этот код?


person shikharraje    schedule 05.10.2018    source источник


Ответы (1)


В основном модуле

@Configuration
@Import(PersistenceConfig.class)
public class ServiceConfig() {

}

В модуле утилит

@Configuration
@ComponentScan(basePackages = {"path-to-persistence-service-and-any-dependencies"})
public class PersistenceConfig {

}

Тот факт, что вы используете внедрение конструктора для PermissionsDao, не имеет значения, если вы правильно настроили конфигурацию.

person Community    schedule 05.10.2018
comment
Привет, быстрый вопрос. Означает ли это, что класс основного модуля ServiceConfig должен заранее знать, что требуется импорт PersistenceConfig.class? Мне было интересно, есть ли что-то вроде @SpringBootApplication, которое могло бы просто создать PermissionsService, чтобы мне не нужно было знать, какой класс Config нужен. В верхней части моей головы одна проблема может заключаться в том, что я использую несколько конфигураций для разных профилей Spring, то есть PersistenceConfigX (скажем, для Postgres) и PersistenceConfigY (MySQL), которым нужно ServiceConfig, чтобы ТОЧНО знать, какой PersistenceConfig выбрать - person shikharraje; 05.10.2018
comment
На всякий случай документация по профилям Spring: docs.spring.io/spring-boot/docs/current/reference/html/ - person shikharraje; 05.10.2018
comment
@SpringBootApplication выполняет @ComponentScan в пакете, где он определен (в вашем примере это будет com.yourorg.main). Поскольку com.yourorg.utils не будет дочерним по отношению к com.yourorg.main, конфигурация из модуля utils не будет получена по умолчанию, поэтому вам придется вручную импортировать ее (через @Import откуда-то из пути сканирования). - person ; 05.10.2018
comment
Что касается профилей, вам следует больше определять bean-компоненты не в модуле utils, а в @Configuration классах (конфигурация для каждого профиля, каждый из которых определяет свои соответствующие bean-компоненты). - person ; 05.10.2018
comment
Или также определите профилированные конфигурации в утилитах, это был бы другой способ сделать это. - person ; 05.10.2018