真是好久没有更博了,更博的初衷就是记录工作和学习中的点滴,长期积累,也算是一种资源财富的投资,想着是心里怪美的,但是真要是坚持下来,确实是一个不小的挑战。
进入新环境已经半个月了,接触了全新的项目,基于gis系统的研发。一开始真是云里雾里,后来博主那叫一个不放弃啊,每天都在问、都在自己摸索,用了一周的时间熟悉项目的数据架构和组织架构,又用了一周的时间熟悉业务,这个业务的熟悉是最痛苦的,比如:如何用对象去表示一个物体在时空领域内的唯一性?
我用必须是抽象的、不能简短的文字大概解答下上述的问题:
答:万物皆对象,这没毛病吧,放眼整个宇宙,我们分为时间领域和空间领域,合起来就是时空领域,用时空域表示一个对象按说已经很流弊了是不是,但是,这还不是唯一的,所以还需要给对象赋予不同的形态、属性、行为,比如我们拿一个静态的办公电脑PC来说:
PC诞生于公元前XXX年XX分XX秒XX毫秒,位于宇宙界银河系地球村XX国XX省XX市XXXX坐标(x,y,z),当然坐标可能是二维坐标也可能是三维立体坐标,还有可能更为复杂,这些描述对象的信息我们称作一个对象对应的时空域。
PC具有型号,名称、显示屏、机箱,鼠标,键盘等属性,形态呢就是显示屏和机箱是矩形立体的,鼠标是不规则弧面体,键盘是凸起的矩形框,行为呢,一个PC是静态的,因此它的行为是被动的,是外界给的,比如,我打开电脑,此时它就具有了上网,看电影、打游戏的行为
以上感觉没漏什么,但细想一下,确实还可以在加点什么,比如对象之间的关系,鼠标和显示屏是什么关系,这是内部关系,还有电脑在整个时空域中和其他对象的关系,比如电脑在一个办公室,它可能放在一个桌子上,那么桌子也是一个对象,那么电脑和桌子之间就存在一个关系,关系我们可以简单理解为组合关系,那就是电脑和桌子简单的组合成了一个办公环境........
沃吉玛,说不下去了,你可想而知,要想在地理系统上,表示一个对象,是需要多少信息去存储的啊,对了,你还要存储对象的生命周期,像svn版本管理器一样,记录每次对象操作的版本号,有了版本号,也就自然而然有了整个对象的完整生命周期,这就厉害了,放电影不就是这样吗,一个个动作帧处理,可以前进也可以倒退,那就是,不说了,所以说,地理信息系统的应用是很广泛的。
啰嗦了一堆,就是再强调一切皆对象,只要是对象,没有Java搞不定的!
一、Spring-Boot框架的搭建
官方强烈推荐:
选择Maven或Gradle构建Spring-Boot系统。
一如既往,使用Maven
(1)创建Maven Project,打包方式为Jar,其中POM文件结构图如下
(2)POM内容如下
pom.xml
4.0.0
com.appleyk
spring-boot-web
0.0.1-SNAPSHOT
Java-Web
org.springframework.boot
spring-boot-starter-parent
1.5.9.RELEASE
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-devtools
true
junit
junit
1.8
org.springframework.boot
spring-boot-maven-plugin
注意其中有一个很有用的功能,就是热部署,稍后做演示
(3)整个项目的目录结构如下
这里我不在做解释,稍后,每个文件都是干嘛的,会在注释里说明。
二、全局run函数入口
Application.java
package com.appleyk;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
*
* 下面是一个典型的结构:
com
+- example
+- myproject
+- Application.java -- 注意这个位置,习惯性的放在项目的一开始,也就是根包的第一层
| +
- domain
| +- Customer.java
| +- CustomerRepository.java
| +
- service
| +- CustomerService.java
| +
- web
+- CustomerController.java
* 文件将声明 main 方法, 还有基本的 @Configuration
*
* @author [email protected]
* @date 2017年12月1日08:46:41
*/
// @Configuration
// @EnableAutoConfiguration
@SpringBootApplication //// same as @Configuration @EnableAutoConfiguration @ComponentScan
public class Application {
/**
* SpringApplication类提供了一种从main()方法启动Spring应用的便捷方式。 在很多情况下, 你只需委托给
* SpringApplication.run这个静态方法:
* @param args
*/
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
三、全局属性配置文件
application.properties
#SpringApplication将从以下位置加载application.properties文件, 并把它们添加到Spring Environment中:
#1. 当前目录下的一个/config子目录
#2. 当前目录
#3. 一个classpath下的/config包
#4. classpath根路径(root)
#这个列表是按优先级排序的(列表中位置高的将覆盖位置低的) 。
#注:你可以使用YAML('.yml') 文件替代'.properties'
本篇暂未用到任何配置
四、POJO类--搭建基础数据
(1)Person.java【抽象父类】
package com.appleyk.pojo;
/**
* 每个人都有共有的年龄和性别属性
* @author [email protected]
* @date 2017年12月1日-上午9:40:13
*/
public abstract class Person {
private int age;//年龄
private String sex;//性别
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
(2)User.java【子类】
package com.appleyk.pojo;
/**
* 简单用户实体类:JavaBean
* 继承自抽象类Person,得到父类的年龄和性别属性
* @author [email protected]
* @blob http://blog.csdn.net/appleyk
* @date 2017年12月1日-上午8:50:05
*/
public class User extends Person {
private int uID; // 用户ID
private String uName; // 用户名
private String uPwd; // 用户密码
private int uRole; // 用户角色 1:普通用户 2:超级管理员
public User(int ID, String Name, String Pwd, int Role) {
this.uID = ID ;
this.uName = Name;
this.uPwd = Pwd ;
this.uRole = Role;
}
public int getuID() {
return uID;
}
public void setuID(int uID) {
this.uID = uID;
}
public String getuName() {
return uName;
}
public void setuName(String uName) {
this.uName = uName;
}
public String getuPwd() {
return uPwd;
}
public void setuPwd(String uPwd) {
this.uPwd = uPwd;
}
public int getuRole() {
return uRole;
}
public void setuRole(int uRole) {
this.uRole = uRole;
}
//输出【out】对象时,调用对象的toString,打印相关信息
public String toString(){
return "ID:"+uID+",Name:"+uName+",Role:"+uRole;
}
}
五、Service层--简单Hello业务接口的创建和实现
(1)HelloService.java
package com.appleyk.service;
/**
* 多构建interface,多构建abstract ,降低项目各模块间的耦合度
*/
public interface HelloService {
String sayHello(String name);
}
(2)HelloServiceImpl.java
package com.appleyk.service.Impl;
import org.springframework.stereotype.Service;
import com.appleyk.service.HelloService;
@Service
public class HelloServiceImpl implements HelloService {
@Override
public String sayHello(String name) {
return "Hello World! come from "+name;
}
}
六、Controller类--简单Hello控制类的Service调用
HelloController.java
package com.appleyk.controller;
import javax.websocket.server.PathParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.appleyk.service.HelloService;
/**
* Hello控制器--第一个Spring-boot项目的入口点
* @author [email protected]
* @blob http://blog.csdn.net/appleyk
* @date 2017年12月1日-上午9:18:43
*/
@RestController //same as @Controller + @ResponseBody
@RequestMapping("/rest/v1.0.1/appleyk") //restful风格的api接口
public class HelloController {
@Autowired
private HelloService helloService;
@RequestMapping("/hello")
public String HelloWorld(@PathParam("name") String name){
return helloService.sayHello(name);
}
}
七、启动项目
(1)启动
(2)大写的Spring,It's cool !
八、API接口测试【Controller测试】
(1)浏览器测试
(2)API测试工具测试
九、Spring-Boot热部署测试
(1)修改HelloServiceImpl.java内容如下
(2)Ctrl+S,立马见效
A.
B.工具验证一下
十、Java8新特性,stream流的简单操作,很实用
(1)单元测试类
StreamTest.java
package com.appleyk.Java8.feature.test;
import java.io.PrintStream;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import org.junit.Test;
import com.appleyk.pojo.User;
public class StreamTest {
@Test
public void Test01() throws Exception {
List users = Arrays.asList(
new User(5, "appleyk", "123456", 2),
new User(1, "kobe" , "k521" , 1),
new User(3, "James" , "J521" , 1),
new User(4, "Oven" , "O521" , 1),
new User(2, "Kuri" , "kr521" , 1)
);
// Java8中提供了Stream流对象对集合的操作,并作出了极大的简化
// 1.流遍历,获取每个user对象的用户名
PrintStream out = System.out;
users.stream().forEach(user -> {
String name = user.getuName();
out.println(name);
});
System.out.println("<><<><><<><><><><><><><><><><><>");
// 2.流遍历,根据uID排序,并打印排序后的用户信息
users.stream().map(User::toString).sorted().forEach(System.out::println);
System.out.println("<><<><><><><><><><><><><><><><><>");
// 3.流遍历,取得用户id,并将取得的id收集【collect】起来,由收集器【Collectors】转化为list集合返回
List uids = users.stream().map(User::getuID).collect(Collectors.toList());
for (Integer id : uids) {
System.out.print(id + "\t");
}
System.out.println("\n<><<><><<><><><><><><><><><><><>");
//4.流遍历筛选,只保存超级管理员的用户信息[role = 2的代表超级管理员,1的是普通用户]
List managers = users.stream().filter(user->user.getuRole()==2).collect(Collectors.toList());
System.out.println("超级管理员的个数是:"+managers.size());
}
}
(2)测试结果亮瞎眼
本篇到这算是简单的串了一下整个项目,后续还会持续对Spring-Boot进行探究,总之,使用Spring-Boot框架,你会发现做web项目很轻松,很愉悦,而在项目中结合java8新特性,stream和lambda对数据集进行操作,简直效率到爆表,这一块,我还在充电中,后续会记录。