2010-11-09 14 views
7

Mam zasobu (wiosną fasoli), który ma jedne z jego pól wstrzykiwane przez wiosnę, na przykład:Wiosna Injection - dostęp do zatłoczonego obiektu wewnątrz konstruktora

@Repository(value="appDao") 
public class AppDaoImpl implements AppDao { 
    @PersistenceContext 
    EntityManager entityManager; 

    public Resource() { 
     ... use entityManager ... // doesn't work 
    } 
} 

wiem, że nie mają dostępu wstrzyknięty entityManager w konstruktorze i powinien użyć adnotacji @PostConstruct na innej metodzie. Ale jakie są tego powody?

+0

mam kłopoty ze zrozumieniem pytanie: klasa jest AppDaoImpl ale mówisz zasobu () jest contructor? Resource() rzeczywiście ma składnię konstruktora, ale jego nazwa to diff. – jamesdeath123

Odpowiedz

14

Ponieważ Spring nie może uzyskać dostępu do żadnych pól ani metod przed utworzeniem obiektu (co odbywa się za pośrednictwem konstruktora). Więc Spring tworzy obiekt za pomocą konstruktora i , a następnie wstrzykuje właściwości.

Jedynym sposobem obejścia tego problemu jest użycie Constructor Injection (co może być uciążliwe, jeśli masz wiele zależności). Myślę, że to, co należy zrobić, to przenieść kod z konstruktora i do metody inicjalizacji za pomocą the @PostConstruct annotation:

@PostConstruct 
public void init(){ 
    // do stuff with entitymanager here 
} 
+0

+1, za bycie szybszym ode mnie :) – Bozho

4

Powodem jest w cyklu życia fasoli:

  • pojemnika (aplikacja wiosna kontekst) instancję obiektowi
  • następnie ustawia go wszystkie zależności (włącznie. na EntityManager w przykładzie)
  • po wszystkie zależności zostały ustawione, to wywołuje metodę @PostConstruct, jeśli w ogóle.

Sprężyna (i nikt) nie może ustawiać pól do obiektu przed jego faktycznym budowaniem.

Ty może użycie konstruktora wtrysku - przechodząc zależności do non-domyślnego konstruktora, ale nie jest to możliwe z @PersistenceContext

+4

To nie jest możliwe: '@Target ({TYPE, METHOD, FIELD})' –

Powiązane problemy