2012-10-11 41 views
7

que tiene un código:primavera, se trabaja con @Configuration y anotaciones @Bean

@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"); 

    } 
} 

Estoy esperando, una vez que comience la aplicación, el BeanSample.getSomeBean(), entonces se inicia SomeBean que esté disponible a ' someBean '.

Bu ahora tengo un error: No se bean llamado 'someBean' se define

En realidad, no entiendo qué aplicación DOT-contexto que debe utilizar para recoger mis habas para arriba?

Sobre @Configuration:

Cualquier razón, ¿por qué debería usar @Configuration anotación aquí? (Con éste, mi IDE resalta mis clases por así decirlo relacionado Primavera-a continuación, por lo que debe tener sentido)

- bien: después de que consiguiera una respuesta de mi código es el siguiente:

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"); 

    } 

Respuesta

6

en primer lugar, si se utiliza la configuración de Java, se tiene que crear una instancia de su contexto como este:

new AnnotationConfigApplicationContext(BeanSample.class) 

en segundo lugar, la @Configuration anotación no tiene un grano fuera de la clase que está anotada. Solo los métodos @Bean se usan para crear beans.

Si desea tener también un bean BeanSample, debe crear otro método @Bean que cree uno. Pero, de nuevo, ¿por qué querrías eso? Creo que la clase @Configuration solo debe usarse como contenedor de configuración y no para otra cosa.

En tercer lugar, los nombres de beans predeterminados para @Bean no siguen las convenciones de los captadores de propiedades. Los nombres de los métodos se usan directamente, lo que significa que en su ejemplo, el bean se llamaría getSomeBean y no someBean. Cambiar el método para esto:

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

Por último, la clase @Configuration no debe ser instanciada. Sus métodos solo sirven para crear los beans. Spring manejará entonces su ciclo de vida, inyectará propiedades, etc. Por el contrario, si crea una instancia de la clase y llama directamente a los métodos, los objetos devueltos serán solo objetos normales que no tienen nada que ver con Spring.

+0

Ok, he cambiado mi pregunta entonces. – ses

+0

Y cambié mi respuesta. ;) – rolve

+0

bien. funciona. También moví BeanSample, no para ser interno. Además, he proporcionado el constructor predeterminado para BeanSample. Tratando de entender por qué necesito: @Configuration luego ... – ses

4

Su prueba debería tener este aspecto con @Configuration configuración de frijol (lo que se ha definido previamente utilizando un archivo XML contexto se define ahora usando el código Java @Configuration)

Esto creará un contexto de aplicación con BeanSample proporcionar la configuración de frijol:

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(BeanSample.class); 

Ahora, en su @Configuration:

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

el nombre del bean es el nombre del método ..por lo anterior el nombre del método es "someBean", en su caso, que tenía el nombre de frijol como "getSomeBean"

Así que para buscar el frijol que tiene que hacer:

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

esta respuesta es buena también. thx – ses

6

El grano producido por

@Bean 
public SomeBean getSomeBean() 

tendrá el nombre por defecto - y que es el nombre del método del productor getSomeBean

Por lo que puede hacer dos cosas

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

o

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

Algunos ejemplo completo Solía ​​AnnotationConfigApplicationContext en lugar de 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"); 

    } 
} 

SALIDA:

[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

¿Por qué debería usar @Configuration aquí? (He añadido esta pregunta a la publicación) – ses

+0

Para marcar esta clase como una que configura el contexto de primavera – Ralph

Cuestiones relacionadas