项目结构:
源代码如下:
1 package com.bean; 2 public interface Person { 3 public void Speak(); 4 }
1 package com.bean; 2 public class AmericanImpl implements Person { 3 private String name; 4 private int age; 5 6 public String getName() { 7 return name; 8 } 9 public void setName(String name) { 10 this.name = name; 11 } 12 public int getAge() { 13 return age; 14 } 15 public void setAge(int age) { 16 this.age = age; 17 } 18 19 @Override 20 public void Speak() { 21 // TODO Auto-generated method stub 22 System.out.println("I'm American,My name is" + this.name + ",I'm" + this.age + " years old!"); 23 } 24 }
-
1 package com.bean; 2 public class ChineseImpl implements Person { 3 private String name; 4 private int age; 5 6 public String getName() { 7 return name; 8 } 9 public void setName(String name) { 10 this.name = name; 11 } 12 public int getAge() { 13 return age; 14 } 15 public void setAge(int age) { 16 this.age = age; 17 } 18 @Override 19 public void Speak() { 20 // TODO Auto-generated method stub 21 System.out.println("I'm Chinese,My name is" + this.name + ",I'm" + this.age + " years old!"); 22 } 23 }
-
1 package com.spring; 2 import org.springframework.context.ApplicationContext; 3 import org.springframework.context.support.ClassPathXmlApplicationContext; 4 import com.bean.Person; 5 public class Test { 6 public static void main(String[] args) { 7 // TODO Auto-generated method stub 8 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); 9 Person person = (Person)context.getBean("chinese"); 10 person.Speak(); 11 person = (Person)context.getBean("american"); 12 person.Speak(); 13 } 14 }
applicationContext.mxl 是在 src 的目录下,文件代码如下:
<?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-3.2.xsd ">
<!-- 配置 Chinese实例,其实现类为com.bean.ChineseImpl -->
<bean id="chinese" class="com.bean.ChineseImpl">
<property name="name">
<value>小明</value>
</property>
<property name="age">
<value>10</value>
</property>
</bean>
<bean id="american" class="com.bean.AmericanImpl">
<property name="name">
<value>Tom</value>
</property>
<property name="age">
<value>15</value>
</property>
</bean>
</beans>
下面问题来了:
遇到问题1:
上面的代码是正确的,我之前由于是用 eclipse 配置的 spring-beans-3.2.xsd;
然后我创建 xml 时引用 xsd,elipse 生成的代码如下,缺少了上面黄色部分的代码:
<?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 "> </beans> 其余代码正确,会报如下错误:
Exception in thread "main" org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 1 in XML document from class path resource [applicationContext.xml] is invalid; nested exception is org.xml.sax.SAXParseException; systemId: http://www.springframework.org/schema/beans/; lineNumber: 1; columnNumber: 55; 在 publicId 和 systemId 之间需要有空格。
……
Caused by: org.xml.sax.SAXParseException; systemId: http://www.springframework.org/schema/beans/; lineNumber: 1; columnNumber: 55; 在 publicId 和 systemId 之间需要有空格。
……
这些 jar 包都是必须的,缺一不可;
Spring开发一定会引入下面这两个 jar 包:
pring-core.jar:
这个jar文件包含Spring框架基本的核心工具类,Spring其它组件要都要使用到这个包里的类,是其它组件的基本核心,当然你也可以在自己的应用系统中使用这些工具类
这个jar文件包含Spring框架基本的核心工具类,Spring其它组件要都要使用到这个包里的类,是其它组件的基本核心,当然你也可以在自己的应用系统中使用这些工具类
spring-beans.jar:
这个jar文件是所有应用都要用到的,它包含访问配置文件、创建和管理bean以及进行Inversion of Control / Dependency Injection(IoC/DI)操作相关的所有类。
这个jar文件是所有应用都要用到的,它包含访问配置文件、创建和管理bean以及进行Inversion of Control / Dependency Injection(IoC/DI)操作相关的所有类。
如果应用只需基本的IoC/DI支持,引入spring-core.jar及spring- beans.jar文件就可以了。
下面问题来了,缺了会报什么错呢?
ApplicationContext cannot be resolved to a type
ClassPathXmlApplicationContext cannot be resolved to a type
这是因为缺少了
spring-context.jar:
这个jar文件为Spring核心提供了大量扩展。可以找到使用Spring ApplicationContext特性时所需的全部类,JDNI所需的全部类,UI方面的用来与模板(Templating)引擎如 Velocity、FreeMarker、JasperReports集成的类,以及校验Validation方面的相关类
这个jar文件为Spring核心提供了大量扩展。可以找到使用Spring ApplicationContext特性时所需的全部类,JDNI所需的全部类,UI方面的用来与模板(Templating)引擎如 Velocity、FreeMarker、JasperReports集成的类,以及校验Validation方面的相关类
加入这三个jar包之后,运行报如下错误:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
……
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
……
这是因为缺少了
commons-logging-1.2.jar
Apache Commons包中的一个,包含了日志功能,必须使用的jar包。
Apache Commons包中的一个,包含了日志功能,必须使用的jar包。
现在加入了四个 jar 包,运行报如下错误:
Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/expression/PropertyAccessor
……
Caused by: java.lang.ClassNotFoundException: org.springframework.expression.PropertyAccessor
……
这是因为缺少了
spring-expression.jar:Spring表达式语言
好了,现在终于可以运行得到结果了:
渣渣就得在 Bug 中挣扎!