/ Závislosť vstrekovania v konštruktore - java, spring, jsf, závislosť-injekcia

Závislosť vstrekovania v konštruktore - java, spring, jsf, závislosť-injekcia

Predpokladajme, že mám triedy jarnej služby alebo fazuľa JSF. Tieto triedy spájam v inej triede. Momentálne nie sú žiadne problémy. Môžem použiť tieto injektované polia v akejkoľvek metóde.

Ale ich použitie v konštruktérovi mi dáva NullPointerException.

Je pravdepodobné, že konštruktér beží predtým, ako dôjde k injekčnému zásahu, a nevidí moje injektované polia. Existuje nejaké riešenie na použitie závislého vstrekovania v konštruktore?

odpovede:

3 pre odpoveď č. 1

Je zrejmé, že v objekte nie je možné vpísať nič, ak tento objekt neexistuje. A existuje, musí byť postavený objekt.

Pružina podporuje vstrekovanie konštruktora:

@Autowired
public SomeService(SomeDependency dep) {
...

Jar podporuje aj @PostConstruct, čo umožňuje inicializáciu fazule po tom, čo boli všetky závislosti pridané.

Neviete o JSF.


3 pre odpoveď č. 2

Nie, nemôžete odkazovať na vložené polia v priečinkukonštruktér. Rámec musí váš objekt konštruovať nejakým spôsobom (zavolajte konštruktora) a následne vstreknúť závislosť tak, aby boli prázdne počas vykonávania konštruktéra. To, čo zvyčajne robíte, namiesto toho platí @PostConstruct anotáciu k jednému z vašich metód a vykonanie inicializácie tam:

class MyBean {
@Inject
private MyDependency myDep;

@PostConstruct
public void init() {
assert myDep != null;
}
}

V prípade jarnej konfigurácie xml môžete použiť init-method="init" namiesto @PostConstruct vo vašom <bean> Definícia. Prípadne môžete použiť injektor konštruktora v xml:

<bean id="myBean" class="my.package.MyBean">
<constructor-arg ref="myDependency/>
</bean>

alebo ekvivalent anotácie.