Инъекция зависимостей в автономном приложении Java 7
Я хотел бы использовать инъекцию зависимостей в большом автономном приложении Java 7, но я не уверен, с чего начать.
Я написал небольшое тестовое приложение:
public class Main {
@Inject
MyInterface myInterface;
public static void main( String[] args ) {
Main m = new Main();
System.out.println(m.myInterface.getMessage());
}
}
с интерфейсом:
public interface MyInterface {
String getMessage();
}
и реализация интерфейса:
@Singleton
public class MyInterfaceImpl implements MyInterface {
public String getMessage() {
return "Hello World!";
}
}
pom.xml
содержит одну зависимость:
<dependencies>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
Это приложение компилируется, но, конечно, при попытке распечатать сообщение он сработает с помощью NPE
. Инъекции не произошло.
Итак, мой вопрос:
- Возможно ли внедрение зависимостей в автономном приложении Java 7?
- Какие другие зависимости я должен включить, чтобы заставить его работать?
- Есть ли у кого-нибудь простой операционный пример для совместного использования (я не мог найти его)?
Ответы
Ответ 1
Существует не только один способ использования инъекции зависимостей с Java.
(1) Например, вы можете использовать стандартный CDI, где эталонная реализация Weld. Существует документация о с использованием Weld в среде Java SE, что, вероятно, вы подразумеваете под автономным приложением.
Вы также можете использовать Spring Framework, который также поддерживает общую аннотацию CDI (например, @Inject
). В этом случае вы обычно создаете ClasspathXmlApplicationContext
при запуске программы и позволяете Spring управлять (создавать/уничтожать) все beans вам нужно.
(2) Ваши текущие зависимости импортируют API Java EE. Таким образом, я не удивлен, если вы получите NullPointerException
при выполнении. Вам нужно добавить реализацию (например, Weld) или использовать Spring.
(3) См. ссылки выше.
Также взгляните на Различия между реализациями Java EE 6 CDI, чтобы получить ссылку на другие доступные реализации Java CDI.