从零开始写类似Spring和SpringBoot的框架
Toy-Spring
简介
快速链接
源码下载 https://gitee.com/fencer911/toy-spring
1. ToySpring是一款轻量级 类SpringBoot框架,模仿spring,spring mvc ,SpringBoot 参考了部分代码
- 内置 IOC、MVC 等特性
- 和spring boot类似,集成tomcat 但没实现spring boot 的自动配置功能
- 基于 Servlet 3.0 规范
- 使用 Java 注解取代 XML 配置 可以使用Configuration,Bean注解配置java bean
2. 对开发新手来说,可以借此了解学习研究真的Spring框架
- 基于 学习目的创造次轮子,Spring的代码太容易让人头晕
- mvc模块使用了很多Spring里的接口,但实现做了大幅的改造简化
- 持续增加一些类SpringBoot里的特性,但立足于简洁明了
入门
1. 创建一个 Maven Web 工程
整个工程的目录结构如下:
topspring-sample/┗ src/┗ main/┗ java/┗ resources/┗ application.properties┗ log4j.properties┗ templates┗ index.html┗ pom.xml
在 java
目录下,创建以下包名目录结构:
toy/┗ spring/┗ sample/┗ action/┗ entity/┗ service/┗ App.java
2. 配置 Maven 依赖
1.下载 git@gitee.com:fencer911/toy-spring.git 源码 mvn install 到本地
2.编辑 pom.xml
文件,添加 ToySpring
依赖:
<dependency><groupId>org.niu</groupId><artifactId>toy-spring</artifactId><version>2.0-SNAPSHOT</version>
</dependency>
提示:在jdk1.8下做的开发和测试,其他版本效果未知
3. 编写 ToySpring 配置
在 resources
目录下,创建一个名为 application.properties
的文件,内容如下:
### Default web context path:
server.servlet.contextPath=/toy-spring
### Default web server port:
server.port=8080
提示:需根据实际情况修改以上配置。
4. 编写 Entity 类
package toy.spring.sample.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {private Long id;private String name;private Integer age;
}
5. 编写 Service 接口及其实现
Service 接口
package toy.spring.sample.service;import niu.toy.sample.entity.User;
import java.util.List;public interface UserService {List<User> findUserList();User findUser(long id);boolean saveUser(User newUser);boolean updateUser(User updateUser);boolean deleteUser(long id);
}
Service 实现
package toy.spring.sample.service.impl;import cn.hutool.core.bean.BeanUtil;
import niu.toy.sample.entity.User;
import niu.toy.sample.service.UserService;
import niu.toy.spring.ioc.annotation.Service;
import niu.toy.spring.tx.annotation.Transaction;import java.util.ArrayList;
import java.util.List;/*** 基于演示目的 数据放内存* @author niu*/
@Service
public class UserServiceImp implements UserService {private List<User> users=new ArrayList<>();@Overridepublic List<User> findUserList() {return users;}@Overridepublic User findUser(long id) {return users.stream().filter(u->u.getId()==id).findFirst().orElse(null);}@Override@Transactionpublic boolean saveUser(User newUser) {return users.add(newUser);}@Override@Transactionpublic boolean updateUser(User updateUser) {User oldUser=this.findUser(updateUser.getId());if(oldUser!=null){BeanUtil.copyProperties(updateUser,oldUser);return true;}return false;}@Override@Transactionpublic boolean deleteUser(long id) {User oldUser=this.findUser(id);if(oldUser!=null){return this.users.remove(oldUser);}return false;}
}
5. 编写 Action 类
package toy.spring.sample.action;import niu.toy.sample.entity.User;
import niu.toy.sample.service.UserService;
import niu.toy.spring.ioc.annotation.Autowired;
import niu.toy.spring.mvc.annotation.*;/*** 为了测试mvc 的参数解析转换功能 add方法有3个版本分别对应不同的参数解析方式* @author niu*/
@Action
public class UserAction {@Autowiredprivate UserService userService;@Request.Get("/user")public String index() {return "index";}@Request.Get("/user/list")@ResponseBodypublic Object list() {return userService.findUserList();}@Request.Get("/user/add")@ResponseBodypublic Object add(@RequestParam String name, Integer age, Long id) {return userService.saveUser(new User(id,name,age,null));}@Request.Get("/user/add2")@ResponseBodypublic Object add2(User user) {return userService.saveUser(user);}@Request.Post("/user/add3")@ResponseBodypublic Object create3(@RequestBody User user) {return userService.saveUser(user);}@Request.Get("/user/del")public String del(Long id) {userService.deleteUser(id);return "redirect:/user";}
}
6. 编写 启动类
启动类和SpringBoot类似
package toy.spring.sample;import niu.toy.spring.boot.SpringApplication;
import niu.toy.spring.boot.annotation.SpringBootApplication;
import niu.toy.spring.mvc.WebApplicationContext;@SpringBootApplication
public class App {public static void main(String[] args) throws Exception {WebApplicationContext ctx=SpringApplication.run(App.class);}
}
参考资料
- Smart 系列博文:http://my.oschina.net/huangyong/blog/158380
- SpringBoot 源码
从零开始写类似Spring和SpringBoot的框架相关推荐
- 从零开始部署Guns V4.0 (SpringBoot开源框架)教程
开篇废话:Guns作为一个较新且流行的SpringBoot框架,对于那些已经接触过各种SSH,SSI,SH等传统的JAVAEE框架的老手们来说肯定是很快就能够成功部署和掌握的了,但也不免有许多新手想学 ...
- 从零开始写一个武侠冒险游戏-6-用GPU提升性能(1)
从零开始写一个武侠冒险游戏-6-用GPU提升性能(1) ----把帧动画的实现放在GPU上 作者:FreeBlues 修订记录 2016.06.19 初稿完成. 2016.08.05 增加对 XCod ...
- 从零开始写一个武侠冒险游戏-8-用GPU提升性能(3)
从零开始写一个武侠冒险游戏-8-用GPU提升性能(3) ----解决因绘制雷达图导致的帧速下降问题 作者:FreeBlues 修订记录 2016.06.23 初稿完成. 2016.08.07 增加对 ...
- 从零开始写一个武侠冒险游戏-2-帧动画
从零开始写一个武侠冒险游戏-2-帧动画 ---- 用基本绘图函数实现帧动画 作者:FreeBlues 修订记录 2016.06.10 初稿完成. 2016.08.03 增加对 XCode 项目文件的说 ...
- 带你手写基于 Spring 的可插拔式 RPC 框架(二)整体结构
前言 上一篇文章中我们已经知道了什么是 RPC 框架和为什么要做一个 RPC 框架了,这一章我们来从宏观上分析,怎么来实现一个 RPC 框架,这个框架都有那些模块以及这些模块的作用. 总体设计 在我们 ...
- 如何搭建python框架_从零开始:写一个简单的Python框架
原标题:从零开始:写一个简单的Python框架 Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 你为什么想搭建一个Web框架?我想有下面几个原因: 有一个 ...
- JAVA基础加强(张孝祥)_类加载器、分析代理类的作用与原理及AOP概念、分析JVM动态生成的类、实现类似Spring的可配置的AOP框架...
1.类加载器 ·简要介绍什么是类加载器,和类加载器的作用 ·Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader ...
- 艿艿连肝了几个周末,写了一篇贼长的 Spring 响应式 Web 框架 WebFlux!市面第二完整~...
点击上方"芋道源码",选择"设为星标" 做积极的人,而不是积极废人! 源码精品专栏 原创 | Java 2020 超神之路,很肝~ 中文详细注释的开源项目 RP ...
- 【Android项目实战 | 从零开始写app (六) 】用TabLayout+ViewPager搭建App 框架主页面底部导航栏
本篇实现效果: 搭建app框架的方式有很多,本节主要用TabLayout+ViewPager搭建App框架,这种方式简单易实现,在主页中加载Fragment碎片,实现不同功能页面的切换效果图如下: 文 ...
最新文章
- mysql 函数rep_Mysql之各种各样的函数啦
- python的用途实例-python进程池作用展示及实例解析
- WPF特效-拼图游戏
- 覆盖所有面试知识点,持续更新中
- ominigraffle 模板_商河盖梁模板安装
- cdr怎样把一张图片随意变形_CDR钢笔工具怎么抠图?原来使用起来这么简单!
- 快手did did_gt edid的注册过程
- 应急响应(日志/流量)
- Thinkphp精仿韩都衣舍商城网站源码
- realsense相机色彩图与深度图对齐
- 最准通达信强势顶底指标公式 副图 源码
- 常见的计算机局域网拓扑有,计算机网络原理 常见的局域网拓扑结构
- MySQL5.7系列的安装教程
- C#使用S7.net连接西门子S1200PLC,C#直接连接西门子PLC
- 哈夫曼编码树的经典题目
- ArcGIS小知识(九)——坡度、剖面曲率、坡向、等高线
- 黑苹果MacOSX 10.9.3 Mavericks(13D65) 安装教程
- Python使用qbittoreent的webAPI实现自动下载种子
- 机器学习最优化算法的演变,FTRL一路走来,从LR - SGD - TG - FOBOS - RDA - FTRL
- 硬件电路设计入门之三路二选一模拟开关电路芯片--74HCT4053