`
bolide74
  • 浏览: 83301 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Spring温故知新(一)Hello,World!

阅读更多
这是我的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


5
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics