micro-mvc框架,可以与springmvc和springcloud整合,使所有的controller、servicebean、dao和sql业务逻辑代码都支持热部署方便开发人员调式和生产部署。
源码与demo地址:https://github.com/jeffreyning/micro-mvc

与springmvc整合过程

编写Controller接口

整合后Springmvc的controller只编写接口,参数名称必须用RequestParam注解。
使用InjectGroovy注解在接口中声明对应的groovy实现名称。
其他与传统springmvc的controller无异。

package foo.web;import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import com.nh.micro.service.InjectGroovy;@Controller
@RequestMapping("test")
@InjectGroovy(name="TestController")
public interface TestController {
@RequestMapping("echo")
@ResponseBody
public  Map echo(@RequestParam(value="str") String str,HttpServletRequest httpRequest);}

编写Controller层的实现groovy

package groovy;import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;import com.nh.micro.rule.engine.core.plugin.MicroAop;
import com.nh.micro.rule.engine.core.plugin.MicroDefaultLogProxy;
import com.nh.micro.service.InjectGroovy;
import com.nh.micro.template.MicroDbProxy;
import com.nh.micro.template.MicroTMProxy;import foo.service.TestService;@MicroAop(name=[MicroDefaultLogProxy.class,MicroTMProxy.class,MicroDbProxy.class], property=["","",""])
class TestController  {  @Resourcepublic TestService testService;public Map echo(String str,HttpServletRequest httpRequest) {System.out.println("this is controller proxy");testService.test("111");Map retMap=new HashMap();retMap.put("status", "0");return retMap;}}

配置controller层包扫描

使用GroovyBeanScannerConfigurer代替context:component-scan对controller进行扫描。

    <bean class="com.nh.micro.service.GroovyBeanScannerConfigurer"><property name="scanPath" value="foo.web"></property></bean>
<!-- <context:component-scan base-package="foo.web" /> -->

Service层

编写ServiceBean接口

并进行包扫描,使controller层能够是resource加载到ServiceBean代理对象。注意在接口中使用@InjectGroovy注解声明对应的实现业务逻辑的groovy文件名字
编写ServiceBean接口

package foo.service;
import com.nh.micro.service.InjectGroovy;
@InjectGroovy(name="TestService")
public interface TestService {public void test(String id);
}

Service层groovy实现

package groovy.service;
import javax.annotation.Resource;
import foo.dao.TestDao;
import foo.dto.MicroTestDto;
import foo.repository.*;
import groovy.json.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.transaction.annotation.Transactional;
import com.nh.micro.dao.mapper.DefaultPageInfo;
import com.nh.micro.dao.mapper.InjectDao;
import com.nh.micro.rule.engine.core.plugin.MicroAop;
import com.nh.micro.rule.engine.core.plugin.MicroDefaultLogProxy;
import com.nh.micro.template.MicroDbProxy;
import com.nh.micro.template.MicroServiceTemplateSupport;
import com.nh.micro.template.MicroTMProxy;@MicroAop(name=[MicroDefaultLogProxy.class,MicroTMProxy.class,MicroDbProxy.class], property=["","",""])
class TestService  {  @Resourcepublic TestDao testDao;public void test(String id){Map paramMap=new HashMap();paramMap.put("id", id);MicroTestDto microTestDto=testDao.queryInfoById(paramMap);List<MicroTestDto> list=testDao.getInfoListAllMapper(microTestDto, ""); DefaultPageInfo pageInfo=new DefaultPageInfo();pageInfo.setPageNo(1);List<MicroTestDto> retList=testDao.queryInfosByPage(paramMap, pageInfo);Long total=pageInfo.getTotal();System.out.println("total="+total);}}

Service层包扫描配置

    <bean class="com.nh.micro.service.GroovyBeanScannerConfigurer"><property name="scanPath" value="foo.service"></property></bean>

Dao层

使用micro-dao模块,需要编写dto类,dao接口和sql文件。通过扫描sql文件和dao接口,使service层能够使用Resource注解加载dao代理对象。

编写dto对象类

使用@MicroTableName映射数据中表名,使用@MicroMappingAnno映射表中列名。

package foo.dto;import java.util.Date;
import com.nh.micro.orm.MicroMappingAnno;
import com.nh.micro.orm.MicroTableName;@MicroTableName(name="micro_test")
public class MicroTestDto {@MicroMappingAnno(name="id")private String id;@MicroMappingAnno(name="meta_key")private String metaKey;@MicroMappingAnno(name="meta_name")private String metaName;@MicroMappingAnno(name="meta_type")private String metaType;@MicroMappingAnno(name="create_time")private Date createTime;@MicroMappingAnno(name="meta_num")private Integer metaNum;public Integer getMetaNum() {return metaNum;}public void setMetaNum(Integer metaNum) {this.metaNum = metaNum;}public Date getCreateTime() {return createTime;}public void setCreateTime(Date createTime) {this.createTime = createTime;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getMetaKey() {return metaKey;}public void setMetaKey(String metaKey) {this.metaKey = metaKey;}public String getMetaName() {return metaName;}public void setMetaName(String metaName) {this.metaName = metaName;}public String getMetaType() {return metaType;}public void setMetaType(String metaType) {this.metaType = metaType;}
}

编写Dao接口

package foo.dao;
import java.util.List;
import java.util.Map;
import com.nh.micro.dao.mapper.ListInnerClass;
import com.nh.micro.dao.mapper.MicroCommonMapper;
import com.nh.micro.dao.mapper.MicroPageInfo;
import com.nh.micro.orm.MicroDbName;
import foo.dto.MicroTestDto;@MicroDbName
public interface TestDao extends MicroCommonMapper<MicroTestDto> {public int updateInfo(Map paramMap);public int insertInfo(Map paramMap);@ListInnerClass(name=MicroTestDto.class)public List<MicroTestDto> queryInfosByPage(Map paramMap,MicroPageInfo pageInfo);    public MicroTestDto queryInfoById(Map paramMap);
}

Dao层包扫描配置

    <bean id="daoScan" class="com.nh.micro.dao.mapper.scan.BeanScannerConfigurer"><property name="scanPath" value="foo.dao"></property></bean>

编写sql模板

类似jsp的语法编写sql,支持#和$两种替换符。不必区分select还是update,统一用<sql id=”xxx”>标签,id与dao接口方法名一致,sql文件名与dao接口名一致。

<%! <sql id="queryInfoById"> %>
select * from micro_test where 1=1
<% if(paramArray[0].get("id")!=null){ %>        and id = #{paramArray[0].id}
<%  } %>
<%! </sql> %><%! <sql id="queryInfosByPage"> %>
select * from micro_test
<%! </sql> %><%! <sql id="insertInfo"> %>
insert into micro_test(id,meta_key) values(
?
<% repList.add(paramArray[0].get("id"));%>
,?
<% repList.add(paramArray[0].get("meta_key"));%>    )
<%! </sql> %><%! <sql id="updateInfo"> %>
update micro_test set  <% if(paramArray[0].get("meta_key")!=null){%>
,meta_key=#{paramArray[0].get("meta_key")}
<% } %>
<% if(paramArray[0].get("meta_name")!=null){%>
,meta_name=#{paramArray[0].get("meta_name")}
<% } %> where id=#{paramArray[0].get("id")}
<%! </sql> %>

Sql文件扫描配置

    <!-- micro-dao sql文件加载 --><bean class="com.nh.micro.nhs.NhsInitUtil"init-method="initGroovyAndThread" lazy-init="false"><property name="fileList"><list><bean class="com.nh.micro.rule.engine.core.GFileBean"><property name="ruleStamp" value="true"></property><property name="jarFileFlag" value="true"></property><property name="dirFlag" value="true"></property><property name="rulePath" value="/groovy/"></property></bean></list></property></bean>

MicroDao说明

同时支持mysql和oracle
MicroDao相对mybatis的优点:
1,sql脚本支持修改后热部署实时生效。
2,bean与数据库字段映射关系,通过注解设置到bean中,不必在sql脚本中体现。
3,sql脚本支持类似jsp的写法,且不必区分select、update使用不同标签,更加灵活。
4,不需要使用插件,内置支持物理分页。
5,不需要使用插件,内置支持针对bean的标准增删改查功能。
6,不需要使用插件,内置支持读写分离,分库分表。
7,针对mysql5.7支持动态字段。
支持mapper、template、非orm三种模式支撑业务系统
1,mapper指,通过扫描接口,运行时自动生成dao实例;
2,template指,通过继承template标准父类,生成dao子类;
3,非orm指,直接使用microDao实例,可以执行非orm更灵活的数据库操作。

关于事务

由于serviceBean接口对象通过包扫描发布为springbean,所以仍可以使用原有的spring事务机制。

    <!-- 配置platform transaction manager--><bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean> <!-- 声明式事物管理,配置事物管理advice--><tx:advice id="txAdvice" transaction-manager="txManager"><tx:attributes><tx:method name="get*" read-only="true"/>
<tx:method name="test*" propagation="REQUIRED"/><tx:method name="add*" propagation="REQUIRED"/><tx:method name="insert*" propagation="REQUIRED"/><tx:method name="update*" propagation="REQUIRED"/><tx:method name="*"/></tx:attributes></tx:advice> <!-- 配置事物管理advice作用范围与作用条件--><aop:config><aop:pointcut id="serviceLayerTransaction" expression="execution( * foo.service.*..*(..))"/><aop:advisor pointcut-ref="serviceLayerTransaction" advice-ref="txAdvice"/></aop:config>

SpringCloud整合

SpringCloud整合controller,service、dao层与springmvc整合均一致。
具体查看demo项目
Micro-springcloud-mvc

Nhmicro的Aop机制

加载groovy时提供aop代理机制,默认提供事务aop和数据源切换aop
事务aop,可在加载时,识别Transactional注解,实现事务控制。
可自行别写特定功能代理。
开启代理需要在groovy的类中设置MicroAop注解指定代理类

@MicroAop(name=[MicroDefaultLogProxy.class,MicroTMProxy.class,MicroDbProxy.class], property=["","",""])

转载于:https://blog.51cto.com/13442277/2065110

micro-mvc框架支持mvc各层业务代码热部署相关推荐

  1. ASP.NET开源MVC框架Vici MVC(三)HELLO WORD

    ASP.NET开源MVC框架Vici MVC 最大的特点是支持ASP.NET2.0  iis不需要额外的设置 官方实例下载地址http://viciproject.com/wiki/Projects/ ...

  2. spring mvc框架、mvc框架模式

    框架与框架模式 框架模式:解决某一类问题的思维模式方法论 框架:在框架模式方法论之上实现的一套成熟的一组组件,供选用完成自己的系统 MVC:全称Model-View-Controller是模型-视图- ...

  3. 从MVC框架看MVC架构的设计

    尽管MVC早已不是什么新鲜话题了,但是从近些年一些优秀MVC框架的设计上,我们还是会发现MVC在架构设计上的一些新亮点.本文将对传统MVC架构中的一些弊病进行解读,了解一些优秀MVC框架是如何化解这些 ...

  4. spring框架mvc框架_Spring MVC测试框架入门–第2部分

    spring框架mvc框架 这个迷你系列的第一个博客介绍了Spring MVC测试框架,并演示了其在单元测试Spring MVC Controller类中作为控制器而不是POJO进行单元测试的用途. ...

  5. NHMicro业务脚本热部署快速开发框架介绍

    NHMicro开源框架介绍 传统MVC框架中,系统按照Controller.Service.Dao层次划分,虽然在建设初期技术结构清晰.但每个业务逻辑代码都分散到不同代码框,业务结构不直观,不利于后期 ...

  6. 学习Srping、SringMVC、Mybatis框架,模拟商城(第二节 MAVEN热部署到Tomcat)

    一.修改Tomcat端口号 找到apache-tomcat\conf\server.xml文件,修改端口号: <Connector port="8081" protocol= ...

  7. ASP.NET MVC框架(第一部分)

    [原文地址]ASP.NET MVC Framework (Part 1) [原文发表日期] Tuesday, November 13, 2007 3:45 AM 两个星期前, 我在博客里讨论了ASP. ...

  8. MVC框架实现用户登录注册功能(连接数据库)

    目录 一.简单理解MVC框架 二.项目结构 三.项目源码 3.1 User 3.2 UserDao 3.3 RegisterDao 3.4 servletControll 3.5 servletCon ...

  9. ASP.NET MVC 框架

    ASP.NET MVC 框架 [原文地址]ASP.NET MVC Framework [原文发表日期] Sunday, October 14, 2007 10:41 PM 过去的几年里,很多人要求AS ...

最新文章

  1. 第十七届全国大学智能车竞赛赛区划分
  2. WINCE cvrtbin命令简介
  3. ZooKeeper--一个具有高可用性的高性能协调服务
  4. golang mysql商业用例_完美起航-golang操作mysql用例
  5. android.animation(1) - ValueAnimator的ofInt(), ofFloat(), addUpdateListener(), addListener()(转)
  6. [力扣]1018_可被5整除的二进制前缀
  7. 去掉左边0_SLAM从0到1——11. 视觉里程计VO内容框架
  8. PHPCMS资源网站源码软件源码下载站网站源码
  9. JQuery1.11版本对prop和attr接口的含义分离导致问题分析
  10. c++树及树与二叉树的转换
  11. powshell的tree命令
  12. 如何求解最大公约数和最小公倍数
  13. win10通过OneDrive实现办公室的电脑和家里电脑重要数据同步
  14. 中职计算机教师考核工作总结,中职计算机教师教学工作总结
  15. 面试笔记-1.计算机网络面试核心
  16. c语言switch问候语,C语言switch语句用法详解
  17. 这样吃橙子才最健康,90%的人不知道的秘密!
  18. (Java实现) 洛谷 P1200 你的飞碟在这儿
  19. 8个视频素材网站,免费可商用,视频剪辑必备。
  20. STM32 精确控制PWM脉冲个数

热门文章

  1. C++接收字符串数组_C++模拟面试:从数组“紧凑”操作说开来
  2. wcf返回json android,WCF返回JSON的详细配置
  3. php mysql 修改密码_设置及修改MySQL root用户密码
  4. 如何保证两个不同宽高的canvas用同一组坐标正常显示_如何1人5天开发完3D数据可视化大屏 【一】...
  5. mysql数据库引擎博客_2、MySQL常见数据库引擎及比较?
  6. 乐山师范计算机科学与技术怎么样,乐山师范学院计算机科学与技术(本科)教育概况...
  7. dump mysql_mysql/mariadb知识点总结(28):mysql备份工具之mysqldump
  8. FPGA的设计艺术(18)如何使用Verilog中的数组对存储器进行建模?
  9. Verilog设计实例(8)按键防抖设计之软件防抖
  10. 在maven中引用github上的资源