micro-mvc与主流mvc整合说明
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整合说明相关推荐
- ASP.NET开源MVC框架Vici MVC(三)HELLO WORD
ASP.NET开源MVC框架Vici MVC 最大的特点是支持ASP.NET2.0 iis不需要额外的设置 官方实例下载地址http://viciproject.com/wiki/Projects/ ...
- [.net 面向对象程序设计深入](4)MVC 6 —— 谈谈MVC的版本变迁及新版本6.0发展方向...
[.net 面向对象程序设计深入](4)MVC 6 --谈谈MVC的版本变迁及新版本6.0发展方向 1.关于MVC 在本篇中不再详细介绍MVC的基础概念,这些东西百度要比我写的全面多了,MVC从1.0 ...
- 从MVC框架看MVC架构的设计
尽管MVC早已不是什么新鲜话题了,但是从近些年一些优秀MVC框架的设计上,我们还是会发现MVC在架构设计上的一些新亮点.本文将对传统MVC架构中的一些弊病进行解读,了解一些优秀MVC框架是如何化解这些 ...
- The prefix “mvc“ for element “mvc:annotation-driven“ is not bound 异常
The prefix "mvc" for element "mvc:annotation-driven" is not bound 异常 参考文章: (1)Th ...
- mvc中的mvc分别指什么_什么是MVC,它像三明治店吗?
mvc中的mvc分别指什么 by Adam Wattis 通过亚当·沃蒂斯(Adam Wattis) 什么是MVC,它像三明治店吗? (What is MVC, and how is it like ...
- [MVC]Asp.net MVC中的Session
[MVC]Asp.net MVC中的Session 2008年12月9日 分类: ASP.NET, ASP.NET MVC, C#, 开发笔记 最近使用ASP.NET MVC 中的Controller ...
- spring mvc示例_Spring MVC示例
spring mvc示例 Welcome to Spring MVC Example. Sometime back in Spring MVC Tutorial, I explained how to ...
- java mvc mvvm_从MVC到MVVM(为什么要用vue)
axios 功能类似于jQuery.ajax. axios.post() axios.get() axios.put() axios.patch() axios.delete() 比jQuery.aj ...
- 【MVC、Spring MVC介绍、区别、执行流程】
介绍 MVC(Model-View-Controller)是一种软件架构模式,其中应用程序被划分为三个部分:模型(Model).视图(View)和控制器(Controller).MVC框架的主要目标是 ...
- 了解MVC模式与MVC框架
MVC MVC的概念 模型(Model) 控制器(Controller) 视图(View) MVC工作流程 Java MVC框架 Struts1框架 Struts2框架 Spring MVC框架 JS ...
最新文章
- 【Hibernate】映射关系总结
- html5 项目案例_互动案例技术分析(3)
- linux deepin20.5配置WebStorm桌面快捷方式:webstorm.desktop
- 1809企业战略管理
- 两台服务器之间mysql数据库怎么做同步_MySQL 数据库同步结构总结
- HDU 6168 Numbers 思维 水题
- Python天天美味(4) - isinstance判断对象类型
- python多重继承super父类参数_python – 多重继承如何与super()和不同的__init __()参数一起使用?...
- 关于音游,除了节奏大师,你还熟悉哪些?
- 差分技术:LVDS(低电压差分信号)
- Ubuntu配置locale
- Backblaze2022中期SSD故障质量报告解读
- 中兴通讯携手CLAA合作伙伴,开创共享共建物联网新时代
- windows - PHP 开发环境搭建
- nc命令卡住不返回的分析
- 写游戏用python还是c好点_为什么多数游戏服务端是用 C++ 来写
- 进程同步问题——生产者—消费者问题
- 我“胡汉三”又回来了。
- Jenkins教程(3)使用npm构建Node.js和React应用
- 《白话深度学习与Tensorflow》学习笔记(7)RBM限制玻尔兹曼机
热门文章
- JAVAWEB 一一 Spirng(AOP面向切面)
- [基础知识]在PeopleSoft中SMTP设置不生效如何查找问题
- [已解决]Tomcat启动报 java.net.BindException: Address already in use: JVM_Bind
- VS2005 添加lib 的方法
- 第一行代码--笔记(3)
- Tomcat - SSL操作大全
- 功能和界面哪个更重要
- fgets和fgetl有什么区别
- FeelYourSound MelodicFlow for Mac - 旋律制作神器
- 如何使用预览在 Mac 上将 HEIC 文件更改为 JPEG