使用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。