Если вопрос заключается в том, возможно ли устанавливать общедоступные статические поля в управляемом компоненте Spring - тогда да, это возможно, хотя я полностью согласен с вами, что это плохой дизайн.
Оставляя в покое пружину, помещая константыв интерфейсе, так что реализации интерфейса будут иметь к ним доступ, считается запахом кода, потому что все реализации (при условии, что их много) теперь могут вести себя по-разному, потому что некоторые постоянные изменения или, что еще хуже, не будут компилироваться больше, есликонстанта удалена (что, если не все реализации находятся в проекте).
Гораздо лучший подход - создать класс констант:
public class YouTubeConstants {
public static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();
public static final JsonFactory JSON_FACTORY = new JacksonFactory();
...
}
В классе, которому требуется доступ кэти константы вы можете использовать YouTubeConstants.HTTP_TRANSPORT
(или даже закороченные при статическом импорте).
Теперь, что касается представленного дизайна, позвольте мне предложить альтернативу:
Класс YouTubeApiService
в основном нуждается вдоступ только к YouTube
объекту, он нужен для выполнения запросов. Нет необходимости в YouTubeServiceBuild
промежуточном объекте, нет необходимости в свойствах соединения), IMHO, это только усложняет код.
Вы можете сделать что-то вроде этого:
@Service
public class YouTubeApiService {
@Autowired
private YouTube youtube;
public List<SearchResult> searchYouTube(String searchQuery) {
List<SearchResult> searchResults =
executeSearch(searchQuery,youtube);
//etc...
}
}
Выглядит намного лучше, нене так ли?
Теперь, чтобы создать объект youtube, вам нужен код, который немного выходит за рамки обычного «new». Для этого вы можете использовать Конфигурацию:
import static YoutubeConstants.*;
@Configuration
public class YouTubeConfig {
@Bean
public YouTube youtube() {
return new YouTube.Builder(HTTP_TRANSPORT, JSON_FACTORY, request -> {
}).setApplicationName("youtube-search-demo").build();
}
}
В этой реализации вообще нет необходимости в YouTubeBuilder
Еще один момент, на который следует обратить внимание: кажется, вы пытаетесьчтобы загрузить некоторые свойства самостоятельно, обратите внимание, что пружина может работать в одиночку.
Я не видел реального использования этих свойств в коде, представленном в вопросе, поэтому я не могу предоставить рабочий пример,но, пожалуйста, убедитесь, что вы понимаете, как загружать свойства весной, вы можете добавить уже загруженные свойства в метод youtube
в конфигурации.