2016-04-02 12 views
2

Ich habe ein einfaches Projekt, wo ich die Methode CarDaoImpl::save von Main::runApp ausführen möchte. Ich habe Klasse mit @Configration Annotation, aber meine @Autowired Feld ist null und ich bekomme NullPointerException, weil Config-Klasse nicht geladen, wie ich dieses Problem beheben?Annotation - Wie laden Spring Konfigurationsklasse?

public class Main { 

    @Autowired 
    private CarDao carDao; 

    //psvm(){} 

    public void runApp(){ 
     carDao.save(new Car()); //carDao is null 
    } 
} 

Konfigurationsklasse

@Configuration 
public class BeanInit { 

    @Bean 
    public CarDao carDao(){ 
     return new CarDaoImpl(); 
    } 
} 

Dank!

+0

Wie und wo machst du Main-Klasse eine Feder Managed Bean? – gmaslowski

+0

Ich mache diese Klasse nicht als federgeführte Bohne, wie mache ich das? –

+0

Wie erwarten Sie dann, dass @Autowired funktioniert? Initialisieren Sie die Main-Klasse wie eine Frühlingsbohne auf die gleiche Weise, wie Sie CarDao initialisiert haben. – gmaslowski

Antwort

1

Sie können einen Konstruktor zu Main hinzufügen, wo Sie eine neue AnnotationConfigApplicationContext erstellen und dann diesen Kontext verwenden, um das Objekt zu initiieren.

public class Main { 

    @Autowired 
    private CarDao carDao; 

    public Main() { 
     ApplicationContext ctx = new AnnotationConfigApplicationContext(BeanInit.class); 
     ctx.getAutowireCapableBeanFactory().autowireBean(this); 
    } 

    //psvm(){} 

    public void runApp(){ 
     carDao.save(new Car()); //carDao is null 
    } 
} 

Bitte beachten Sie, dass dies nicht Main eine Spring-verwalteten Bohne machen. Wenn Sie z. B. @Transactional oder andere aspektorientierte Annotationen zu Methoden in Main hinzufügen, hat dies keinerlei Auswirkungen.

Ich könnte eine bessere Idee sein, den Aufrufer von Main :: runApp den Anwendungskontext initiieren lassen und Main eine Spring Managed Bean zu sein, indem Sie es in die Konfiguration aufnehmen. Sie könnten dann ctx.getBean(Main.class) verwenden, um die Bean abzurufen.

+0

Ich kann Variante finden, das Problem zu lösen, ohne 'getBean' zu verwenden. Wenn XML-Konfigurationsdatei in mvc verwenden - getBean nicht verwendet, weil .xml beim Bauprojekt laden, wie macht es auf nicht mvc-Projekt? –

Verwandte Themen