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ď č. 1Je 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.