2019独角兽企业重金招聘Python工程师标准>>>

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

与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://my.oschina.net/jeffreyning/blog/1613440

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. [.net 面向对象程序设计深入](4)MVC 6 —— 谈谈MVC的版本变迁及新版本6.0发展方向...

    [.net 面向对象程序设计深入](4)MVC 6 --谈谈MVC的版本变迁及新版本6.0发展方向 1.关于MVC 在本篇中不再详细介绍MVC的基础概念,这些东西百度要比我写的全面多了,MVC从1.0 ...

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

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

  4. The prefix “mvc“ for element “mvc:annotation-driven“ is not bound 异常

    The prefix "mvc" for element "mvc:annotation-driven" is not bound 异常 参考文章: (1)Th ...

  5. mvc中的mvc分别指什么_什么是MVC,它像三明治店吗?

    mvc中的mvc分别指什么 by Adam Wattis 通过亚当·沃蒂斯(Adam Wattis) 什么是MVC,它像三明治店吗? (What is MVC, and how is it like ...

  6. [MVC]Asp.net MVC中的Session

    [MVC]Asp.net MVC中的Session 2008年12月9日 分类: ASP.NET, ASP.NET MVC, C#, 开发笔记 最近使用ASP.NET MVC 中的Controller ...

  7. spring mvc示例_Spring MVC示例

    spring mvc示例 Welcome to Spring MVC Example. Sometime back in Spring MVC Tutorial, I explained how to ...

  8. java mvc mvvm_从MVC到MVVM(为什么要用vue)

    axios 功能类似于jQuery.ajax. axios.post() axios.get() axios.put() axios.patch() axios.delete() 比jQuery.aj ...

  9. 【MVC、Spring MVC介绍、区别、执行流程】

    介绍 MVC(Model-View-Controller)是一种软件架构模式,其中应用程序被划分为三个部分:模型(Model).视图(View)和控制器(Controller).MVC框架的主要目标是 ...

  10. 了解MVC模式与MVC框架

    MVC MVC的概念 模型(Model) 控制器(Controller) 视图(View) MVC工作流程 Java MVC框架 Struts1框架 Struts2框架 Spring MVC框架 JS ...

最新文章

  1. 【Hibernate】映射关系总结
  2. html5 项目案例_互动案例技术分析(3)
  3. linux deepin20.5配置WebStorm桌面快捷方式:webstorm.desktop
  4. 1809企业战略管理
  5. 两台服务器之间mysql数据库怎么做同步_MySQL 数据库同步结构总结
  6. HDU 6168 Numbers 思维 水题
  7. Python天天美味(4) - isinstance判断对象类型
  8. python多重继承super父类参数_python – 多重继承如何与super()和不同的__init __()参数一起使用?...
  9. 关于音游,除了节奏大师,你还熟悉哪些?
  10. 差分技术:LVDS(低电压差分信号)
  11. Ubuntu配置locale
  12. Backblaze2022中期SSD故障质量报告解读
  13. 中兴通讯携手CLAA合作伙伴,开创共享共建物联网新时代
  14. windows - PHP 开发环境搭建
  15. nc命令卡住不返回的分析
  16. 写游戏用python还是c好点_为什么多数游戏服务端是用 C++ 来写
  17. 进程同步问题——生产者—消费者问题
  18. 我“胡汉三”又回来了。
  19. Jenkins教程(3)使用npm构建Node.js和React应用
  20. 《白话深度学习与Tensorflow》学习笔记(7)RBM限制玻尔兹曼机

热门文章

  1. JAVAWEB 一一 Spirng(AOP面向切面)
  2. [基础知识]在PeopleSoft中SMTP设置不生效如何查找问题
  3. [已解决]Tomcat启动报 java.net.BindException: Address already in use: JVM_Bind
  4. VS2005 添加lib 的方法
  5. 第一行代码--笔记(3)
  6. Tomcat - SSL操作大全
  7. 功能和界面哪个更重要
  8. fgets和fgetl有什么区别
  9. FeelYourSound MelodicFlow for Mac - 旋律制作神器
  10. 如何使用预览在 Mac 上将 HEIC 文件更改为 JPEG