当前位置: 首页 > 工具软件 > MyMVC > 使用案例 >

netty redis mysql_mynetty: mynetty是轻量服务架构 包含 内嵌netty服务器、jdbc(类似mybatis)、myspring、mymvc、myaop、redis、c...

公良浩邈
2023-12-01

介绍

mynetty简介

1.mynetty是轻量服务架构 包含 内嵌netty服务器、jdbc(类似mybatis)、myspring、mymvc、myaop、redis、cron定时器、安全权限模块;

2.同时还有几个工具包:代码生成工具类(采用beetl模版,代码模版可以自己改造),excel工具类;

3.而且上面的几个模块例如 jdbc myspring模块里的常用方法可以当工具类使用,例如SqlHelper,MySqlSession,DefaultApplication等类可以直接操作数据库和ioc操作;

4.mySafe安全权限框架、简单的定时器调度任务框架、redis操作工具类、文件服务器

服务快速入门

启动服务

启动服务绑定端口8897

代码:

public static void main(String[] args) throws InterruptedException {

new HttpServer(8897);

}

2.使用mymvc 和 ioc 和 MySqlSession写简单查询列表的功能

代码:

@MyController

@MyRequestMapping("/CustAction")

public class CustAction {

@MyRequestMapping("/getCustList")

public void getCustList(HttpMyRequest req, HttpMyReponse rep) {

CustDao cd = MySqlSession.getMapper(CustDao.class);

Map par = new HashMap<>();

par.put("name", "%杜%");

Map result = new HashMap<>();

result.put("data", cd.getCustList(par));

rep.fullWrite(JSONObject.toJSONString(result));

}

}

dao接口

代码:

public interface CustDao {

@MySelect("select custid,nickname,telphone from cust where 1=1 and nickname like :name ")

List> getCustList(Map map);

}

返回

{"data":[{"telphone":"18636929805","custid":2,"nickname":"杜业务"},{"telphone":"18234164844","custid":24,"nickname":"杜甫"}]}

(该接口通过了jmeter 10000次的并发请求测试)

软件架构

简单原理介绍:

服务每次请求的处理:

1.使用netty对每次请求进行myrequest myresponse对象的封装

2.构建serlvet模式,实现myserlvet,生命周期包括 init(初始化)->domain(处理)->destory(销毁)

3.每次请求封装好的 myrequest对象和myresponse对象传入myserlvet实例内(单例模式)(服务初始化时,初始化所有myserlvet实例(注解方式))

4.mymvc实现一个myserlvet(调度serlvet,URL为"/*")(MyDispatcherServlet类)来调度处理所有请求

5.MyDispatcherServlet类再初始化时对所有myRequestMapping注解方法类都扫描,然后把url:method以key:value形式存储

6.请求过来是执行MyDispatcherServlet类的domain方法,主要就是从url:method的map中取出该url对应的方法和类,然后反射执行

session处理:

每次请求处理请求头是否有cookie及cookie内是否有mysessionid参数信息,没有时回复头内使用 set-cookie给该域名填充mysessionid信息(生成一个uuid)

myserlvet接口

public interface MySerlvet {

public void init();

public void domain(HttpMyRequest req,HttpMyReponse rep);

public void destory();

}

mymvc 调度serlvet

@MySerlvetUrl("/*")

public class MyDispatcherServlet extends HttpMySerlvet {

功能介绍

1. 简单http服务器功能 重新封装了 serlvet,request,reponse等对象 serlvet采取注解的方式配置

2. 服务器有session功能 sessionid标识为 mysessionid

3. 实现轻量级 ioc和mvc 和动态代理aop

4. 实现简单的mybatis功能。

5. 常用的代码生成工具类,excel工具类,代理工具类。

功能详细介绍

一.spring ioc

DefaultMyApplication类生命周期:

初始化扫描包下的MyBean注解的类到容器里->从容器获取实例时,反射获取实例类内成员变量如有MyAuto注解,则从容器中依赖注入相应实例。

com.testMvc.testSpring 下测试案例:

public static void main(String[] args) throws Exception {

//初始化容器

DefaultMyApplication ap = new DefaultMyApplication();

//通过名字获取

CustAction ca = (CustAction) ap.getBean("CustAction");

ca.testSpring();

//通过接口获取

CustService cs= ap.getBean(CustService.class);

cs.speak();

}

简单配置:

@MyBean("CustAction")

public class CustAction {

@MyAuto

CustService cs;

public void testSpring() {

List> list = cs.getCusts();

System.out.println("list:" + list);

}

}

@MyBean

public class CustServiceImpl implements CustService {

@Override

public List> getCusts() {

CustDao cd = MySqlSession.getMapper(CustDao.class);

Map par = new HashMap<>();

par.put("name", "%杜%");

return cd.getCustList(par);

}

@Override

public void speak() {

System.out.println("I'am speak");

}

}

二.myaop

aop原理简单介绍:

1.被切面的类实例调用时采用动态代理,优先使用jdk动态代理,如没有接口是采用cgli代理

2.判断该代理方法是有属于某个配置的切面表达式,如果属于,则取该前要执行操作的方法(method完了会反射调用),下一步

3.四个切入点采用观察者模式,例如代理方法执行到方法前,把方法前的信号标志和切面相关操作方法传给所用订阅者update,然后方法前面的订阅者执行自己的update方法

4.Update方法 执行相关切面操作方法(反射执行)

com.testMvc.testAop2 下测试案例testAop2

public static void main(String[] args) {

test1();

}

public static void test1() {

MyAopFactory.getInstance();

Inter1 i = MyAopFactory.getSub(inter1Impl.class);

i.speak();

}

执行结果:

哈哈在前面

speak

哈哈在后面

简单配置:

切入点配置(com.testMvc.testAop1包下所有类的spea打头的方法执行切面方法)

@MyAscept("execution(* com.testMvc.testAop1.*.spea*(..))")

public class testAscept {

@MyBefor

public void befor() {

System.out.println("哈哈在前面");

}

@MyAfter

public void after() {

System.out.println("哈哈在后面");

}

}

inter1Impl类内的speak方法符合切入点表达式@MyAscept("execution(* com.testMvc.testAop1..spea(..))")

public class inter1Impl implements Inter1 {

@Override

public void speak() {

System.out.println("speak");

}

}

三.代码生成器:

简单原理:

1.采用beetle模版引擎,直接配置action层,service层,bean层的代码模版

2.查询生成表的字段信息,相关信息保存起来执行下一步

3.beetle资源加载器把代码模版的代码加载然后用表字段信息经过“类型转换和首字母大写转换”

4.填充模版页面相关数据到模版引擎里,渲染模版,渲染结果生成相应的文件到目标目录下

使用简单介绍:

com.tool.createBean包下CreateHelperNew类main方法生成代码,入参有注解,如下:

public static void main(String[] args) {

getTableInfo("cust,config", "用户,配置", "E:/kkklll/");

}

/**

* @param table 表名

* @param describe 表模块描述

* @param path 生成bean文件路径

*/

public static void getTableInfo(String table, String describe, String path) {

try {

模版文件在在resources下的codeTemplate包下(现在又action,bean,service几个模版文件,可自己修改或增加自己的模版文件)

作者

刘剑

 类似资料: