Primavera, trabajando con @Configuración y @Bean anotaciones

Tengo un código:

@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 se inicia la aplicación, el BeanSample.getSomeBean (), a continuación, SomeBean se comenzó a estar disponible por ‘someBean’.

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

De hecho, he punto de no comprender que la aplicación de contexto que debo utilizar para recoger mis frutos?

Sobre @De Configuración:

Alguna de las razones, ¿por qué debo utilizar @de Configuración de anotación aquí? (con este, mi IDE resalta mis clases como fuera Primavera-relacionados a continuación, por lo que debe tener sentido )

OK: después de que recibí una respuesta de mi código es este:

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

OriginalEl autor ses | 2012-10-11

3 respuestas

  1. 7

    Primero, si utiliza el Java de configuración, usted tiene que crear una instancia de su contexto como este:

    new AnnotationConfigApplicationContext(BeanSample.class)

    Segundo, el @Configuration anotación no hacer un bean de la clase que está anotado. Sólo el @Bean métodos se utilizan para crear los frijoles.

    Si quieres tener un BeanSample bean también, usted tiene que crear otro @Bean método que crea uno. Pero, de nuevo, ¿por qué quieres eso? Creo que el de un @Configuration de la clase debe ser utilizado sólo como el contenedor de configuración y no para otra cosa.

    Tercera, el valor predeterminado de frijol nombres para @Bean no sigue las convenciones de la propiedad de los captadores. El método de nombres que se usan directamente, es decir, en tu ejemplo, el frijol sería nombrado getSomeBean y no someBean. Cambiar el método a esto:

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

    Finalmente, el @Configuration de la clase no debe ser instanciado. Sus métodos sólo sirven para el propósito de la creación de los granos. Llega la primavera, a continuación, controlar su ciclo de vida, inyectar propiedades y así sucesivamente. En contraste, si se crea la instancia de la clase y llamar a los métodos directamente, los objetos devueltos serán sólo objetos normales que no tienen nada que ver con la Primavera.

    Ok, he cambiado mi pregunta.
    Y he cambiado mi respuesta. 😉
    ok. funciona. También moví BeanSample – a no ser interior. También, han proporcionado constructor predeterminado para BeanSample. Tratando de entender por qué necesito: @Configuración, a continuación,..
    Actualizado mi respuesta de nuevo. Básicamente, la Primavera de características como la inyección de dependencia sólo funciona si utiliza la clase como @Configuration y no crear instancias de ella directamente.
    Sí..ok. luego BeanSample no bean.. pero es accionado por resorte, si es con la Configuración.. veo. También se requiere: cglib para ser añadido a mi pom.xml (de lo contrario @de Configuración no está funcionando). [Voy a poner mi código como está en el post]. Gracias.

    OriginalEl autor rolve

  2. 6

    El grano producido por

    @Bean
    public SomeBean getSomeBean() 

    tendrá el nombre predeterminado, y ese es el nombre del método de productor getSomeBean

    Así que usted 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 he utilizado 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");
    }
    }

    De SALIDA:

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

    ¿Por qué debo utilizar @de Configuración de aquí? (He añadido esta pregunta en el post)
    Con el fin de marcar esta clase como el que configura el contexto de la primavera

    OriginalEl autor Ralph

  3. 4

    Su prueba debería tener este aspecto con @Configuration bean de configuración(lo que podría haber definido previamente el uso de un contexto archivo xml se define ahora el uso de su @de Configuración de código de java)

    Esto creará el contexto de una aplicación con BeanSample proporcionar el grano de configuración:

    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(BeanSample.class);

    Ahora, en su @Configuration:

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

    el bean name es el nombre del método..así que arriba el nombre del método es “someBean”, en el caso de que tuviese el bean nombre como “getSomeBean”

    Así que a buscar el grano que tiene que hacer:

    SomeBean bean = appContext.getBean("someBean", SomeBean.class);
    esta respuesta es buena. thx

    OriginalEl autor Biju Kunjummen

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *