Рассмотрим следующий сценарий:
public class Car {
@Inject
private Engine engine;
public Car() {
engine.initialize();
}
...
}
Так как экземпляр Car должен быть создан до внедрения поля, во время выполнения конструктора механизм точки инжекции все еще равен нулю, что приводит к исключению NullPointerException.
Эту проблему можно решить либо с помощью Инъекции зависимостей JSR-330 для Java , либо с помощью общих аннотаций JSR 250 для аннотации метода Java @PostConstruct.
@ PostConstruct
JSR-250 определяет общий набор аннотаций, который был включен в Java SE 6.
Аннотация PostConstruct используется для метода, который должен быть
выполняется после внедрения зависимости для выполнения любого
инициализация. Этот метод ДОЛЖЕН быть вызван до помещения класса
в сервис. Эта аннотация ДОЛЖНА поддерживаться всеми классами, которые
поддержка внедрения зависимости.
JSR-250 гл. 2.5 javax.annotation.PostConstruct
Аннотация @PostConstruct позволяет определять методы, которые будут выполняться после создания экземпляра и выполнения всех инъекций.
public class Car {
@Inject
private Engine engine;
@PostConstruct
public void postConstruct() {
engine.initialize();
}
...
}
Вместо выполнения инициализации в конструкторе код перемещается в метод, аннотированный @ PostConstruct.
Обработка методов после конструирования - это простой поиск всех методов, аннотированных @PostConstruct, и их последовательный вызов.
private void processPostConstruct(Class type, T targetInstance) {
Method[] declaredMethods = type.getDeclaredMethods();
Arrays.stream(declaredMethods)
.filter(method -> method.getAnnotation(PostConstruct.class) != null)
.forEach(postConstructMethod -> {
try {
postConstructMethod.setAccessible(true);
postConstructMethod.invoke(targetInstance, new Object[]{});
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
throw new RuntimeException(ex);
}
});
}
Обработка методов после конструирования должна выполняться после завершения создания экземпляра и внедрения.