2012-07-01 121 views
0

我有奇怪的情况。 我试图同时使用@Configuration的@Bean这种方式来创建新的bean:使用@Configuration时的NoSuchBeanDefinitionException

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; 

    } 

} 

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

,然后我的测试类是这样的:

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

    } 

我的applicationContext.xml看起来是这样的:

<?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> 

现在,当我跑了它在MyEclipse的直通主它的工作只是精细。但是当我上传到我在Linux上运行的独立应用程序时,我得到:

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

任何想法为什么它没有在那里工作?

谢谢。

回答

2

@Configuration指示类声明的一个或多个@Bean方法而@Bean创建具有相同的名称与@Bean注释的方法的名称的新豆。
在您的代码示例bean名称为createNewCar将创建为方法createNewCar()方法注释由@Bean

试试这个

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

很少有东西看

  1. 为什么注释CarBean类作为@Configuration?它不包含任何bean定义即。方法用@Bean注释。
  2. 为什么调用createNewCar()方法,因为它已经注释了@Bean? (让Spring完成它的工作)

入住这link它会帮助你熟悉@Configuration@Bean注解。

+0

那么我仍然不明白我做错了什么? – rayman

+0

您创建了一个'CarMaker'类型的bean并且名称为'createNewCar',并且您试图访问名为'CarMaker'的bean,该名称不存在。 – xyz

+0

为什么CarMaker不存在?它确实存在。我使用@Configuration – rayman

相关问题