前面几篇文章已经讲了一些组件了,今天我们就开始实实在在的动手三分钟完成我们的第一个业务bundle,写一个服务提供对数据的CRUD功能。
我们写一个demo完成学生信息的crud功能。
1、进入osmp下载目录,复制粘贴osmp-utils 并改名为 osmp-demo
2、进入osmp-demo目录,修改pom.xml为以下内容
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.osmp.baseweb</groupId> <artifactId>osmp-parent</artifactId> <version>1.0.0</version> </parent> <artifactId>osmp-demo</artifactId> <packaging>bundle</packaging> <name>osmp-demo</name> <build> <plugins> <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <extensions>true</extensions> <configuration> <instructions> <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName> <Export-Package></Export-Package> <Import-Package> org.springframework.aop, org.springframework.aop.framework, org.springframework.cglib, org.springframework.cglib.proxy, org.springframework.cglib.core, org.springframework.cglib.reflect, org.aopalliance.aop, org.aopalliance.intercept, *;resolution:=optional </Import-Package> </instructions> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>com.osmp.baseweb</groupId> <artifactId>osmp-intf-define</artifactId> <version>${osmp.version}</version> </dependency> <dependency> <groupId>com.osmp.baseweb</groupId> <artifactId>osmp-jdbc</artifactId> <version>${osmp.version}</version> </dependency> <dependency> <groupId>org.springframework.osgi</groupId> <artifactId>spring-osgi-core</artifactId> </dependency> <dependency> <groupId>org.osgi</groupId> <artifactId>org.osgi.core</artifactId> </dependency> </dependencies> </project>
- osmp-inf-define 组件是我们基础服务定义接口,业务开发需要实现里面的BaseDataService接口
- osmp-jdbc 是我们需要用到OSMP提供的数据源和封装好的dao模板功能。
- spring-osgi-core,org.osgi.core 照抄,springDM必须依赖。
- maven-bundle-plugin 插件是maven提供的在osgi环境下编译bundle的插件。先暂时照抄,以后再解释。
3、删除utils组件里类和配置,并修改包名,最后包结构如下:
osmp-demo
|src |main | java | com/osmp/demo/service
| resources | META-INF/spring
|test | java
| resources
|pom.xml
4、在osmp根目录下的父 pom.xml里 <modules></modules> 新增 <module>osmp-demo</module>
5、打开 eclipse 右键 import -> Existing Maven Projects -> Browse... 选择 osmp 目录后。在下面的 Projects: 把osmp-demo勾取起后点 Finish
6、数据库新建表 demo_user
CREATE TABLE `demo` ( `id` varchar(50) NOT NULL, `name` varchar(255) DEFAULT NULL, `age` int(11) DEFAULT NULL, `remark` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
7、新建实体对象User.java
/* * Project: OSMP * FileName: User.java * version: V1.0 */ package com.osmp.demo.service.user.entity; import com.osmp.jdbc.define.Column; /** * Description: * @author: wangkaiping * @date: 2016年8月25日 下午8:32:47上午10:51:30 */ public class User { @Column(mapField="id",name="id") private String id; @Column(mapField="name",name="name") private String name; @Column(mapField="age",name="age") private int age; @Column(mapField="remark",name="remark") private String remark; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getId() { return id; } public void setId(String id) { this.id = id; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getRemark() { return remark; } public void setRemark(String remark) { this.remark = remark; } }
@Column( mapField=数据库字段名称,name=实体对象名称)如果两者一致的话可以省略括号内的内容
8、新建用户接口和实现类(UserService.java,UserServiceImpl)
/* * Project: OSMP * FileName: UserService.java * version: V1.0 */ package com.osmp.demo.service.user; import java.util.List; import java.util.Map; import com.osmp.demo.service.user.entity.User; import com.osmp.jdbc.define.Page; /** * Description: * * @author: wangkaiping * @date: 2014年11月28日 下午5:27:33 */ public interface UserService { public String getUserName(String name); public int getUserAge(int age); public int cudUser(Map<String,Object> map); public List<User> queryList(Map<String, Object> map); public Page<User> queryListByPage(Map<String, Object> map); }
/* * Project: OSMP * FileName: UserServiceImpl.java * version: V1.0 */ package com.osmp.demo.service.user.impl; import java.util.Date; import java.util.List; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.osmp.jdbc.define.Page; import com.osmp.jdbc.support.JdbcDao; import com.osmp.cache.define.annotation.Cacheable; import com.osmp.demo.service.user.UserService; import com.osmp.demo.service.user.entity.User; /** * Description: * * @author: wangkaiping * @date: 2014年11月28日 下午5:28:39 */ @Service public class UserServiceImpl implements UserService { private Logger logger = LoggerFactory.getLogger(UserServiceImpl.class); @Autowired private JdbcDao jdbcDao; @Override public String getUserName(String name) { logger.info("==============demo test =========="+name); //jdbcDao.update("jwms.update.area.time", "jwms", new Date(),"app001301"); return "我的名字叫:" + name; } @Override public int getUserAge(int age) { return age; } @Override public int cudUser(Map<String, Object> map) { String sqlId = (String) map.get("sqlId"); String dbName = (String) map.get("dbName"); return jdbcDao.update(sqlId, map, dbName); } @Override public List<User> queryList(Map<String, Object> map) { String sqlId = (String) map.get("sqlId"); String dbName = (String) map.get("dbName"); return jdbcDao.queryForList(sqlId, dbName, map, User.class); } @Override public Page<User> queryListByPage(Map<String, Object> map) { String sqlId = (String) map.get("sqlId"); String dbName = (String) map.get("dbName"); int page = (int) map.get("page"); int size = (int) map.get("size"); return jdbcDao.queryForPage(sqlId, dbName, map, User.class, page, size); } }
9、 新建 DemoServiceImpl.java 实现BaseDataServices,最后osgi发布出的服务
/* * Project: OSMP * FileName: DemoServiceImpl.java * version: V1.0 */ package com.osmp.demo.service; import java.util.HashMap; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import com.osmp.demo.service.user.UserService; import com.osmp.intf.define.model.Parameter; import com.osmp.intf.define.service.BaseDataService; /** * Description: * @author: wangkaiping * @date: 2016年11月9日 下午5:31:09上午10:51:30 */ public class DemoServiceImpl implements BaseDataService{ @Autowired private UserService service; @Override public Object execute(Parameter parameter) { Object result = null; String op = parameter.getQueryMap().get("op"); Map<String,Object> paramMap = new HashMap<String, Object>(); paramMap.putAll(parameter.getQueryMap()); switch (op) { case "cud": result = service.cudUser(paramMap); break; case "query": result = service.queryList(paramMap); break; case "queryPage": result = service.queryListByPage(paramMap); break; default: break; } return result; } }
- 实现BaseDataService接口,重写execute方法
- 从方法的Parameter获取入参 op 操作类型,并调用不同的方法完成crud
- 这里方法传递我们使用map作为参数传递
10、在src/main/resources/META-INF/spring 目录下新建spring配置文件 bundle-context.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:osgi="http://www.springframework.org/schema/osgi" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi-1.2.xsd"> <context:component-scan base-package="com.osmp.demo.service"> </context:component-scan> <bean id="jdbcDao" class="com.osmp.jdbc.support.JdbcDao"></bean> <bean id="osmp.demo.service" class="com.osmp.demo.service.DemoServiceImpl" /> <osgi:service interface="com.osmp.intf.define.service.BaseDataService" ref="osmp.demo.service"> <osgi:service-properties> <entry key="name" value="osmp-demo" /> <entry key="mark" value="DEMO例子" /> </osgi:service-properties> </osgi:service> </beans>
- 这里我们的JdbcDao类是从依赖osmp-jdbc组件的。并在DemoServiceImpl里自动注入的。
- 与传统的spring相比,只是在spring命名空间里新增了一个spring-osgi的namespaces
- 通过osgi:service 将DemoServiceImpl 发布为一个osgi服务,服务名称为 osmp-demo
11、编写sql脚本。demo.xml
<?xml version="1.0" encoding="UTF-8" standalone="no" ?> <!DOCTYPE sqls SYSTEM "osmp_sql.dtd"> <sqls> <select id="demo.queryuser"> select * from demo_user <where> <if test="name not empty"> and name=:name </if> <if test="age not empty"> and age=:age </if> </where> </select> <insert id="demo.adduser"> insert into demo_user(id,name,age,remark) values(:id,:name,:age,:remark) </insert> <delete id="demo.deluser"> delete demo_user where id=:id </delete> <update id="demo.upuser"> update demo_user set <if test="name not empty"> name = :name </if> <if test="age not empty"> name = :age </if> <if test="remark not empty"> remark = :remark </if> <where> id = :id </where> </update> </sqls>
12、编写连接池配置文件 demo.osmp.jdbc.properties
osmp.jdbc.name=demo osmp.jdbc.driverClassName=com.mysql.jdbc.Driver osmp.jdbc.url=jdbc:mysql://10.2.1.9:3306/demo?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8 osmp.jdbc.username=xxx osmp.jdbc.password=xxx osmp.jdbc.initialSize=5 osmp.jdbc.maxActive=100 osmp.jdbc.minIdle=5 osmp.jdbc.maxWait=3000 osmp.jdbc.validationQuery=select 1 osmp.jdbc.timeBetweenEvictionRunsMillis=100000 osmp.jdbc.minEvictableIdleTimeMillis=30000 osmp.jdbc.removeAbandonedTimeout=30000
13、将sql脚本和 连接池配置文件分别上传到${servicemix_home}/etc/sqls ${servicemix_home}/etc/datasources 目录
14、osmp-demo mvn install 将osmp-demo.jar上传到${servicemix_home}/deploy 目录
到此我们的服务开发完毕。
新增一条数据
http://xxx.xxx.xxx.xxx:8181/cxf/service/osmp-demo?source={"from":"test"}¶meter={"dbName":"demo","op":"cud","sqlId":"demo.adduser","id":"100000","name":"zhangsang","age":"20","remark":'woshizhangsan"}
查询一条数据(根据名称查询)
http://xxx.xxx.xxx.xxx:8181/cxf/service/osmp-demo?source={"from":"test"}¶meter={"dbName":"demo","op":"query","sqlId":"demo.queryuser","name":"zhangsang"}
分页查询
http://xxx.xxx.xxx.xxx:8181/cxf/service/osmp-demo?source={"from":"test"}¶meter={"dbName":"demo","op":"queryPage","sqlId":"demo.queryuser","page":"1","size":"10"}
删除
http://xxx.xxx.xxx.xxx:8181/cxf/service/osmp-demo?source={"from":"test"}¶meter={"dbName":"demo","op":"cud","sqlId":"demo.deluser","id":"100000"}
- osmp-demo 服务名称。对应上面spring配置文件里发布的osgi:service里的 服务名称 name
- source={“from”:“test”} 这里是OSMP规定的。用来标识请求来源的,可以自己扩充 from 字段必须有。
- parameter json参数
- dbName:数据库名称 这里我们是demo
- op:我们在DemoServiceImpl里定义的操作符
- sqlId:对于我们操行这个操作时需要使用到的sql脚本里的哪个一个sql语句
- 其它的参数根据业务自己定义。
这里入参我是使用json的格式来定义的。可以无限扩充。
当你做完这一切的时候差不多三分钟的时候,你可以定义一个通用的增删改查服务。以后你只需要给一个sql的标识和一个数据库的名称。你就可以得到你想要的结果,根本只要会sql的就可以开发。是不是感觉有点儿意思了。。。。。
sql脚本基本上只要你能写出来的语句。都应该能被解析执行。下面的一些sql例子是真实线上跑起来的。大家可以看看。
我真心觉得,osmp 已经被业务线给玩坏了。。。。
感兴趣的同学可以把上面的demo部署后在osmp-web里进行实时管理。随时随地远程任意的替换和平滑升级。。。
感觉是不是开发一个osgi的服务是如此的简单了呢。。再也不用像eclipse那样新建plugin 工程。一个 一个的去选依赖的组件。。。。。。
今天就先到这儿吧,下一节我们会继续解讲osgi环境下集成cache组件。
相关推荐
《 OSGi实战》是学习OSGi的全面指导,利用与架构和开发人员相关的示例清楚地讲解OSGi概念,同时探讨了很多实践场景和技术,阐述了开发人员有多需要OSGi,怎么将OSGi嵌入其他容器中,将遗留系统移入OSGi的最佳实践,...
在OSGI实战教程中,首先需要了解OSGI(Open Services Gateway Initiative)是一个由众多IT公司共同制定的Java模块化标准规范,旨在实现软件组件的热插拔和服务动态管理。OSGI技术允许应用程序通过动态地安装、启动、...
- **OSGI简介**:OSGI(Open Service Gateway Initiative)是一种模块化平台标准,用于构建可复用的服务和应用程序。它最初被设计用于服务网关设备,但逐渐成为Java平台上通用的模块化标准。 - **目标与愿景**:本书...
OSGI(Open Services Gateway Initiative)是一种Java模块化系统,它允许开发者将应用程序分解为一系列可独立部署、更新和交互的服务。林昊所著的《OSGI实战》与《OSGI进阶》是深入理解OSGI技术的重要参考资料,适合...
为了弥补OSGi规范在应用指导方面的不足,四位活跃在OSGi开发第一线的技术专家联手打造了《OSGi实战》。《OSGi实战》面向OSGi规范的使用者,系统、全面、深入地阐述OSGi的重要特性及其使用方法。《OSGi实战》还介绍了...
1. 模块系统:OSGI的核心是模块化,每个模块称为Bundle,类似于Java中的JAR文件,但包含额外的元数据描述其依赖关系。 2. 服务:OSGI强调服务导向,允许模块之间通过服务接口进行通信,增强了组件间的解耦。 3. 生命...
1. **模块系统**:OSGi的核心是模块化,每个模块称为一个Bundle,它包含类、资源和元数据。Bundle之间通过导出和导入包来实现依赖关系。 2. **生命周期管理**:OSGi Bundle有启动、停止、安装、更新和卸载等状态,...
资源名称:OSGi实战内容简介:为了弥补OSGi规范在应用指导方面的不足,四位活跃在OSGi开发第一线的技术专家联手打造了《OSGi实战》。《OSGi实战》面向OSGi规范的使用者,系统、全面、深入地阐述OSGi的重要特性及其...
"osgi实战源码"这一描述进一步强调了这是一份可以动手实践的源代码,它以一个具体的购物车案例为背景,展示了如何在项目中运用OSGi技术。这个购物车实例旨在帮助开发者理解OSGi的灵活性、模块化特性以及其在可扩展性...
OSGI(Open Services Gateway Initiative)是一种开放标准的Java模块化系统,它允许开发人员将应用程序分解为一组可独立更新和管理的模块。这些模块被称为服务,它们之间通过接口进行交互,使得OSGI环境下的组件化...
1. **OSGi基础**:首先,会介绍OSGi的基本概念,包括bundle、服务、生命周期管理等,以及OSGi框架如何处理模块间的依赖关系。 2. **Bundle的创建与管理**:阐述如何编写符合OSGi规范的Java代码,构建bundle,并且...
1. **模块系统**:OSGI的基础是模块化,每个模块称为一个Bundle,它们有自己的类路径和生命周期。理解Bundle的概念及其与其他Java类加载器的区别至关重要。 2. **服务注册与发现**:OSGI强调服务导向,允许模块之间...
1. Equinox:由Eclipse基金会开发,是OSGI参考实现之一,广泛用于Eclipse IDE和其他企业级项目。 2. Oscar:Apache Felix项目的一部分,也是一个流行的开源OSGI实现。 3. Knopflerfish:轻量级且功能丰富的OSGI框架...
7. **Blueprint和Declarative Services**:讲解OSGI中两种常见的服务配置方式,Blueprint XML和Declarative Services,它们简化了服务的声明和管理。 8. **Equinox与Felix**:作为OSGI实现的两个主流框架,Equinox...
OSGI(Open Services Gateway Initiative)是一种Java平台上的模块化系统和服务标准,它允许软件开发者将应用程序分解为独立的、可热插拔的组件,这些组件称为“bundle”。OSGI实战这本书是面向对OSGI技术感兴趣的...
《OSGi实战》一书由BlueDavy撰写,是一份详尽的OSGi入门与实战指南,适合初学者和有经验的开发者深入了解OSGi框架及其应用。以下是对该书籍核心知识点的总结: ### OSGi简介 OSGi(Open Service Gateway Initiative...
1. **模块化**:OSGI的核心是模块化,它将Java应用程序划分为一个个独立的模块,每个模块称为一个Bundle。每个Bundle都包含自己的类路径,有自己的生命周期,并可以独立地安装、启动、更新和卸载。 2. **服务**:...
网上收集的OSGI资料. 包括: OSGi原理与最佳实践(精选版).pdf OSGI实战和源码.rar osgi进阶.pdf Introduce.OSGi.ppt OSGi.in.action.ppt r4.cmpn.pdf r4.core.pdf r4.enterprise.pdf