2016-04-02 9 views
2

私はrunメソッドCarDaoImpl::saveからMain::runAppまでの簡単なプロジェクトを持っています。 @Configration注釈付きのクラスがありますが、@Autowiredフィールドがnullで、NullPointerExceptionが発生します。設定クラスがロードされないため、この問題をどのように修正しますか?annotation - Springのコンフィグレーションクラスをロードするには?

public class Main { 

    @Autowired 
    private CarDao carDao; 

    //psvm(){} 

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

Configurationクラス

@Configuration 
public class BeanInit { 

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

ありがとう!

+0

メインクラスをSpring管理Beanにする方法と場所を教えてください。 – gmaslowski

+0

私はこのクラスを春の管理された豆にしません。 –

+0

それで@Autowiredはどのように動作すると思いますか? CarDaoを初期化したのと同じ方法で、MainクラスをSpring Beanとして初期化します。 – gmaslowski

答えて

1

新規にAnnotationConfigApplicationContextを作成したコンストラクタをMainに追加し、そのコンテキストを使用してオブジェクトを開始できます。

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 
    } 
} 

これはMain春はBeanを管理することはありませんのでご注意ください。例えば、@Transactionalまたはその他のアスペクト指向の注釈をMainのメソッドに追加すると、まったく効果がありません。

Main :: runAppの呼び出し元にアプリケーションコンテキストを開始させ、MainをSpringの管理対象Beanにすることを構成に含めることをお勧めします。その後、ctx.getBean(Main.class)を使用してBeanを取得できます。

+0

私は変種が 'getBean'を使わずに問題を解決できることがわかります。プロジェクトのビルド中に.xmlが読み込まれたため、mvc-getBeanの.xml設定ファイルを使用しないと、どのようにmvcプロジェクトではないのですか? –

関連する問題