Spring是怎么来实例化配置文件中配置的对象呢?
构造方法:
以水果为例子:
水果接口 public interface Fruit { public void eat(); }
苹果实现类: public class Apple implements Fruit { public void eat() { System.out.println("吃苹果"); } }
配置文件: <?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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id="fruit" class="model.Apple" /> </beans>
Test类: public class Test { public static void main(String[] args) { ApplicationContext act = new ClassPathXmlApplicationContext("applicationContext.xml"); Fruit fruit = (Fruit)act.getBean("fruit"); fruit.eat(); } } |
这个时候我们可以看到可以成功运行, 接着我们修改苹果类:
public class Apple implements Fruit { private String name;
public Apple(String name) { super(); this.name = name; }
public void eat() { System.out.println("吃苹果"); } } 给苹果类添加了一个属性,和一个有参的构造方法,请再次运行Test文件,可以看到以下异常: Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'fruit' defined in class path resource [applicationContext.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [model.Apple]: No default constructor found; nested exception is java.lang.NoSuchMethodException: model.Apple.<init>() |
注意看: BeanCreationException 创建失败异常
No default constructor found:默认的构造没有找到
工厂方法: