这是我的JAVA学习笔记的第一篇,由于本身就不是写给外人看的,所以可能写的有些随意,而且由于水平有限还会出现一些个人的错误理解,欢迎无意中看到这一系列的高手指正,谢谢!
我当初开始学习JAVA,其实是直接从Spring开始啃的,因为草草扫了一遍JAVA的语法发现跟C#几乎是一摸一样,于是就跳过了。在加上之前对于设计模式也缺乏足够的了解,这也就导致了我学Spring的时候稍显吃力,所幸还是啃下来了。
本系列适用于已经对Spring有了初步了解,想要温故知新的同学。完全初学的估计看起来够呛,不过也可以先扫一遍,大概的了解一下,少走弯路。我会特别强调一下一些新手需要注意的东西,也是当初我初学的时候碰到过的问题。
第一篇,首先是Hello,World的预览
一、编写环境:
1、创建项目:
先是创建一个JAVA项目,如果用的J2EE版的,就直接创建一个Dynamyc Web项目好了,这里我用的是后者来示例。
2、添加依赖库:
这里要添加至少两个依赖库,一个是Spring.jar不用说了,还有一个是Spring的依赖库:spring-framework-2.5.6\lib\jakarta-commons\commons-logging.jar
如果不加这个库,获取ApplicationContext的时候就会报错,内容为:
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
...
...
我猜测是Spring库内置了log模块,依赖于commons-logging这个库,所以只加载Spring核心库是不行的。暂时没时间去深究这个,如果有精通Spring的大侠可以帮忙解惑一下的话感激不尽。
如果只是加载这两个库,其实已经是可以跑HelloWorld了,但是如果只是这样的话,运行的时候控制台会在运行结果出来之前先输出几行红色的LOG记录文字,比较烦人。
要是你像我一样觉得烦的话,可以再加载一个log4j库,这个库的文件路径为:
spring-framework-2.5.6\lib\log4j\log4j-1.2.15.jar
然后再在项目的src目录下新建一个log4j.properties文件,里面的内容为:
log4j.rootLogger=WARN, stdout, R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log
log4j.appender.R.MaxFileSize=100KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
# Print only messages of level WARN or above in the package com.foo.
log4j.logger.com.foo=WARN
关于log4j的详细介绍可以google一下,总之主要功能就是更方便的管理项目的log记录,很常用。
以上,这个Spring的HelloWorld编写环境都已经具备了,下面开始代码部分。
二、代码部分
1、新建一个action包,例如:com.iteye.bolide74.action
2、新建action类,例如HelloWorld
类的内容如下:
package com.iteye.bolide74.action;
public class HelloWorld {
public String msg;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
小技巧:set/get方法可以由eclipse自动生成:
例如先写一个类属性:public String msg;
然后快捷键Alt+Shift+s,跳出菜单里就有“生成Getter和Setter”,当然还有其他的方便功能都可以试一下
3、在/WebContent/WEB-INF目录下新建一个conf目录,在这个目录里新建一个config.xml文件
当然在项目根目录或者其他路径也都可以,不过一般推荐在WEB-INF目录下,因为这个目录对于web访问者来说是隐藏掉的,无法访问,这样安全性比较高。
conf目录名和config.xml文件名都可以自己随意写,不过一定要有命名规范。
config.xml的内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="HelloWorld" class="com.iteye.bolide74.action.HelloWorld">
<property name="msg">
<value>Hello,World!</value>
</property>
</bean>
</beans>
这里先简单介绍一下:这个XML的结构是固定的,功能有点类似于一个windows的注册表。
一个<bean>就相当于一个功能模块,可以把它想象成C++里的一个COM组件可能比较容易理解。
如果有多个bean就继续在<beans>根节点下加新的<bean>节点。bean的id可以随便写,但是class要对应某个功能模块的类的"路径",就是包+类名。
<property>节点顾名思义就是需要“注入”(注入概念稍后几章解释)的类属性,所以这里的name的值为"msg"。
<value>子节点自然就是代表了注入msg这个类属性的值。可以是任意字符串。
4、新建实现类包,例如com.iteye.bolide74.tester
5、新建实现类,例如HelloWorldTester,代码如下:
package com.iteye.bolide74.tester;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import com.iteye.bolide74.action.HelloWorld;
public class HelloWorldTester {
public static void main(String[] args) {
ApplicationContext ac = new FileSystemXmlApplicationContext(
"/WebContent/WEB-INF/conf/config.xml");
HelloWorld helloWorld = (HelloWorld) ac.getBean("HelloWorld");
System.out.println(helloWorld.getMsg());
}
}
PS:1)这里的"/WebContent/WEB-INF/conf/config.xml"为你的config.xml的路径,如果上面你改成你自己的了,这里的话也要相应的改掉。
2)获取这个XML不是只有FileSystemXmlApplicationContext这么一个方法,还有另外一个ClassPathXmlApplicationContext方法,区别在于一个是根据文件系统来找的,一个是根据ClassPath来找的,这个看方法名也就知道了,详细的以后再讲。
3)getBean("HelloWorld")方法里的参数"HelloWorld"即config.xml里那个bean的id,如果你改成了自己的,记得这里相对应的也要改掉!
6、编译运行,就可以看到控制台的输出结果:"Hello,World!"
小结:好玩的东西来了,当你想要让这个功能模块输出不同的结果时,就不用编写任何代码了,只需要修改config.xml文件里的那个<value>的值,就能直接输出修改后的值。
这样的话最明显的优势就在于,如果是一个很庞大的功能模块,我们想要得到不同的结果,就不需要重新编译这个程序,甚至不用打开eclipse等IDE工具,用个记事本修改一下这个XML相应的内容就行了。这对于一些编译一下都要很久的程序是很舒服的。
还有一个明显优势,就是在一些需要7*24小时服务的WEB服务上,可以实现修改功能的热插拔,也就是不需要暂停服务,只要改掉这个XML,无需重启就能马上改掉这个功能。牛B吧!
这两点也是为什么我不太提倡所谓零配置的“注解注入”的原因,这个以后再讲,这章就先这样吧,有兴趣可以改一下这几段代码,看看哪些是可以改的,哪些是不能改的,增强了解。
下一篇:Spring温故知新(二) IoC控制反转与DI依赖注入
http://bolide74.iteye.com/blog/998650
分享到:
相关推荐
SpringSpringSpring温故知新六AOP向切面程Spring温故知新六AOP向切面程
NULL 博文链接:https://bolide74.iteye.com/blog/1050199
spring cloud + openshift example
spring cloud config
常用的spring注解大全,适合新手学习、老手温故知新。读懂spring,平步青云。
温故知新ASP.NET 2.0(C#)温故知新ASP.NET 2.0(C#)温故知新ASP.NET 2.0(C#)温故知新ASP.NET 2.0(C#)温故知新ASP.NET 2.0(C#)
计算机小数表示.温故知新.pdf
数学:吃透课本温故知新.docx
机械军工行业:“温故知新”系列之工业机器人行业复盘(二):从美国汽车行业“2mm工程”看工业机器人国产化空间.pdf
初中语文文学讨论现当代文学温故知新
20210202-银河证券-“温故知新”系列之工业机器人行业复盘(二):从美国汽车行业“2mm工程”看工业机器人国产化空间.pdf
中信建设温故知新,从 4G 看 5G.rar
中信建设温故知新,从 4G 看 5G.pdf
行业报告---温故知新,从 4G 看 5G
复习知识整理文档,其中介绍了spring的知识和注意点,还包含面试中常被提及的知识,帮助你快速回忆和复习知识,温故知新
6.1.6 开始spring 2.5旅程—hello world 359 6.2 spring 2.5核心技术 364 6.2.1 bean工厂之beanfactory介绍 364 6.2.2 实用的bean工厂applicationcontext 365 6.2.3 spring 2.5配置文件详解 367 6.2.4 bean的...
通信行业:温故知新,从4G看5G-1202-中信建投-12页.pdf
ECMAScript 中最常见的一个问题是字符串连接的性能。与其他语言类似,ECMAScript 的字符串是不可变的,即它们的值不能改变。请考虑下面的代码: var str = "hello "; str += "world"; 实际上,这段代码在幕后执行的...
NULL 博文链接:https://macleo.iteye.com/blog/1045211
固定收益专题报告:温故知新,国债期货1903合约回顾与总结_国信证券-13页.pdf