2016-06-29 3 views
2

В контексте классического веб-приложения с контроллерами 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);, и иметь правильные инъекции в переменные.

ответ

1

Это не будет возможным вводить зависимости пружинные в обычный класс Java, пока он не является частью Spring контекста. Один из способов - привести этот класс под весенний контекст, объявив его как фасоль и удалив основной метод. В противном случае, если вам нужно придерживаться основного метода, загрузите Spring beans через контекст приложения.

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/application-context.xml"); 
beanA = (BeanA) applicationContext.getBean("beanA"); 

И тогда вы можете присвоить его переменной класса BeanA beanA вы хотите установить.

Смежные вопросы