Реализация интерфейса Spring Inject - PullRequest
0 голосов
/ 06 ноября 2018

Я бы хотел использовать lombok для внедрения класса, реализованного из интерфейса, подобного приведенному ниже:

@RequiredArgsConstructor(onConstructor = @_(@Inject))
public class className {
    @NonNull
    private final ClassA1 a1 implements ClassA;
    ...
}

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

=================

редактирование: Или я должен так поступить?

public class className {
        private ClassA a1;
        public className(A1 a1) {
        this.a1 = a1; }
    }

=================== Вот код после получения совета от Михаила Москуры:

@Component
@RequiredArgsConstructor(onConstructor = @_(@Inject))
public class C {
     @NonNull
     private A b;
     public someFunction() {
        b.method();
     }
}

Здесь A - это интерфейс, а b - это класс, реализующий A с именем верблюда. И используя lombok я ввел b, а теперь вызываю некоторый метод b в некоторой функции. Однако я понял, что b.method по-прежнему указывает на интерфейс A, но не на B.

1 Ответ

0 голосов
/ 06 ноября 2018

@ NonNull не требуется Lombok сгенерирует конструктор с полями, помеченными как final или @NonNull Вы можете автоматически подключить, просто объявив тип интерфейса и присвоение имени класса реализации в верблюжьем регистре, начиная с нижнего регистра. Также вам нужно объявить вашу реализацию как отруби и класс, в который вы ее внедряете. @Inject является зависимостью Java Java от CDI. @Autowired зависит от весны. Spring поддерживает оба, но говорит, что использовать @Autowired Вот пример:

public interface A{
}

@Component
public class B implements A{
}

@Component
public class C {
  private A a;
@Autowired
  public C(A a){
   this.a = a;  
}
}

Образец Ломбок:

 @RequiredArgsConstructor
   @Component
    public class C {
      //Here it will inject the implementation of A interface with name of implementation (As we have name of impl B we declare field as b , if HelloBeanImpl then helloBeanImpl
     private A b;
    }

Но если у вас много реализаций одного интерфейса, вы можете использовать @Qualifier с именем bean-компонента или приведенный выше пример с lombok, где A b, где b - имя реализации

...