您好,登錄后才能下訂單哦!
micro-mvc框架,可以與springmvc和springcloud整合,使所有的controller、servicebean、dao和sql業(yè)務邏輯代碼都支持熱部署方便開發(fā)人員調(diào)式和生產(chǎn)部署。
源碼與demo地址:https://github.com/jeffreyning/micro-mvc
與springmvc整合過程
編寫Controller接口
整合后Springmvc的controller只編寫接口,參數(shù)名稱必須用RequestParam注解。
使用InjectGroovy注解在接口中聲明對應的groovy實現(xiàn)名稱。
其他與傳統(tǒng)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層的實現(xiàn)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 {
@Resource
public 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注解聲明對應的實現(xiàn)業(yè)務邏輯的groovy文件名字
編寫ServiceBean接口
package foo.service;
import com.nh.micro.service.InjectGroovy;
@InjectGroovy(name="TestService")
public interface TestService {
public void test(String id);
}
Service層groovy實現(xiàn)
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 {
@Resource
public 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映射數(shù)據(jù)中表名,使用@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,支持#和$兩種替換符。不必區(qū)分select還是update,統(tǒng)一用<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的優(yōu)點:
1,sql腳本支持修改后熱部署實時生效。
2,bean與數(shù)據(jù)庫字段映射關系,通過注解設置到bean中,不必在sql腳本中體現(xiàn)。
3,sql腳本支持類似jsp的寫法,且不必區(qū)分select、update使用不同標簽,更加靈活。
4,不需要使用插件,內(nèi)置支持物理分頁。
5,不需要使用插件,內(nèi)置支持針對bean的標準增刪改查功能。
6,不需要使用插件,內(nèi)置支持讀寫分離,分庫分表。
7,針對mysql5.7支持動態(tài)字段。
支持mapper、template、非orm三種模式支撐業(yè)務系統(tǒng)
1,mapper指,通過掃描接口,運行時自動生成dao實例;
2,template指,通過繼承template標準父類,生成dao子類;
3,非orm指,直接使用microDao實例,可以執(zhí)行非orm更靈活的數(shù)據(jù)庫操作。
關于事務
由于serviceBean接口對象通過包掃描發(fā)布為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和數(shù)據(jù)源切換aop
事務aop,可在加載時,識別Transactional注解,實現(xiàn)事務控制。
可自行別寫特定功能代理。
開啟代理需要在groovy的類中設置MicroAop注解指定代理類
@MicroAop(name=[MicroDefaultLogProxy.class,MicroTMProxy.class,MicroDbProxy.class], property=["","",""])
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。