2011-08-31 8 views
1

속성 파일에서 값을 가진 bean을 만들고 싶습니다. 나는 이런 식으로 뭔가 만들어 :Constructor에서 @Value 주석 변수에 어떻게 액세스합니까?

@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; 같은 autowire하기 때, 그것은 생성자들에 액세스하려고 할 때 namesids 때문에 시작되지 않은 NullPointerException한다.

init()과 같은 방법을 사용하여 시작하려고하면 아무런 문제가 없습니다.

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

그러나 수동으로 시작하고 싶지는 않습니다. 생성자에서 초기화 할 수 있습니까? 또는 다른 대안?

+0

귀하는 사용하는 스프링의 버전을 지정하고 귀하의 질문에 컨텍스트 xml (계시 분)을 추가해야합니다. 이 http://forum.springsource.org/showthread.php?69602-Value-and-PropertyPlaceholderConfigurer도 도움이 될 수 있습니다 (차이점 btw'# {...}'및'$ {...}') –

답변

5

init() 메서드에서 @PostConstruct을 사용하십시오. 객체가 스프링 컨텍스트 내에있는 즉시 스프링에 의해 호출됩니다. 즉, 객체가 스프링 컨텍스트 내부에있는 경우 모두 호출되며, 이는 해당 종속성이 주입되는 경우 모두를 의미합니다.

+0

대답. 내 하루를 구했다. – minion

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(); 
    } 
} 
2

그것에 대해 생각 : 봄이 여러분의 빈에 뭔가를 주입하기 위해, 먼저 작성해야하고, 그것을하지 않습니다 생성자가 작업을 마칠 때까지 생성됩니다. 느슨하게 목록을 만들거나 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])); 
    } 
} 
+1

'InitializingBean'은 괜찮습니다.하지만 주석 접근 방식을 사용하고있는 것 같아 @PostConstruct를 제안했습니다. – Bozho

+0

예, 동의합니다. 주석을 기억할 수 없습니다 ;-) –

관련 문제