Функциональный интерфейс там StateHandlerDef
предназначен для представления функции-получателя getHandlerClass()
, которая определена в определении класса с помощью лямбда-определения. С декларацией ниже;
@Bean
public StateHandlerDef handler() {
return () -> StateOne.class; // a supplier, no input, returns value (getter)
}
По сути, мы реализуем интерфейс StateHandlerDef
, определив метод getHandlerClass()
. Вот почему возвращаемое значение лямбды совпадает с методом получения, StateOne
имеет тип Class<? extends AbstractUntypedActor>
.
Таким образом, созданный нами компонент был похож на следующий:
public interface StateHandlerDef {
Class<? extends AbstractUntypedActor> getHandlerClass();
}
public class StateHandlerDefImpl implements StateHandlerDef {
// explicit way of writing lambda "() -> StateOne.class"
Class<? extends AbstractUntypedActor> getHandlerClass() {
return StateOne.class;
}
}
@Bean
public StateHandlerDef handler() {
return new StateHandlerDefImpl(); // then we use the getter thru this bean.
}
С помощью @FunctionalInterface
мы можем пропустить реализацию интерфейса, как указано выше, и просто использовать сам интерфейс с переданной лямбда (которая является Поставщиком ).
Теперь вы можете просто сделать это;
@Autowire
private StateHandlerDef handler;
public .. someLogic() {
...
handler.getHandlerClass(); // will trigger the lambda, returning `StateOne.class`
...
}
Вы можете изменить имя компонента, просто изменив имя метода его создания. @Bean handler()
сгенерирует бин с именем handler
.
Я попытался упростить, надеюсь, это было понятно, в противном случае, пожалуйста, проверьте это