使用idea搭建javaEE项目,这里没有把lib放入WEB-INF纯属个人喜好,但得注意在配置Artifacts得注意把lib配置到WEB-INF下面去,否则会报找不到类的错误。
项目启动后,若能访问index.jsp则项目配置正常。
项目启动后:按照spring,springmvc,spring+mybatis,的顺序进行学习。
spring测试:
1.引入spring包:
编写测试类:
package com.aa;
public class One {
private String a;
private String b;
public String getA() {
return a;
}
public void setA(String a) {
this.a = a;
}
public String getB() {
return b;
}
public void setB(String b) {
this.b = b;
}
}
package com.aa;
public class Two {
private One o;
public void setO(One o) {
this.o = o;
}
}
添加 app-context.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.xsd">
<bean id="one" class="com.aa.One">
<property name="a" value="this a of one"></property>
<property name="b" value="this b of one"></property>
</bean>
<bean id="two" class="com.aa.Two">
<property name="o" ref="one"></property>
</bean>
</beans>
编写测试代码,进行测试。
package com.aa.test;
import com.aa.One; import com.aa.Two; import
org.springframework.context.ApplicationContext; import
org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {
public static void main(String[] a){ ApplicationContext ac = new ClassPathXmlApplicationContext("app-context.xml"); One one=(One)ac.getBean("one"); Two two=(Two)ac.getBean("two"); }
}
测试结果如下:
根据测试结果看,代码正常运行,在配置过程中出了不少问题,然后接下来记录每一步出问题的地方:
1.jar包不全,当引入
spring-beans-4.3.7.RELEASE.jar
spring-context-4.3.7.RELEASE.jar
spring-core-4.3.7.RELEASE.jar
后 ,尝试运行test,但是报错:
Exception in thread “main” java.lang.NoClassDefFoundError:
org/apache/commons/logging/LogFactory at
org.springframework.context.support.AbstractApplicationContext.(AbstractApplicationContext.java:161)
at
org.springframework.context.support.AbstractApplicationContext.(AbstractApplicationContext.java:225)
at
org.springframework.context.support.AbstractRefreshableApplicationContext.(AbstractRefreshableApplicationContext.java:88)
at
org.springframework.context.support.AbstractRefreshableConfigApplicationContext.(AbstractRefreshableConfigApplicationContext.java:58)
at
org.springframework.context.support.AbstractXmlApplicationContext.(AbstractXmlApplicationContext.java:61)
at
org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:136)
at
org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:83)
at com.aa.test.Test.main(Test.java:12) at
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497) at
com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Caused by: java.lang.ClassNotFoundException:
org.apache.commons.logging.LogFactory at
java.net.URLClassLoader.findClass(URLClassLoader.java:381) at
java.lang.ClassLoader.loadClass(ClassLoader.java:424) at
sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) at
java.lang.ClassLoader.loadClass(ClassLoader.java:357) … 13 more
这里发现spring本身需要依赖org.apache.commons.logging.LogFactory,引入:
commons-logging-1.1.3.jar
该包应当是spring用于记录日志所用,后面在项目中应该和其他日志框架结合起来进行日志的管理,该处需要后面再深入学习。
再次测试,依然报错:
Exception in thread “main” java.lang.NoClassDefFoundError:
org/springframework/expression/ParserContext at
org.springframework.context.support.AbstractApplicationContext.prepareBeanFactory(AbstractApplicationContext.java:629)
at
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:517)
at
org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:139)
at
org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:83)
at com.aa.test.Test.main(Test.java:12) at
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497) at
com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Caused by: java.lang.ClassNotFoundException:
org.springframework.expression.ParserContext at
java.net.URLClassLoader.findClass(URLClassLoader.java:381) at
java.lang.ClassLoader.loadClass(ClassLoader.java:424) at
sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) at
java.lang.ClassLoader.loadClass(ClassLoader.java:357) … 10 more
发现缺少org.springframework.expression.ParserContext,引入
spring-expression-4.3.7.RELEASE.jar
该包看字面意思应该是spring表达式相关,后面再深入学习。
当引入
commons-logging-1.1.3.jar
spring-beans-4.3.7.RELEASE.jar
spring-context-4.3.7.RELEASE.jar
spring-core-4.3.7.REL EASE.jar
spring-expression-4.3.7.RELEASE.jar
后,测试正常。
以上 最基础的spring,应该差不多这样。
以注解的方式,测试代码
在lib中添加
spring-aop-4.3.7.RELEASE.jar
当在没有这个包的时候,测试会报错
Exception in thread “main” org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from class path resource [app-context.xml]; nested exception is java.lang.NoClassDefFoundError: org/springframework/aop/TargetSource
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:414)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:336)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:181)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:217)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:188)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:252)
at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:127)
at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:93)
at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:129)
at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:613)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:514)
at org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:83)
at com.aa.test.Test.main(Test.java:12)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Caused by: java.lang.NoClassDefFoundError: org/springframework/aop/TargetSource
at org.springframework.context.annotation.AnnotationConfigUtils.registerAnnotationConfigProcessors(AnnotationConfigUtils.java:154)
at org.springframework.context.annotation.AnnotationConfigBeanDefinitionParser.parse(AnnotationConfigBeanDefinitionParser.java:47)
at org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:74)
at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1411)
at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1401)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:172)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:142)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:94)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:508)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:392)
… 19 more
Caused by: java.lang.ClassNotFoundException: org.springframework.aop.TargetSource
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
… 29 more
,同时修改app-context.xml
在id=”two”的bean中删除了*property name=”o” ref=”one”
增加context:annotation-config
同时修改代码
package com.aa;
import org.springframework.beans.factory.annotation.Autowired; import
org.springframework.stereotype.Component;public class Two {
@Autowired private One o; public void setO(One o) { this.o = o; } }
增加 @Autowired
测试可以正常运行。
删除app-context.xml中的
同时修改代码
package com.aa;
import org.springframework.beans.factory.annotation.Autowired; import
org.springframework.stereotype.Component;@Component
public class Two {@Autowired private One o; public void setO(One o) { this.o = o; } }
增加@Component,但是运行的时候,代码报错,找不到bean。
修改app-context.xml ,删除
context:annotation-config
增加
context:component-scan base-package=”com.aa”
context:annotation-config 和context:component-scan base-package=”com.aa”是有差别的,查阅网上资料。 前者是用于激活那些已经在spring容器里注册过的bean;后者是包含前者功能的同时还可以在指定的package下扫描以及注册javabean。