JOxygen 轻量级 Java 框架开源项目

我要开发同款
匿名用户2018年11月13日
170阅读

技术信息

开源地址
https://gitee.com/justlive1/oxygen
授权协议
Apache

作品详情

JOxyge

轻量级Java框架

介绍

一个轻量级Java框架

oxyge-core核心部分

基于cglib的aop实现

提供缓存管理和基于注解的缓存,内置LocalCache和Ehcache实现,可扩展

配置管理,支持${attrs.key:defaultValue}表达式获取配置

加解密管理,提供加解密服务内置基础加密实现,例如SHA-1、SHA-256、MD5

异常管理,提供异常包装,统一异常编码,便于国际化

提供基于构造器注入的ioc(原因:依赖链清晰,并可任意切换ioc实现)

定时任务服务,内置提供了基于注解的定时任务服务

├─ src/mai  │─ java/.../core  //oxyge-core代码目录  │  │- aop //aop实现目录  │  │- cache //缓存实现目录  │  │- cofig  //配置实现目录  │  │- costat  //常量目录  │  │- covert  //类型转换实现目录  │  │- crypto  //密码加密目录  │  │- domai  //基础实体目录  │  │- exceptio  //异常管理目录  │  │- io  //io读写目录  │  │- ioc  //ioc实现目录  │  │- job  //定时任务实现目录  │  │- sca  //类扫描实现目录  │  │- util  //工具类目录  │  │- Bootstrap.java  //框架启动引导类  │  └- Plugi.java   //插件接口  └─ resources/META-INF/services     └- ...core.Plugi  //Plugi服务实现配置文件

oxyge-jdbcjdbc实现

小巧简单的jdbc实现,纯jdk实现,无第三方jar

支持多数据源

基于sql进行crud,不提供类似Hiberate的链式方法(原因:sql作为数据库领域的DSL,已经很自然优雅,Lessismore)

├─ src/mai  │─ java/.../jdbc  //oxyge-jdbc代码目录  │  │- cofig  //配置数据源目录  │  │- hadler  //处理器目录,包括结果集处理 行处理 列处理  │  │- iterceptor  //拦截器目录,拦截sql执行前后及异常  │  │- record  //基础crud  │  │- Jdbc.java  //Jdbc核心操作类,提供crud操作  │  │- JdbcExceptio.java  //jdbc异常封装  │  └- JdbcPlugi.java   //jdbc插件,与oxyge-core配套使用  └─ resources/META-INF/services     │- ...hadler.ColumHadler //列处理服务配置文件     └- ...core.Plugi  //增加jdbcPlugi服务实现,与oxyge-core配套使用

oxyge-web

项目使用了Servlet3.0的ServletCotaierIitializer接口

在servlet中可自动加载,不需要在web.xml中配置

使用@Router标记路由文件

使用@Mappig标记请求路径处理方法

参数绑定的取值域使用@Param,@HeaderParam,@CookieParam,@PathParam指定,默认为@Param

参数绑定支持简单类型+Map<Strig,Object>+用户实体类

支持返回Jso、视图或自定义实现(文件下载等)

├─ src/mai  │─ java/.../web  //oxyge-web代码目录  │  │- hadler //参数绑定处理  │  │- http //http请求解析  │  │- mappig  //url映射,参数映射相关注解和实体  │  │- router  //一个示例路由(获取服务器时间)  │  │- server  //内置server接口和启动类  │  │- view  //视图解析  │  │- DefaultWebAppIitializer.java  //默认初始化实现  │  │- DispatcherServlet.java  //路由分发器  │  │- WebAppIitializer.java  //web自动初始化接口,提供给用户自定义使用  │  │- WebCotaierIitializer.java  //容器自动初始化  │  │- WebCof.java  //web配置  │  └- WebPlugi.java  //web插件  └─ resources/META-INF/services      │- ...ServletCotaierItializer //servlet3.0规范      │- ...core.Plugi  //增加web插件      │- ...ParamHadler //参数处理服务      │- ...RequestParse //请求解析服务      └- ...ViewResolver //视图解析服务特性

轻量级,注释完善,使用简单

使用ServiceLoader加载插件,易于扩展

安装

添加依赖到你的pom.xml:

<!-- 核心包 包含aop ioc 异常处理 缓存 定时任务等 --><depedecy>    <groupId>vip.justlive</groupId>    <artifactId>oxyge-core</artifactId>    <versio>${oxyge.versio}</versio></depedecy><!-- jdbc实现 可单独使用 --><depedecy>    <groupId>vip.justlive</groupId>    <artifactId>oxyge-jdbc</artifactId>    <versio>${oxyge.versio}</versio></depedecy><!-- web实现 已依赖了core --><depedecy>    <groupId>vip.justlive</groupId>    <artifactId>oxyge-web</artifactId>    <versio>${oxyge.versio}</versio></depedecy><!-- 已依赖了web 并提供了embeded tomcat --><depedecy>    <groupId>vip.justlive</groupId>    <artifactId>oxyge-web-tomcat</artifactId>    <versio>${oxyge.versio}</versio></depedecy>快速开始基础返回

使用 Resp 作为返回

// 成功返回 code 00000Resp.success(Object obj);// 错误返回 默认code 99999Resp.error(Strig msg);// 错误返回 自定义codeResp.error(Strig code, Strig msg);异常处理

使用 Exceptios 抛出异常

// 创建 ErrorCodeErrorCode err = Exceptios.errorCode(Strig module, Strig code);ErrorCode err = Exceptios.errorMessage(Strig module, Strig code, Strig message);// 抛出uchecked异常throw Exceptios.wrap(Throwable e);throw Exceptios.wrap(Throwable e, Strig code, Strig message);throw Exceptios.wrap(Throwable e, ErrorCode errorCode, Object... argumets);// 抛出业务异常 不含堆栈信息throw Exceptios.fail(ErrorCode errCode, Object... params);throw Exceptios.fail(Strig code, Strig message, Object... params);// 抛出故障异常 包含堆栈信息throw Exceptios.fault(ErrorCode errCode, Object... params);throw Exceptios.fault(Strig code, Strig message, Object... params);throw Exceptios.fault(Throwable e, ErrorCode errCode, Object... params);throw Exceptios.fault(Throwable e, Strig code, Strig message, Object... params)IOC

通过注解使用IOC容器

// 在配置文件中添加扫包路径mai.class.sca=com.xxx.xxx,com.aaa.bbb// 使用 @Cofiguratio 和 @Bea@Cofiguratiopublic class Cof {   @Bea  Iter oDepBea() {    retur ew NoDepBea();  }}// 使用 @Bea 和 @Iject@Bea("depBea")public class DepBea implemets Iter {  private fial NoDepBea oDepBea;  @Iject  public DepBea(NoDepBea oDepBea) {    this.oDepBea = oDepBea;  }    ...}// 运行时获取beaIter iter = BeaStore.getBea("depBea", Iter.class);AOP

通过注解使用AOP

// 定义使用了Log注解的方法aop处理@Before(aotatio = Log.class)public void log(Ivocatio ivocatio) {  ...}// 目标方法添加注解@Logpublic void prit() {  ...}定时任务

使用注解 @Scheduled 标记一个方法需要作为定时任务

oApplicatioStart(),cro(),fixedDelay(),orfixedRate()必须配置其中一个

// 固定延迟任务 任务结束时间-下一个开始时间间隔固定@Scheduled(fixedDelay = "500")public void ru1() {  ...}// 固定周期任务 任务开始时间-下一个开始时间固定@Scheduled(fixedRate = "600")public void ru2() {  ...}// cro任务,并且程序启动后异步执行一次@Scheduled(cro = "0/5 * * * * ?", oApplicatioStart = true, asyc = true)public void ru3() {  ...}缓存

使用缓存有两种方式:

JCache.cache() 获取缓存然后调用api

使用 @Cacheable 注解给方法添加缓存

// 使用缓存api Cache cache = JCache.cache(cacheName);T value = cache.get(key, clazz);cache.set(key, value, duratio, timeUit);...// 使用注解@Cacheablepublic Object method() {  ...}@Cacheable(key = "args[0]", duratio = 10, timeUit = TimeUit.MINUTES)public Object method(Object arg0, Object arg1) {  ...}Jdbc基础使用

可配置多数据源

使用Jdbc进行crud

使用ResultSetHadler进行自定义类型转换处理

开启关闭事务

// 单独使用 需要自己创建并添加数据源...// 添加主数据源Jdbc.addPrimaryDataSource(DataSource dataSource)// 添加多数据源Jdbc.addDataSource(Strig ame, DataSource dataSource)// crudT Jdbc.query(Strig sql, Class<T> clazz, Object... params)List<T> Jdbc.queryForList(Strig sql, Class<T> clazz, Object... params)Map<Strig, Object> Jdbc.queryForMap(Strig sql, Object... params)List<Map<Strig, Object>> Jdbc.queryForMapList(Strig sql, Object... params)// 可自定义返回处理T Jdbc.query(Strig sql, ResultSetHadler<T> hadler, Object... params)it Jdbc.update(Strig sql, Object... params)// 开启主数据源的事务Jdbc.startTx()// 开启指定数据源的事务Jdbc.startTx(Strig dataSourceName)// 关闭主数据源的事务Jdbc.closeTx()// 关闭指定数据源的事务Jdbc.closeTx(Strig dataSourceName)// 回滚事务Jdbc.rollbackTx()// 回滚指定数据源的事务Jdbc.rollbackTx(Strig dataSourceName)// 基础crudOptio opt = ew Optio()...Record.isert(opt)Record.fidById(Optio.class, 1)Record.fid(opt)Record.update(opt)Record.deleteById(Optio.class, 1)Record.delete(opt);// 配合oxyge-core使用, 只需在配置文件中配置数据源即可自动装载// 多数据源名称datasource.multi=a// 主数据源datasource.logSql=truedatasource.driverClassName=org.h2.Driverdatasource.url=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1datasource.userame=sadatasource.password=sa// 数据源adatasource.a.driverClassName=org.h2.Driverdatasource.a.url=jdbc:h2:mem:a;DB_CLOSE_DELAY=-1datasource.a.userame=sadatasource.a.password=sa自定义列类型转换

实现 ColumHadler 接口进行自定义处理

增加 META-INF/services/vip.justlive.oxyge.jdbc.hadler.ColumHadler 文件,添加实现类的类名

public class MyColumHadler implemets ColumHadler {  @Override  public boolea supported(Class<?> type) {    ...  }  @Override  public Object fetch(ResultSet rs, it idex) throws SQLExceptio {    ...  }}// 新增或修改 META-INF/services/vip.justlive.oxyge.jdbc.hadler.ColumHadler 添加自定义类名xxx.xxx.MyColumHadler增加jdbc拦截

实现 JdbcIterceptor 接口

调用 Jdbc.addJdbcIterceptor 添加拦截

// 内置的sql打印拦截@Slf4jpublic class LogSqlJdbcIterceptor implemets JdbcIterceptor {  @Override  public void before(Strig sql, List<Object> params) {    if (log.isDebugEabled()) {      log.debug("execute sql: {} -> params: {}", sql, params);    }  }}// 添加拦截器Jdbc.addJdbcIterceptor(JdbcIterceptor iterceptor)web基础使用

使用@Router@Mappig@Param...等注解进行定义路由类和请求方法以及绑定参数

使用View进行视图跳转,非void,View的返回值默认使用jso处理

线程内使用Request.curret(),Respose.curret()获取请求和返回

// 使用 @Router标记路由@Router("/commo")public class CommoRouter {  // 标记请求路径和请求方式,默认支持所有请求 当返回值不是void且非View则为返回jso  @Mappig(value = "/localDate",method = HttpMethod.GET)  public Resp localDate() {    retur Resp.success(            LocalDate.ow().plusDays(offset).atStartOfDay(ZoeOffset.systemDefault()).toIstat()                .toEpochMilli());  }  // 页面渲染 需要返回View  @Mappig("/idex")  public View idex() {    View view = ew View();    view.setPath("/idex.jsp");    retur view;  }    // 重定向  @Mappig("/view")  public View idex() {    View view = ew View();    // 相对路径为容器内跳转 使用https://xxx则绝对跳转    view.setPath("/idex");    view.setRedirect(true);    retur view;  }    // 文件下载  @Mappig("dowload")  public void dowload(HttpServletRespose resp) throws IOExceptio {    resp.setCharacterEcodig("utf-8");    resp.setCotetType("applicatio/octet-stream;charset=utf-8");    resp.setHeader("Cotet-dispositio", "attachmet;fileame=xx.txt");    Files.copy(ew File("xxx.txt"), resp.getOutputStream());  }}// 获取当前线程的Request ResposeRequest.curret()Respose.curret()// 配置404错误页面跳转web.error.404.page=// 配置404自定义处理web.error.404.hadler=// 配置500错误页面跳转web.error.500.page=// 配置500自定义处理web.error.500.hadler=自定义视图解析

实现ViewResolver接口

通过ServiceLoader或WebPlugi.addViewResolver的方式进行添加自定义视图解析

// 内置的重定向和jso解析器public class DefaultViewResolver implemets ViewResolver {  @Override  public boolea supported(Object data) {    // 重定向    if (data != ull && data.getClass() == View.class && ((View) data).isRedirect()) {      retur true;    }    // ull 或者 非view 返回jso    retur data == ull || data.getClass() != View.class;  }  @Override  public void resolveView(HttpServletRequest request, HttpServletRespose respose, Object data) {    try {      if (data != ull && data.getClass() == View.class) {        View view = (View) data;        Strig redirectUrl = view.getPath();        if (!redirectUrl.startsWith(Costats.HTTP_PREFIX) && !redirectUrl            .startsWith(Costats.HTTPS_PREFIX)) {          redirectUrl = request.getCotextPath() + view.getPath();        }        respose.sedRedirect(redirectUrl);      } else {        respose.getWriter().prit(JSON.toJSONStrig(data));      }    } catch (IOExceptio e) {      throw Exceptios.wrap(e);    }  }}添加web启动执行类

只需实现WebAppIitializer接口,容器会自动加载

public class MyWebAppIitializer implemets WebAppIitializer {  @Override  public void oStartup(ServletCotext cotext) {    ...  }  @Override  public it order() {    ...  }}使用内置容器启动

依赖 oxyge-web-tomcat

在mai中使用 Server.start启动

<!-- 已依赖了web 并提供了embeded tomcat --><depedecy>    <groupId>vip.justlive</groupId>    <artifactId>oxyge-web-tomcat</artifactId>    <versio>${oxyge.versio}</versio></depedecy>public static void mai(Strig[] args) {  // 启动容器  Server.start();  ...  // 关闭容器  Server.stop();}

功能介绍

JOxygen 轻量级Java框架 介绍 一个轻量级Java框架 oxygen-core 核心部分 基于cglib的aop实现 提供缓存管理和基于注解的缓存,内置LocalCache和Ehcac...

声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论