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的框架相关推荐

  1. 从零开始部署Guns V4.0 (SpringBoot开源框架)教程

    开篇废话:Guns作为一个较新且流行的SpringBoot框架,对于那些已经接触过各种SSH,SSI,SH等传统的JAVAEE框架的老手们来说肯定是很快就能够成功部署和掌握的了,但也不免有许多新手想学 ...

  2. 从零开始写一个武侠冒险游戏-6-用GPU提升性能(1)

    从零开始写一个武侠冒险游戏-6-用GPU提升性能(1) ----把帧动画的实现放在GPU上 作者:FreeBlues 修订记录 2016.06.19 初稿完成. 2016.08.05 增加对 XCod ...

  3. 从零开始写一个武侠冒险游戏-8-用GPU提升性能(3)

    从零开始写一个武侠冒险游戏-8-用GPU提升性能(3) ----解决因绘制雷达图导致的帧速下降问题 作者:FreeBlues 修订记录 2016.06.23 初稿完成. 2016.08.07 增加对 ...

  4. 从零开始写一个武侠冒险游戏-2-帧动画

    从零开始写一个武侠冒险游戏-2-帧动画 ---- 用基本绘图函数实现帧动画 作者:FreeBlues 修订记录 2016.06.10 初稿完成. 2016.08.03 增加对 XCode 项目文件的说 ...

  5. 带你手写基于 Spring 的可插拔式 RPC 框架(二)整体结构

    前言 上一篇文章中我们已经知道了什么是 RPC 框架和为什么要做一个 RPC 框架了,这一章我们来从宏观上分析,怎么来实现一个 RPC 框架,这个框架都有那些模块以及这些模块的作用. 总体设计 在我们 ...

  6. 如何搭建python框架_从零开始:写一个简单的Python框架

    原标题:从零开始:写一个简单的Python框架 Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 你为什么想搭建一个Web框架?我想有下面几个原因: 有一个 ...

  7. JAVA基础加强(张孝祥)_类加载器、分析代理类的作用与原理及AOP概念、分析JVM动态生成的类、实现类似Spring的可配置的AOP框架...

    1.类加载器 ·简要介绍什么是类加载器,和类加载器的作用 ·Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader ...

  8. 艿艿连肝了几个周末,写了一篇贼长的 Spring 响应式 Web 框架 WebFlux!市面第二完整~...

    点击上方"芋道源码",选择"设为星标" 做积极的人,而不是积极废人! 源码精品专栏 原创 | Java 2020 超神之路,很肝~ 中文详细注释的开源项目 RP ...

  9. 【Android项目实战 | 从零开始写app (六) 】用TabLayout+ViewPager搭建App 框架主页面底部导航栏

    本篇实现效果: 搭建app框架的方式有很多,本节主要用TabLayout+ViewPager搭建App框架,这种方式简单易实现,在主页中加载Fragment碎片,实现不同功能页面的切换效果图如下: 文 ...

最新文章

  1. mysql 函数rep_Mysql之各种各样的函数啦
  2. python的用途实例-python进程池作用展示及实例解析
  3. WPF特效-拼图游戏
  4. 覆盖所有面试知识点,持续更新中
  5. ominigraffle 模板_商河盖梁模板安装
  6. cdr怎样把一张图片随意变形_CDR钢笔工具怎么抠图?原来使用起来这么简单!
  7. 快手did did_gt edid的注册过程
  8. 应急响应(日志/流量)
  9. Thinkphp精仿韩都衣舍商城网站源码
  10. realsense相机色彩图与深度图对齐
  11. 最准通达信强势顶底指标公式 副图 源码
  12. 常见的计算机局域网拓扑有,计算机网络原理 常见的局域网拓扑结构
  13. MySQL5.7系列的安装教程
  14. C#使用S7.net连接西门子S1200PLC,C#直接连接西门子PLC
  15. 哈夫曼编码树的经典题目
  16. ArcGIS小知识(九)——坡度、剖面曲率、坡向、等高线
  17. 黑苹果MacOSX 10.9.3 Mavericks(13D65) 安装教程
  18. Python使用qbittoreent的webAPI实现自动下载种子
  19. 机器学习最优化算法的演变,FTRL一路走来,从LR - SGD - TG - FOBOS - RDA - FTRL
  20. 硬件电路设计入门之三路二选一模拟开关电路芯片--74HCT4053

热门文章

  1. 文章管理平台PC端(个人中心+侧面菜单)
  2. linux shell for
  3. Spring框架之AOP
  4. 安卓手机通过Termux免Root运行Routersploit对路由器进行渗透【Rsf】【渗透工具】【Termux】
  5. 基于JAVA动物防疫信息管理计算机毕业设计源码+系统+lw文档+部署
  6. vue实现指定区域自由拖拽、打印功能
  7. LCD屏参:手把手教你配置LCD屏参(proch值)
  8. mppdb 查看建表语句_drds mppdb
  9. 从中关村到上地七街的走法
  10. STM32—PID结构体使用讲解