В контексте классического веб-приложения с контроллерами REST мне потребовалась разработка небольшой Java-программы, которая будет называться как обычная задача с использованием соответствующего планировщика.Spring Инъекция зависимостей в простой Java-программе
Исходный код проекта имеет два основных класса: один, что это обычный ботинок Spring Application
, с некоторыми общие Спринг загрузки аннотаций (@EnableAutoConfiguration, @componentScan и т.д.)
Второй основной класс является простой Java-класс с методом static void main
. Поскольку программа задач будет использовать данные, созданные стандартным веб-приложением, у меня есть (не учитывая, что я должен это признать), использовал @Autowired
аннотации нескольких переменных класса для доступа к данным через репозитории JPA.
Только сейчас, при запуске программы задач, я ударил исключение NullPointerException при использовании первого репозитория. В течение одной секунды я был озадачен, тогда я понял, что ошибки следует ожидать начиная с Весна не делает свою магию.
Мой вопрос теперь в том, как я могу использовать инъекцию Spring для этой простой Java-класса? Я предполагаю, что есть что-то одно или несколько аннотаций, но в богатстве весенних аннотаций это похоже на поиск конкретной иглы в пачке мешков с иглами.
[EDIT] Ответ на вопрос: @ J-Mengelle - путь: я видел точные обычные сообщения консоли при запуске задачи, как при запуске веб-приложения.
Это код, к которому я получил (объяснение ниже):
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(Application.class); // This is the Spring boot application class
InputStream is = Application.class.getClassLoader()
.getResourceAsStream("application.properties"); //$NON-NLS-1$
Properties props = new Properties();
props.load(is);
is.close();
ConfigurableEnvironment environment = new StandardEnvironment();
MutablePropertySources propertySources = environment.getPropertySources();
Map<String, Object> myMap = new HashMap<>();
for (Object key : props.keySet()) {
myMap.put((String) key, props.get(key));
}
propertySources.addFirst(new MapPropertySource("MY_MAP", myMap)); //$NON-NLS-1$
ctx.setEnvironment(environment);
ctx.refresh();
Однако, я ударил первое исключение с этим сообщением:
не может определить встроенную базу данных класса драйвера для типа базы данных NONE
Это было потому, что application.properties
не читался, и источник данных не настраивался, следовательно, человек ual чтения выше, которое, как я полагаю, обычно бережно относится к весеннему ботинку.
После этого можно было бы получить исключения для создания bean. Я столкнулся с одним из таких исключений с помощью springfox. Затем я просто удалил аннотацию @ EnableSwagger2 в bean-компоненте Swagger, и с тех пор она прошла гладко, что означает, что я мог бы писать инструкции, такие как actionRepository = ctx.getBean(ActionRepository.class);
, и иметь правильные инъекции в переменные.