Rozważmy następujący scenariusz:
public class Car {
@Inject
private Engine engine;
public Car() {
engine.initialize();
}
...
}
Od samochodów musi być instancja przed wstrzyknięciem pola, silnik punkt wtrysku jest jeszcze zerowa podczas wykonywania konstruktora, w wyniku NullPointerException.
Ten problem można rozwiązać za pomocą JSR-330 Dependency Injection for Java wstrzyknięcia konstruktora lub wspólnych opisów JSR 250 dla adnotacji metody Java @PostConstruct.
@PostConstruct
JSR-250 tworzy wspólny zestaw opisów, przewidziany Java SE 6.
PostConstruct adnotacja jest używana w sposób, który musi być wykonany po zależność wtrysk odbywa się wykonywać żadnych inicjalizacji. Ta metoda MUSI zostać wywołana zanim klasa zostanie umieszczona w serwisie jako . Ta adnotacja MUSI być obsługiwana we wszystkich klasach, które obsługują wtrysk zależności od obsługi.
JSR-250 Rozdz. 2,5 javax.annotation.PostConstruct
@PostConstruct Adnotacja pozwala na określenie metod być wykonane po przykład został załadowany i wszystkie wtryskuje zostały przeprowadzone.
public class Car {
@Inject
private Engine engine;
@PostConstruct
public void postConstruct() {
engine.initialize();
}
...
}
Zamiast wykonywać inicjalizację w konstruktorze, kod jest przenoszony do metody opatrzonej adnotacją @PostConstruct.
Przetwarzanie metod post-konstruktowych jest prostą sprawą znalezienia wszystkich metod opatrzonych adnotacją @PostConstruct i ich wywoływaniem po kolei.
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);
}
});
}
Po wykonaniu instancji i wstrzyknięciu należy wykonać przetwarzanie metod postkonstrukcyjnych.
Odniosłem wrażenie, że wstrzyknięcie konstruktora było na ogół preferowane, aby zezwalać zależnościom na "końcowe". Biorąc pod uwagę ten wzór, dlaczego '@ PostConstruct' jest dodawany do J2EE - na pewno widzieli inny przypadek użycia? – mjaggard