2012-10-11 7 views
7

mam kod:Wiosna, współpracując z @Configuration i @Bean adnotacji

@Configuration 
public class BeanSample { 

    @Bean(destroyMethod = "stop") 
    public SomeBean someBean() throws Exception { 
     return new SomeBean("somebean name1"); 
    } 


    class SomeBean { 

     String name; 

     public SomeBean(String name) { 
      this.name = name; 
     } 

     public void stop() { 
      System.out.println("stop"); 
     } 
    } 

    public static void main(String[] args) throws Exception { 

     BeanSample beanSample = new BeanSample(); 
     SomeBean someBean1 = beanSample.someBean(); 

     ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(
       new String[] {"appContext.xml"}); 

     SomeBean someBean2 = (SomeBean) appContext.getBean("someBean"); 

     if (someBean1 == someBean2) System.out.println("OK"); 

    } 
} 

Czekam, gdy zacznę aplikacji, BeanSample.getSomeBean(), a następnie SomeBean jest uruchamiany będzie dostępna " someBean ".

Bu teraz mam błąd: Nie fasoli nazwie „someBean” definiuje

Właściwie nie dot zrozumieć, które app-kontekst należy użyć do pick up moje fasolę?

O @Configuration:

jakichkolwiek powodów, dlaczego warto stosować tutaj @Configuration adnotacji? (Z tego, mój IDE podkreśla moje zajęcia niejako Wiosna związane potem, więc powinno sensu)

- OK: po Dostałem odpowiedź mój kod wygląda następująco:

public static void main(String[] args) throws Exception { 

     AnnotationConfigApplicationContext appContext = new AnnotationConfigApplicationContext(BeanSample.class); 

     SomeBean someBean2 = (SomeBean) appContext.getBean("someBean"); 

     if (someBean2 != null) System.out.println("OK"); 

    } 

Odpowiedz

6

po pierwsze, jeśli używasz config Java, trzeba instancji kontekstu tak:

new AnnotationConfigApplicationContext(BeanSample.class) 

drugie, @Configuration adnotacji nie ma fasoli z klasy, która jest adnotacjami. Do tworzenia komponentów bean używane są tylko metody @Bean.

Jeśli chcesz mieć również fasolkę BeanSample, musisz utworzyć inną metodę @Bean, która ją utworzy. Ale znowu, dlaczego miałbyś chcieć? Myślę, że klasa @Configuration powinna być używana tylko jako kontener konfiguracji, a nie do niczego innego.

Po trzecie, domyślne nazwy fasoli dla @Bean nie są zgodne z konwencjami getload właściwości. Nazwy metod są używane bezpośrednio, co oznacza, że ​​w twoim przykładzie komponent bean będzie miał nazwę getSomeBean, a nie someBean. Zmiana metody to:

@Bean(destroyMethod = "stop") 
public SomeBean someBean() throws Exception { 
    return new SomeBean("somebean name1"); 
} 

Wreszcie klasa @Configuration nie powinno być instancja. Jego metody służą jedynie do tworzenia fasoli. Wiosna będzie obsługiwać ich cykl życia, właściwości wstrzykiwania i tak dalej. W przeciwieństwie do tego, jeśli utworzymy instancję klasy i wywołamy metody bezpośrednio, zwrócone obiekty będą zwykłymi obiektami, które nie mają nic wspólnego ze sprężyną.

+0

OK, zmieniłem wtedy moje pytanie. – ses

+0

I zmieniłem odpowiedź. ;) – rolve

+0

ok. to działa. Ja również przeniosłem BeanSample - nie żeby być wewnętrznym. Pod warunkiem, domyślny konstruktor BeanSample. Próbuję zrozumieć, dlaczego potrzebuję: @ Konfiguracja, a następnie .. – ses

4

test powinien wyglądać z @Configuration konfiguracji Bean (co byś uprzednio zdefiniowanego za pomocą pliku XML jest teraz kontekst zdefiniowany za pomocą @Configuration kod Java)

Stworzy to kontekst aplikacji z BeanSample dostarczaniu konfiguracja fasola:

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(BeanSample.class); 

teraz, w swojej @Configuration:

@Bean 
public SomeBean someBean() throws Exception { 
    return new SomeBean("somebean name1"); 
} 

nazwa fasoli jest nazwą metody.tak nad nazwą metody jest „someBean”, w przypadku, gdy miał nazwę fasoli jako „getSomeBean”

więc zajrzeć do fasoli trzeba zrobić:

SomeBean bean = appContext.getBean("someBean", SomeBean.class); 
+0

ta odpowiedź jest również dobra. thx – ses

6

Fasola produkowane przez

@Bean 
public SomeBean getSomeBean() 

będzie miał nazwę domyślną - i to jest nazwa metody producenta getSomeBean

Więc można zrobić dwie rzeczy

@Bean 
public SomeBean getSomeBean() {...} 
... 
SomeBean bean = (SomeBean) appContext.getBean("getSomeBean"); 
if (bean != null) System.out.println("OK"); 

lub

@Bean(name="someBean") 
public SomeBean getSomeBean() {...} 
... 
SomeBean bean = (SomeBean) appContext.getBean("someBean"); 
if (bean != null) System.out.println("OK"); 

Niektóre pełny przykład kiedyś AnnotationConfigApplicationContext zamiast ClassPathXmlApplicationContext

import java.util.Arrays; 

import org.springframework.context.annotation.AnnotationConfigApplicationContext; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 

@Configuration 
public class BeanSample { 

    @Bean(name="someBean") 
    public SomeBean getSomeBean() throws Exception { 
     return new SomeBean("somebean name1"); 
    } 

    class SomeBean { 

     String name; 

     public SomeBean(final String name) { 
      this.name = name; 
     } 

     public void stop() { 
      System.out.println("stop"); 
     } 
    } 

    public static void main(final String[] args) throws Exception { 

     AnnotationConfigApplicationContext appContext = new AnnotationConfigApplicationContext(BeanSample.class); 

     BeanSample beanSample = (BeanSample) appContext.getBean("beanSample"); 

     //next time use this to have a look at the beans in the context! 
     System.out.println(Arrays.toString(appContext.getBeanDefinitionNames())); 

     SomeBean bean = (SomeBean) appContext.getBean("someBean"); 
     if (bean != null) System.out.println("OK"); 

    } 
} 

wyjściowych:

[org.springframework.context.annotation.internalConfigurationAnnotationProcessor, org.springframework.context.annotation.internalAutowiredAnnotationProcessor, org.springframework.context.annotation.internalRequiredAnnotationProcessor, org.springframework.context.annotation.internalCommonAnnotationProcessor, org.springframework.context.annotation.internalPersistenceAnnotationProcessor, beanSample, org.springframework.context.annotation.ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor#0, someBean] OK

+0

Dlaczego powinienem używać tutaj @Configuration? (Dodałem to pytanie do wpisu) – ses

+0

Aby zaznaczyć tę klasę jako taką, która konfiguruje kontekst sprężyny – Ralph

Powiązane problemy