Spring Java - 自动装配 - 在类路径资源中定义名称创建bean时出错

时间:2016-09-05 17:04:13

标签: spring autowired setter constructor-injection

我是春季java的初学者。我正在学习自动装配,但是我发现了一个错误“在类路径资源中定义了名为'theFirstTraveler'的bean创建错误。”如何解决这个错误?在我的源代码下面。

感谢。

此致

巴比

的beans.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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.2.xsd">

    <bean id="theFirstTraveler" class="com.tobuku.impl.Traveler">
        <constructor-arg ref="car"/>        

        <property name="origin" value="Jakarta"/>
        <property name="destination" value="Surabaya"/>
    </bean>

    <bean id="theSecondTraveler" class="com.tobuku.impl.Traveler">
        <property name="car" ref="theOtherCar"/>

        <property name="origin" value="Surabaya"/>
        <property name="destination" value="Bandung"/>
    </bean>     

    <bean id="theThirdTraveler" class="com.tobuku.impl.Traveler" autowire="byName">
        <property name="origin" value="Bandung"/>
        <property name="destination" value="Semarang"/>
    </bean> 

    <bean id="theFourthTraveler" class="com.tobuku.impl.Traveler" autowire="constructor">
        <property name="origin" value="Sukabumi"/>
        <property name="destination" value="Jogja"/>
    </bean> 

    <bean id="TheMercedes" class="com.tobuku.impl.Car">

        <constructor-arg type="java.lang.String">
            <value>Mercedes-Benz</value>
        </constructor-arg>

        <constructor-arg type="java.lang.String">
            <value>S-Class S550 4MATIC</value>
        </constructor-arg>

        <constructor-arg type="java.lang.String">
            <value>4.7L V8 Twin Turbocharger</value>
        </constructor-arg>

        <constructor-arg type="java.lang.String">
            <value>Automatic 7-Speed</value>
        </constructor-arg>          

        <constructor-arg type="java.lang.String">
            <value>Gasoline</value>
        </constructor-arg>          

        <property name="motion" value="My Human spirit is moving to the future..."/>

    </bean>

    <bean id="TheBmw" class="com.tobuku.impl.Car">

        <constructor-arg type="java.lang.String">
            <value>BMW</value>
        </constructor-arg>

        <constructor-arg type="java.lang.String">
            <value>7 Series 740Li</value>
        </constructor-arg>

        <constructor-arg type="java.lang.String">
            <value>3.0L I6</value>
        </constructor-arg>

        <constructor-arg type="java.lang.String">
            <value>Automatic 8-Speed</value>
        </constructor-arg>          

        <constructor-arg type="java.lang.String">
            <value>Gasoline</value>
        </constructor-arg>          

        <property name="motion" value="I am moving with pleasure. What an ultimate experience..."/>

    </bean>

App.java

package com.tobuku.common;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.tobuku.impl.Traveler;

public class App 
{
    public static void main( String[] args )
    {
        ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");

        // First Traveler
        Traveler firstTraveler = (Traveler) context.getBean("theFirstTraveler");

        System.out.println(firstTraveler);
        firstTraveler.showCar();
        firstTraveler.startJourney();

        System.out.println("====================================================");

        // Second Traveler
        Traveler secondTraveler = (Traveler) context.getBean("theSecondTraveler");

        System.out.println(secondTraveler);
        secondTraveler.showCar();
        secondTraveler.startJourney();

        System.out.println("====================================================");        

        // Third Traveler
        Traveler thirdTraveler = (Traveler) context.getBean("theThirdTraveler");

        System.out.println(thirdTraveler);
        thirdTraveler.showCar();
        thirdTraveler.startJourney();

        System.out.println("====================================================");         

        // Fourth Traveler
        Traveler fourthTraveler = (Traveler) context.getBean("theFourthTraveler");

        System.out.println(fourthTraveler);
        fourthTraveler.showCar();
        fourthTraveler.startJourney();

        System.out.println("====================================================");             

        Vehicle carMercy = (Vehicle) context.getBean("TheMercedes");
        Vehicle carBmw = (Vehicle) context.getBean("TheBmw");

        System.out.println(carMercy);
        carMercy.move();

        System.out.println("-----------------------------------------------------------");

        System.out.println(carBmw);
        carBmw.move();

    }
}

Traveler.java

package com.tobuku.impl;

import com.tobuku.common.Vehicle;

public class Traveler {

    private Vehicle car;
    private String origin;
    private String destination;

    public Traveler(){
        origin = "";
        destination
        = "";
    }

    public Traveler(Vehicle car){
        System.out.println("**** Constructor is called ****");
        this.car = car;
    }

    public Vehicle getCar() {
        return car;
    }

    public void setCar(Vehicle car) {
        System.out.println("**** Setter is called ****");
        this.car = car;
    }

    public String getOrigin() {
        return origin;
    }

    public void setOrigin(String origin) {
        this.origin = origin;
    }

    public String getDestination() {
        return destination;
    }

    public void setDestination(String destination) {
        this.destination = destination;
    }

    @Override
    public String toString(){
        return "Traveler [origin=" + origin + 
                "; destination=" + destination + "]";
    }

    public void showCar(){
        System.out.println(car);
    }

    public void startJourney(){
        car.move();
    }

}

Car.java

package com.tobuku.impl;

import com.tobuku.common.Vehicle;

public class Car implements Vehicle {

    private String brand;
    private String type;
    private String engine;
    private String transmission;
    private String fuel;
    private String motion;

    public Car(){
        brand = "";
        type = "";
        engine = "";
        transmission = "";
        fuel = "";
    }

    public Car(String brand, String type, String engine, String transmission, String fuel){

        this.brand = brand;
        this.type = type;
        this.engine = engine;
        this.transmission = transmission;
        this.fuel = fuel;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getEngine() {
        return engine;
    }

    public void setEngine(String engine) {
        this.engine = engine;
    }

    public String getTransmission() {
        return transmission;
    }

    public void setTransmission(String transmission) {
        this.transmission = transmission;
    }

    public String getFuel() {
        return fuel;
    }

    public void setFuel(String fuel) {
        this.fuel = fuel;
    }

    public String getMotion() {
        return motion;
    }

    public void setMotion(String motion) {
        this.motion = motion;
    }

    public String toString(){

        return "Car [brand=" + brand + 
                "; type=" + type + 
                "; engine=" + engine + 
                "; transmission=" + transmission + 
                "; fuel=" + fuel + "]";

    }

    public void move(){
        System.out.println(motion);
    }

}

Vehicle.java

package com.tobuku.common;

public interface Vehicle {
    void move();
}

日志

Sep 05, 2016 11:29:56 PM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@4d405ef7: startup date [Mon Sep 05 23:29:56 ICT 2016]; root of context hierarchy
Sep 05, 2016 11:29:56 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [Beans.xml]
Sep 05, 2016 11:29:56 PM org.springframework.context.support.ClassPathXmlApplicationContext refresh
WARNING: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'theFirstTraveler' defined in class path resource [Beans.xml]: Cannot resolve reference to bean 'car' while setting constructor argument; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'car' is defined
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'theFirstTraveler' defined in class path resource [Beans.xml]: Cannot resolve reference to bean 'car' while setting constructor argument; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'car' is defined
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:359)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108)
    at org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:648)
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:145)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1143)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1046)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:776)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:861)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
    at com.tobuku.common.App.main(App.java:12)
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'car' is defined
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:702)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1180)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:284)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:351)
    ... 17 more

1 个答案:

答案 0 :(得分:0)

问题是你尝试创建一个bean,它具有引用Car的依赖项,但是你没有像这样的名字的bean。尝试将TheMercedes bean提供给theFirstTraveler。如果这没有帮助,请向我们提供整个堆栈跟踪。