如何基于JFinal实现业务层的插件体系?

玛雅牛 发布于 2013/08/29 09:15
阅读 958
收藏 3
如果想在jfinal框架的基础上实现更高一级的业务平台,主要是内核+公共资源+插件(有自己的MVC)的方式,各位有没有好的方案或者建议。
加载中
1
菜根乱谭
菜根乱谭

我现在做的东西基本上实现了业务层的插件体系,现在正在项目中实践,利用到的就是jfinal提供的那几个扩展点。

用handler扩展url,用interceptor扩展业务逻辑,用beetl扩展前端展现。

下图为截取的插件包下的插件:

每个插件提供一个config.xml文件,提供一个config基类,用来注册插件的各种扩展。在jfinalconfig类中来解析config.xml,并调用各自的config类,进行各种资源的注册。

/**
 * 为平台插件提供的配置类,插件提供一个配置类,该类继承自本类,并提供一个xml文件来配置该类以供 camel.config.Config调用
 * 
 * @author yongtree
 * @date 2013-7-9 上午9:35:34
 * @version 1.0
 * 
 */
public abstract class CamelPluginConfig {


/**
* Config route
*/
public abstract void configRoute(Routes me);


/**
* Config plugin
*/
public abstract void configPlugin(Plugins me);


/**
* Config interceptor applied to all actions.
*/
public abstract void configInterceptor(Interceptors me);


/**
* Config handler
*/
public abstract void configHandler(Handlers me);


/**
* Config beetl group template
*/
public abstract void configGroupTemplate(GroupTemplate gt);


/**
* Config before intercepter All extensions by before intercepter
*/
public abstract Map<String, Interceptor> configBeforeInterceptor();
/**
* Config before intercepter All extensions by before intercepter
*/
public abstract Map<String, CamelFileService> configFileService();

/**
* user uuid gen unique
*/
public abstract String getId();

/**
* server startup init 
*/
public abstract void initStartup();
}


业务逻辑扩展点切入采用拦截器栈实现,拦截器栈的拦截器由各插件注册,以更改或者扩展业务逻辑。

0
令狐乐儿
令狐乐儿
个人愚见,插件系统只是一种源码组织形式,可能是我水平不够吧,也试过搞个框架框住一部分做成插件 4、5月份的时候尝试过用osgi做插件系统,后来问题越搞越多,因为osgi的问题,放弃了,现在通过合适的解耦方式,比如注解加上开发文件放置约定就可以做到相当于插件的效果 ,现在用注解扫描去掉了Jfinalconfig里面部分耦合的代码,现在每个control,handle等都是独立的插件,放到lib或者class中就可以加载  无需配置,如果基于我目前的方案非得插件,做个类似rpm的包管理工具,分发各种资源就可以了。 
0
玛雅牛
玛雅牛

引用来自“蒜头小小”的答案

个人愚见,插件系统只是一种源码组织形式,可能是我水平不够吧,也试过搞个框架框住一部分做成插件 4、5月份的时候尝试过用osgi做插件系统,后来问题越搞越多,因为osgi的问题,放弃了,现在通过合适的解耦方式,比如注解加上开发文件放置约定就可以做到相当于插件的效果 ,现在用注解扫描去掉了Jfinalconfig里面部分耦合的代码,现在每个control,handle等都是独立的插件,放到lib或者class中就可以加载  无需配置,如果基于我目前的方案非得插件,做个类似rpm的包管理工具,分发各种资源就可以了。 

多谢您的分享,osgi我也没有考虑过。主要是要解决多人开发时的模块分隔与组装问题。您说的基于注解的方式不错,可以考虑下,你这解决了java代码相关的插件化问题,view层的东西还得想想办法。

0
leon_lau
leon_lau

引用来自“谭明智”的答案

我现在做的东西基本上实现了业务层的插件体系,现在正在项目中实践,利用到的就是jfinal提供的那几个扩展点。

用handler扩展url,用interceptor扩展业务逻辑,用beetl扩展前端展现。

下图为截取的插件包下的插件:

每个插件提供一个config.xml文件,提供一个config基类,用来注册插件的各种扩展。在jfinalconfig类中来解析config.xml,并调用各自的config类,进行各种资源的注册。

/**
 * 为平台插件提供的配置类,插件提供一个配置类,该类继承自本类,并提供一个xml文件来配置该类以供 camel.config.Config调用
 * 
 * @author yongtree
 * @date 2013-7-9 上午9:35:34
 * @version 1.0
 * 
 */
public abstract class CamelPluginConfig {


/**
* Config route
*/
public abstract void configRoute(Routes me);


/**
* Config plugin
*/
public abstract void configPlugin(Plugins me);


/**
* Config interceptor applied to all actions.
*/
public abstract void configInterceptor(Interceptors me);


/**
* Config handler
*/
public abstract void configHandler(Handlers me);


/**
* Config beetl group template
*/
public abstract void configGroupTemplate(GroupTemplate gt);


/**
* Config before intercepter All extensions by before intercepter
*/
public abstract Map<String, Interceptor> configBeforeInterceptor();
/**
* Config before intercepter All extensions by before intercepter
*/
public abstract Map<String, CamelFileService> configFileService();

/**
* user uuid gen unique
*/
public abstract String getId();

/**
* server startup init 
*/
public abstract void initStartup();
}


业务逻辑扩展点切入采用拦截器栈实现,拦截器栈的拦截器由各插件注册,以更改或者扩展业务逻辑。

0
玛雅牛
玛雅牛

引用来自“谭明智”的答案

我现在做的东西基本上实现了业务层的插件体系,现在正在项目中实践,利用到的就是jfinal提供的那几个扩展点。

用handler扩展url,用interceptor扩展业务逻辑,用beetl扩展前端展现。

下图为截取的插件包下的插件:

每个插件提供一个config.xml文件,提供一个config基类,用来注册插件的各种扩展。在jfinalconfig类中来解析config.xml,并调用各自的config类,进行各种资源的注册。

/**
 * 为平台插件提供的配置类,插件提供一个配置类,该类继承自本类,并提供一个xml文件来配置该类以供 camel.config.Config调用
 * 
 * @author yongtree
 * @date 2013-7-9 上午9:35:34
 * @version 1.0
 * 
 */
public abstract class CamelPluginConfig {


/**
* Config route
*/
public abstract void configRoute(Routes me);


/**
* Config plugin
*/
public abstract void configPlugin(Plugins me);


/**
* Config interceptor applied to all actions.
*/
public abstract void configInterceptor(Interceptors me);


/**
* Config handler
*/
public abstract void configHandler(Handlers me);


/**
* Config beetl group template
*/
public abstract void configGroupTemplate(GroupTemplate gt);


/**
* Config before intercepter All extensions by before intercepter
*/
public abstract Map<String, Interceptor> configBeforeInterceptor();
/**
* Config before intercepter All extensions by before intercepter
*/
public abstract Map<String, CamelFileService> configFileService();

/**
* user uuid gen unique
*/
public abstract String getId();

/**
* server startup init 
*/
public abstract void initStartup();
}


业务逻辑扩展点切入采用拦截器栈实现,拦截器栈的拦截器由各插件注册,以更改或者扩展业务逻辑。

多谢分享,基于配置问价的方式也不错,view层的问题也解决了。我这使用httl还得想想办法。
0
Jacky_D_H
Jacky_D_H
@玛雅牛 ,对这个问题有兴趣,不知楼主现在有没有一个可行的解决方案呢?
0
玛雅牛
玛雅牛

引用来自“Jacky_D_H”的评论

@玛雅牛 ,对这个问题有兴趣,不知楼主现在有没有一个可行的解决方案呢?
基本上和一楼一个思路,不过我主要是使用注解实现的。
0
Jacky_D_H
Jacky_D_H

引用来自“Jacky_D_H”的评论

@玛雅牛 ,对这个问题有兴趣,不知楼主现在有没有一个可行的解决方案呢?

引用来自“玛雅牛”的评论

基本上和一楼一个思路,不过我主要是使用注解实现的。
等你大作分享~~
0
玛雅牛
玛雅牛

引用来自“Jacky_D_H”的评论

@玛雅牛 ,对这个问题有兴趣,不知楼主现在有没有一个可行的解决方案呢?

引用来自“玛雅牛”的评论

基本上和一楼一个思路,不过我主要是使用注解实现的。

引用来自“Jacky_D_H”的评论

等你大作分享~~
最近忙得没有时间睡觉。年前闲下来分享。
返回顶部
顶部