2013-03-07 3 views
7

Próbuję wykonać jednorazową inicjalizację mojej aplikacji internetowej. Potrzebuję singleton dla klasy ApplicationListener, więc ustawiłem zakres na Singleton, ale tworzy wiele instancji. Ten BootStrapper nie jest zdefiniowany w żadnych innych plikach konfiguracyjnych xml. Wiem, że domyślnym zakresem jest singleton, ale musiałem dodać @Scope ("singleton"), ponieważ nie był to singleton. Nawet z tą adnotacją nadal tworzy wiele instancji. Oto mój ApplicationListener.Klasa publiczna @Component @Scope ("singleton") klasy BootStrapper implementuje ApplicationListener <ContextStartedEvent> {

@Component 
@Scope("singleton") 
public class BootStrapper implements ApplicationListener<ContextRefreshedEvent> { 

Czy brakuje mi czegoś?

+1

Domyślny zakres jest Singleton – Ralph

+0

Jaki jest twój problem? "ale to nie działa" nie jest poprawnym opisem żadnego (nie nazwanego) problemu! – Ralph

+0

Dzięki, zaktualizowałem pytanie. –

Odpowiedz

5

Aby mieć wywołanie zwrotne, które jest wywoływane po zainicjowaniu komponentu bean, należy użyć @PostConstruct.

@Component 
public class BootStrapper() { 

    @PostConstruct 
    public void doSomething() { 
      System.out.println("I am initalized!"); 
    } 
} 
+0

Prawdopodobnie odnosisz się do javax.annotation.PostConstruct (nie PostCreate) . Ponadto do metody "doSomething" należy dodać typ zwrotu. – Fredrik

+0

@Fredrik - masz rację - naprawiłem to – Ralph

0

Spróbuj tak:

@Configuration 
public class TestService 
{ 
    private Properties properties; 

    @Bean 
    @Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON) 
    public Properties getAppProperties() 
    { 
    try 
    { 
     if (properties == null) 
     { 
      properties = ServiceUtils.loadProperties(); 
     } 
    return properties; 
    } 
    catch (Exception e) 
    { 
     LOGGER.logCaughtException("Exception Occured while loading App Properties.", e); 
    } 
    } 
}