Инъекция зависимостей в автономном приложении 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.