NoSuchBeanDefinitionException al usar @Configuration

Tengo una situación rara. Traté de crear un nuevo bean mientras usaba @Configuration an @Bean de esta manera:

package com.spring.beans.ParkingCar;

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

@Configuration
public class CarMaker
{
    @Bean
    public CarBean createNewCar()
    {
        CarBean carBean=new CarBean();
        return carBean;

    }

}

paquete com.spring.beans.ParkingCar;

import org.apache.log4j.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class CarBean
{
    private int x = 3;
    static Logger logger = Logger.getLogger(CarBean.class);


    public void driveCar()
    {
        logger.debug("I am driving my car" + x);
    }
}

y luego mi clase de prueba se ve así:

public static void execute()
    {
        try
        {
            PropertyConfigurator.configure("log4j.properties");

            ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");


            CarMaker carMaker = (CarMaker) context.getBean("carMaker");
            CarBean carBean = carMaker.createNewCar();
            carBean.driveCar();
        }
        catch (Throwable e)
        {
            logger.error(e);
        }

    }

mi applicationContext.xml se ve así:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"


    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd
    http://www.springframework.org/schema/aop 
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">

    <!-- Must for auto wiring 
    <context:annotation-config />
    -->

    <context:component-scan
         base-package="com.spring.beans.ParkingCar">
   </context:component-scan>

    <aop:aspectj-autoproxy />

    <bean id="Spring3HelloWorldBean" class="com.spring.aspect.Spring3HelloWorld">
        <property name="myname" value="idan" />
    </bean>

    <bean id="SecurityAspect" class="com.spring.aspect.SecurityAspect">
    </bean>


    <bean id="CalculateStrategyBean" class="com.spring.beans.calculator.CalculateStrategyBean">
        <constructor-arg value="plus" />
    </bean>

    <bean id="CalculatorBean" class="com.spring.beans.calculator.CalculatorBean">
        <constructor-arg ref="CalculateStrategyBean" />
        <constructor-arg ref="CalculateNumbersHolderBean" />
    </bean>

    <bean id="CalculateNumbersHolderBean" class="com.spring.beans.calculator.CalculateNumbersHolderBean">
        <constructor-arg value="10" />
        <constructor-arg value="20" />
    </bean>



    <bean id="lisenceDrive" class="com.spring.beans.ParkingCar.LisenceDrive"
        p:carLisenceNum="333" p:isValidateCar="true" />

    <bean id="AmbulancelisenceDrive" class="com.spring.beans.ParkingCar.LisenceDrive"
        p:carLisenceNum="999" p:isValidateCar="false" />

    <bean id="TransitlisenceDrive" class="com.spring.beans.ParkingCar.LisenceDrive"
        p:carLisenceNum="111" p:isValidateCar="false" />


    <bean id="TransitVechileDetails" class="com.spring.beans.ParkingCar.VechileDetails"
        p:modelName="Transit-AS" p:numOfWheels="4" p:year="1992" />


    <!--  Wiring without annotations-->
    <!--

        <bean id="Ambulance"
        class="com.spring.beans.ParkingCar.FourWheelsVechile"
        p:modelName="GMC" p:numOfWheels="4" p:year="1997"
        p:lisenceDrive-ref="AmbulancelisenceDrive" /> <bean id="Bike"
        class="com.spring.beans.ParkingCar.TwoWheelsVechile" autowire="byName"
        p:modelName="T-BIRD" p:numOfWheels="2" p:year="2012" /> <bean
        id="Transit" class="com.spring.beans.ParkingCar.FourWheelsVechile"
        p:lisenceDrive-ref="TransitlisenceDrive" autowire="constructor">
    -->


    <bean id="Ambulance" class="com.spring.beans.ParkingCar.FourWheelsVechile"
        p:modelName="GMC" p:numOfWheels="4" p:year="1997" p:lisenceDrive-ref="AmbulancelisenceDrive" />

    <!--  Wiring with annotations

    <bean id="Bike" class="com.spring.beans.ParkingCar.TwoWheelsVechile"
        autowire="byName" p:modelName="T-BIRD" p:numOfWheels="2" p:year="2012" />



    <bean id="Transit" class="com.spring.beans.ParkingCar.FourWheelsVechile"
        p:lisenceDrive-ref="TransitlisenceDrive">
    </bean>
    -->

</beans>

Ahora, cuando lo ejecuté en MyEclipse a través de Main, funcionó bien. pero cuando lo cargué en mi aplicación independiente que se ejecuta en Linux, obtuve:

2012-07-01 14:11:21,152 com.spring.test.Spring3HelloWorldTest [ERROR] org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'carMaker' is defined

¿Alguna idea de por qué no funcionó allí?

Gracias.

preguntado el 01 de julio de 12 a las 15:07

1 Respuestas

@Configuration indica que una clase declara uno o más @Bean métodos mientras @Bean crea un nuevo bean que tiene el mismo nombre que el nombre del método anotado con @Bean .
En su bean de muestra de código con nombre createNewCar se creará como método createNewCar() el método está anotado por @Bean.

Prueba esta

CarBean carBean = (CarBean) context.getBean("createNewCar");
carBean.driveCar();   

Pocas cosas para mirar

  1. Por qué anotar la clase CarBean as @Configuration? No contiene ninguna definición de frijol, es decir. método con @Bean anotación.
  2. porque invocar createNewCar() método como ya está anotado con @Bean? (Deja que Spring haga su trabajo)

Mira esto aquí te ayudará a familiarizarte @Configuration y @Bean anotación.

Respondido 01 Jul 12, 15:07

Has creado un bean de tipo CarMaker y con nombre createNewCar y está tratando de acceder a bean con nombre CarMaker que no existen. - Ajinkya

¿Por qué CarMaker no existe? existe. Lo he anotado con @Configuration - Rayman

@Configuration no cree frijol. Revisa los enlaces en mi respuesta. - Ajinkya

Entonces, ¿cómo es que funcionó bien en MyEclipse? esto es del registro de MyEclipse Spring: 2012-07-01 17:42:53,737 org.springframework.beans.factory.support.DefaultListableBeanFactory [DEBUG] Devolviendo la instancia en caché de singleton bean 'carMaker' - Rayman

@rayman: Verifique mi respuesta actualizada y revise los enlaces mencionados. Has mezclado algunas cosas. - Ajinkya

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.