如何从Constructor访问@Value注释变量?

San*_*Lee 2 java spring annotations spring-mvc spring-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;
        }

        //....
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我自动装配这样的@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]));
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我不想手动启动.我可以在构造函数中启动它吗?还是其他任何选择?

Boz*_*zho 8

@PostConstruct在你的init()方法上使用- 只要对象在spring上下文中,它就会被spring调用,这意味着如果它的依赖关系将被注入,那么它就会被调用.