Ho due fagioli spring come segue:
@Component("A") @Scope("prototype") public class A extends TimerTask { @Autowired private CampaignDao campaignDao; @Autowired private CampaignManager campManger; A(){ init_A(); } }
Devo creare un nuovo object di A con una nuova parola chiave, a causa di un codice legacy
@Component("B") @Scope("prototype") public class B{ public void test(){ A a = new A(); } }
quando Esegui -> i fagioli primaverili nella class A sono nulli, posso creare una nuova istanza del bean spring A e utilizzare ancora l’autowiring al suo interno?
Il tuo componente “A” non viene creato dal contenitore Spring, quindi le dipendenze non vengono iniettate. Tuttavia, se hai bisogno di supportare del codice legacy (come ho capito dalla tua domanda), puoi usare @Configurable
annotazione @Configurable
e la tessitura di build / compile time:
@Configurable(autowire = Autowire.BY_TYPE) public class A extends TimerTask { // (...) }
Quindi, Spring invierà le dipendenze autowired al componente A, indipendentemente dal fatto che sia istanziato dal contenitore stesso, o se viene istanziato in un new
codice legacy.
Ad esempio, per impostare la tessitura build-time con il plugin Maven devi:
al contesto dell’applicazione Spring nella sezione dei plugin di compilazione:
org.codehaus.mojo aspectj-maven-plugin 1.4 1.6 UTF-8 org.springframework spring-aspects warning compile test-compile
… e la sezione delle dipendenze:
org.springframework spring-aspects 3.1.1.RELEASE org.aspectj aspectjrt 1.6.11
Si prega di consultare il riferimento Spring per ulteriori dettagli: http://static.springsource.org/spring/docs/current/spring-framework-reference/html/aop.html#aop-atconfigurable
Poiché stai creando l’object della class A usando un nuovo operatore, non stai ottenendo i campi autowired in quell’object e trovandoli nulli. Cerca di prendere il fagiolo dal contenitore spring.
Spero che questo ti aiuti. Saluti.