HelloShiyanlou 与松耦合的实现
一、实验介绍
1.1 实验内容
本节实验将带你入门简单的 Maven 项目创建和如何实现松耦合。
1.2 实验知识点
- Maven 介绍
- Spring 松耦合
1.3 实验环境
- JDK1.7
- Eclipse JavaEE
二、项目文件结构
三、 实验步骤
3.1 实验环境介绍
3.1.1 Maven 简介
在项目开始之前,我们先来了解一下Maven相关知识。
Maven 是一个项目管理和综合工具。Maven 提供了开发人员构建一个完整的生命周期框架。开发团队可以自动完成项目的基础工具建设,Maven 使用标准的目录结构和默认构建生命周期。
在多个开发团队环境时,Maven 可以设置按标准在非常短的时间里完成配置工作。由于大部分项目的设置都很简单,并且可重复使用,Maven 让开发人员的工作更轻松,同时能够创建报表,检查、构建和测试自动化设置。
Maven提供了开发人员的方式来管理:
- Builds
- Documentation
- Reporting
- Dependencies
- SCMs
- Releases
- Distribution
- mailing list
概括地说,Maven简化和标准化项目建设过程,处理编译,分配,文档,团队协作和其他任务的无缝连接。 Maven增加可重用性并负责建立相关的任务。
3.1.2 Maven 环境搭建
请打开实验环境桌面上的 Xfce ,输入:
wget http://labfile.oss.aliyuncs.com/courses/33/apache-maven-3.3.9-bin.tar.gz
获取 Maven 最新安装包。 然后解压,继续输入:
tar -zvxf apache-maven-3.3.9-bin.tar.gz
接下来,部署,继续输入:
sudo gedit /etc/profile
用 gedit 编辑器打开 profile 文件,修改 Path 。
在 profile 文件的最后输入:
#set Maven environment
export MAVEN_HOME=/home/shiyanlou/apache-maven-3.3.9
export PATH=${MAVEN_HOME}/bin:${PATH}
设置好 MAVEN_HOME 和 PATH 之后,保存退出。
然后输入:
source /etc/profile
使操作立即生效。
至此,此 Maven 安装完成,继续输入:
mvn -v
显示如图,则安装成功。
3.1.3 导入 Maven 项目所需的包
由于 Maven 新建项目需要很多包,首先会扫描本地仓库,如果没有则需要联网,在中央仓库下载到本地仓库。我们已经把本次项目需要的包已经打包传到服务器上,现在,我们只需要从实验楼下载所要的包,并安放到正确的位置即可。
仍旧在 Xfce 中,输入:
wget http://labfile.oss.aliyuncs.com/courses/33/res.tar.gz
然后,解压:
tar -zvxf res.tar.gz
解压完成后,生成的 .M2 文件夹和之前我们解压的 apache-maven-3.3.9 同在目录: /home/shiyanlou/
下。已知,默认的 maven 本地仓库在 /home/shiyanlou/.m2/
下。(作业:由何处可以看出本地仓库的默认路径?)所以我们解压好的文件正好覆盖源 .m2
文件夹。 .m2
文件夹的默认是隐藏文件夹,若要查看,请点击 视图
,点击: 显示隐藏文件
。如图:
3.2 创建 Maven 工程
打开 eclipse ,鼠标右键新建,other ,如图:
在里面可以找到 Maven 选项卡,点击 Maven Project , 点击 Next ,如图:
选择默认的工程位置如图:
点击 Next。
创建普通的 maven 工程,选择如图:
点击 Next 。
填写:
- Group Id:项目的组织机构,也是包的目录结构,一般都是域名的倒序,比如
com.shiyanlou.demo
; - Atifact Id :项目实际的名字,比如 spring3-Example ;
- Packaging :可在 Group Id 后加
.Atifact Id
; - Version :项目版本号比如
1.0-SNAPSHOT
。
这三个选项对应于自动生成的 pom 文件中相应的配置。如图:
最后点击 Finish ,创建完成。
3.3 代码编写
3.3.1 创建 pom.xml
打开项目的 pom.xml ,进行Spring部署,如图:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.shiyanlou.demo</groupId>
<artifactId>spring3-Example</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>spring3-Example</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- Spring3 deploy -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.0.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.0.9.RELEASE</version>
</dependency>
</dependencies>
</project>
实际上,Maven 使用这三个值来唯一指定一个项目。引用一个库文件也是通过这三个值来确定所引用的库及其版本号,比如本例引用最新的 junit 库版本为 3.8.1. 此时假定 junit 还需引用其它库, Maven 自动管理而无需在 pom 文件中指定。
3.3.2 创建 HelloWorld.java
接下来,我们在项目名上右键再创建一个 Spring bean,首先创建一个包,包名为 com.shiyanlou.demo.helloworld
:
再在该包内创建一个类,类名为 HelloWorld:
并将 HelloWorld.java 编辑如下:
package com.shiyanlou.demo.helloworld;
public class HelloWorld{
private String name;
public void setName(String n){
this.name=n;
}
/*
*创建打印Hello方法
*/
public void printHello(){
System.out.println("The first Spring 3:hello"+name);
}
}
3.3.3 创建 SpringBeans.xml
我们先在 src/main/
下新建一个 Folder,命名为 resources
,如图所示:
现在可以开始创建 Spring Bean 配置文件,创建文件 SpringBeans.xml ,配置 bean 如下。文件位于 src/main/resources
下。
编辑 SpringBeans.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-3.0.xsd">
<bean id="helloBean" class="com.shiyanlou.demo.helloworld.HelloWorld">
<property name="name" value="shiyanlou" />
</bean>
</beans>
3.3.4 创建测试 App
在 com.shiyanlou.demo.spring3_Example
包下创建一个类,类名为 App:
package com.shiyanlou.demo.spring3_Example;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.shiyanlou.demo.helloworld.HelloWorld;
public class App {
private static ApplicationContext context;
public static void main( String[] args )
{
context = new ClassPathXmlApplicationContext("SpringBeans.xml");
HelloWorld obj = (HelloWorld) context.getBean("helloBean");
obj.printHello();
}
}
3.3.5 作为 java application 运行
结果如下:
至此,helloworld 程序便成功完成!
3.4 松耦合的目的
上一部分,我们已经创建了 Maven 项目,打印出了 HelloShiyanlou 。为了方便,我使用上面的工程, pom.xml 文件一致,不必修改。下面,我们实验证明 Spring 的松耦合。假设项目需要输出到 CVS 或者 JSON 。实验效果如图: 输出 CVS :
输出 JSON :
3.5 松耦合代码编写
3.5.1 IOutputGenerator.java
创建 com.shiyanlou.demo.loosely_coupled
包,新建一个一个 IOutputGenerator 接口:
接口内容如下:
package com.shiyanlou.demo.loosely_coupled;
public interface IOutputGenerator {
public void generateOutput();
}
3.5.2 CsvOutputGenerator.java
CVS 输出,实现了IOutputGenerator 接口。同样的步骤,步骤如下:
内容如下:
package com.shiyanlou.demo.loosely_coupled;
public class CsvOutputGenerator implements IOutputGenerator {
public void generateOutput() {
System.out.println("Creating CsvOutputGenerator Output......");
}
}
3.5.3 JsonOutputGenerator.java
JSON 输出,实现了 IOutputGenerator 接口,步骤如下:
内容如下:
package com.shiyanlou.demo.loosely_coupled;
public class JsonOutputGenerator implements IOutputGenerator {
public void generateOutput() {
System.out.println("Creating JsonOutputGenerator Output......");
}
}
3.6 用 Spring 依赖注入调用输出
用 Spring 的松耦合实现输出相应的格式。
首先在 com.shiyanlou.demo.loosely_coupled
包内创建一个需要用到输出的类 OutputHelper.java ,内容如下:
package com.shiyanlou.demo.loosely_coupled;
public class OutputHelper {
IOutputGenerator outputGenerator;
public void generateOutput(){
this.outputGenerator.generateOutput();
}
public void setOutputGenerator(IOutputGenerator outputGenerator){
this.outputGenerator = outputGenerator;
}
}
3.7 创建一个 spring 配置文件
此文件用于依赖管理 src/main/resources
下创建配置文件 Spring-Output.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-3.0.xsd">
<bean id="OutputHelper" class="com.shiyanlou.demo.loosely_coupled.OutputHelper">
<property name="outputGenerator" ref="CsvOutputGenerator" />
</bean>
<bean id="CsvOutputGenerator" class="com.shiyanlou.demo.loosely_coupled.CsvOutputGenerator" />
<bean id="JsonOutputGenerator" class="com.shiyanlou.demo.loosely_coupled.JsonOutputGenerator" />
</beans>
3.8 App.java
此文件用于通过 Spring 调用相应的 output ,内容如下:
package com.shiyanlou.demo.spring3_Example;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.shiyanlou.demo.loosely_coupled.OutputHelper;
public class App {
private static ApplicationContext context;
public static void main( String[] args )
{
context = new ClassPathXmlApplicationContext(new String[] {"Spring-Output.xml"});
OutputHelper output = (OutputHelper)context.getBean("OutputHelper");
output.generateOutput();
}
}
现在,已经实现了松耦合,当需要输出改变时,不必修改任何代码 .java 文件,只要修改 Spring-Output.xml 文件 <property name="outputGenerator" ref="CsvOutputGenerator" />
中的 ref 值,就可以实现输出不同的内容,不修改代码就减少了出错的可能性。
实验目录:
3.9 运行结果
当 Spring-Output 如下时:
<bean id="OutputHelper" class="com.shiyanlou.demo.loosely_coupled.OutputHelper">
<property name="outputGenerator" ref="CsvOutputGenerator" />
</bean>
运行结果为:
当 Spring-Output 如下时:
<bean id="OutputHelper" class="com.shiyanlou.demo.loosely_coupled.OutputHelper">
<property name="outputGenerator" ref="JsonOutputGenerator" />
</bean>
运行结果为:
四、实验总结
本节介绍了 HelloWorld 的 spring 简单项目,并简单介绍了松耦合的概念。下一节我们将进入 IoC 容器的学习。
五、课后习题
由何处可以看出本地仓库的默认路径?
六、参考链接
本课程后续实验基于博客园 leiOOlei 博文制作,内容由原作者 leiOOlei 授权实验楼使用。
from: https://www.shiyanlou.com/courses/578/labs/1923/document