3

プロパティファイルの値を持つBeanを作りたいです。私はこのようなものを作りました:

@Component
public class MainNavs implements Iterable<Nav>{
    @Value("${newshome.navs.names}")
    String[] names;

    @Value("${newshome.navs.ids}")
    String[] ids;

    final private List<Nav> navs = new ArrayList<Nav>();

    public MainNavs() throws Exception {            
        for (int i = 0; i < names.length; i++) {
            navs.add(new Nav(names[i], ids[i]));
        }
    }

    public Iterator<Nav> iterator() {
        Iterator<Nav> n = navs.iterator();
        return n;
    }

    public class Nav {      
        private String name;
        private String id;
        private String imageNumber;

        public Nav(String name, String id, String imageNumber) {
            this.name = name;
            this.id = id;
        }

        //....
    }
}

しかし、このように自動配線@Autowired MainNavs navs;すると、コンストラクターでそれらにアクセスしようとしたときに と が開始されなかったためNullPointerExceptionに発生します。namesids

みたいなメソッドを作っinit()て、それで始めようとしたら、何の問題もありませんでした。

public init() throws Exception {            
    for (int i = 0; i < names.length; i++) {
        navs.add(new Nav(names[i], ids[i]));
    }
}

ただし、手動で開始したくありません。コンストラクターで開始できますか? または他の代替手段はありますか?

4

3 に答える 3

9

@PostConstructメソッドで使用init()- オブジェクトがSpringコンテキスト内にあるとすぐにSpringによって呼び出されます。つまり、その依存関係が注入される場合はすべてです。

于 2011-08-31T06:35:00.653 に答える
2

考えてみてください。Spring が Bean に何かを注入するには、最初に作成する必要があり、コンストラクターがジョブを完了するまで作成されません。リストを遅延して作成するか、Spring インターフェイス InitializingBean を実装することができます。あなたの場合

public class MainNavs implements Iterable<Nav>, InitializingBean {
...
public void afterPropertiesSet() throws Exception {            
    for (int i = 0; i < names.length; i++) {
        navs.add(new Nav(names[i], ids[i]));
    }
}
于 2011-08-31T06:43:42.603 に答える
0

回避策として、次のようなファクトリ パターンを使用できます。

public class MainNavs implements Iterable<Nav>{

  // ...

  public init() throws Exception {            
      for (int i = 0; i < names.length; i++) {
          navs.add(new Nav(names[i], ids[i]));
      }
  }

  public static MainNavs createInstance() throws Exception {
    MainNavs result = new MainNavs();
    return result.init();
  }
}
于 2011-08-31T06:35:26.120 に答える