2017-07-12 2 views
0

すべてのファイルがtomという名前のパッケージにあるとします。@ConfigurationクラスのBeanは常にnullですか?

A.java

@AllArgsConstructor 
public class A { 
    public int x; 
} 

Teztt.java

@Configuration 
public class Teztt { 
    @Bean 
    public A getA() { 
     return new A(56); 
    } 
    public void print() { 
     System.out.println("Hello world"); 
    } 
} 

Tezt.java

public class Tezt { 
    @Autowired 
    public Teztt teztt; 
} 

Tezt.xml

<bean class="tom.Teztt" /> 
<bean id="idTezt" class="tom.Tezt" /> 

Runner.java

public class Runner { 

    public static void main(String[] args) { 
     ApplicationContext context = new ClassPathXmlApplicationContext("tom/Tezt.xml"); 
     Tezt t = (Tezt) context.getBean("idTezt"); 
     if(t.teztt == null) { 
      System.out.println("NPE"); 
     } 
    } 
} 

上記の出力はNPEです。私の質問は、null以外の値を持つオブジェクトのTezttを取得したいです。春にこのことをする方法はありますか、それともいつもnullになりますか?助けてください。

+2

XMLを使用する場合、xml設定(もちろん適切な名前空間)に ''を追加するためにSpringに注釈を使用するように指示する必要があります。 –

答えて

1

クラスTeztはそのメンバー "公共Tezttのtezttを" 初期化しないので、 nullでないtezttを持つ理由はありません。 Textszクラス内のteztt要素を初期化するか、init()などのメソッドを追加し、実行時環境でspring beanの設定を変更します。たとえば、

public class Tezt { 
    @Autowired 
    public Teztt teztt = new Teztt(); 
} 

ただし、この方法では決して停止しません。

XML豆内部のinitメソッドの使用:

public class Tezt { 
    public void init() { 
     this.teztt = new Tezt(); 
    } 
... 

<bean id="idTezt" class="tom.Tezt" init-method="init" /> 

をこれは秒後に停止します。

+0

@Autowired 公共Tezttのteztt =新しいTeztt();本当に? – NikNik

1

編集:あなたのxmlにあなたが挿入する必要があります。

<context:annotation-config/> 

を、あなたのBeanを宣言する必要があります:

@Configuration 
public class Config{ 
    @Bean 
    public Teztt getTeztt(){ 
     return new Teztt(); 
    } 

    @Bean 
    public A getA() { 
     return new A(56); 
    } 
} 
+0

コンテキスト=新しいClassPathXmlApplicationContext( "tom/Tezt.xml");すべてのBeanを登録します。なぜそれを明示的に行うのですか? –

+1

お待ちください、構成クラスをautowiringしています。間違っています。 – NikNik

+0

AuthConfiguration内の関数を使用する必要があります。 –

関連する問題