Jfinal的业务组件设计

莫莫水心 发布于 2013/12/05 19:29
阅读 495
收藏 0

@JFinal 你好,想跟你请教个问题:我想基于Jfinal扩展一套业务组件形式的业务框架,我想每个业务组件上有基于业务组件的Inteceptor,我看了下源码,打算从handler这一层根据url走向不同的业务组件,只是每个controller(Action)上的inteceptor是在Jfinal框架启动时候就已经加载好了,有什么方法不改源码就可以扩展的方法么,我就是想controller上边的inteceptor栈自己定义,自己加载,如果Intecptor上边再保留一层Handler呢,怎么处理?

加载中
0
菜根乱谭
菜根乱谭

我现在设计的基于插件化的平台已经实现了这个想法,还是要利用拦截器栈来实现。分享几段我的实现:

首先提供一个拦截器栈的基类:主要是按照一定规则加载相应的拦截器,加到拦截器栈中


/**
 * 骆驼拦截器栈,提供默认实现
 * 
 * @author yongtree
 * @date 2013-7-9 下午3:05:40
 * @version 1.0
 * 
 */
public class CamelInterceptorStack extends InterceptorStack {

	@Override
	public void config() {
		List<Interceptor> list = Camel.me().getIntercepterStackMap().get(this.getClass()
				.getName());
		if (list != null && list.size() > 0) {
			for (Interceptor i : list) {
				addInterceptors(i);
			}
		}else{
			addInterceptors(new DefaultInterceptor());
		}

	}

}

class DefaultInterceptor implements Interceptor{

	@Override
	public void intercept(ActionInvocation ai) {
		ai.invoke();
	}
	
}



在自定义的拦截器栈上继承上面的基类:

/**
 * 账户设置拦截器
 * 
 * @author yongtree
 * @date 2013-7-22 上午11:37:18
 * @version 1.0
 * 
 */
public class ProfileSetInterceptorStack extends CamelInterceptorStack {

	@Override
	public void config() {
		addInterceptors(new ProfileSetInterceptor());
		super.config();
	}
	
	class ProfileSetInterceptor implements Interceptor{

		public void intercept(ActionInvocation ai) {
			BaseController controller = (BaseController) ai.getController();
			if(controller.getLoginUser()==null){
				controller.setCommonMsg(CamelConstants.STAUTS_USER_NOT_LOGIN);
				controller.renderJson();
			}else{
				ai.invoke();
			}
		}
		
	}

}



// 资料设置
	@Before({ProfileSetInterceptorStack.class,Tx.class})
	public void profile_set() {
//省略处理逻辑
}



简单介绍一下拦截器的注册,就是下面这段话中取用的拦截器如何注册进来。主要来源于本平台最核心的插件注册器,插件注册的时候会把拦截器注册进来,保存在平台的拦截器上下文中,明年平台正式开源时再详细介绍,希望对你有帮助。
Camel.me().getIntercepterStackMap().get(this.getClass()
				.getName())


莫莫水心
莫莫水心
能否代码分享下,最近正在研究这个,462968254@qq.com ,谢了
0
JFinal
JFinal

     JFinal 提供了InterceptorStack 支持自定义拦截器栈应该可以满足你的需求。另外 JFinal 在系统启动的时候就将 Action、Interceptor 全部装配完成,而并不是在运行时动态反射来组装,这样可以提升性能。

    总的来说,前端发起对 JFinal 的请求之后,一路上都是明确的方法调用,包括 AOP 也是普通的方法调用,未使用反射机制,这样就尽可能提升了 JFinal 的性能。

0
JFinal
JFinal
    回到你的问题,其实不太明白你的具体需求,最好是贴出代码
0
莫莫水心
莫莫水心

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

我现在设计的基于插件化的平台已经实现了这个想法,还是要利用拦截器栈来实现。分享几段我的实现:

首先提供一个拦截器栈的基类:主要是按照一定规则加载相应的拦截器,加到拦截器栈中


/**
 * 骆驼拦截器栈,提供默认实现
 * 
 * @author yongtree
 * @date 2013-7-9 下午3:05:40
 * @version 1.0
 * 
 */
public class CamelInterceptorStack extends InterceptorStack {

	@Override
	public void config() {
		List<Interceptor> list = Camel.me().getIntercepterStackMap().get(this.getClass()
				.getName());
		if (list != null && list.size() > 0) {
			for (Interceptor i : list) {
				addInterceptors(i);
			}
		}else{
			addInterceptors(new DefaultInterceptor());
		}

	}

}

class DefaultInterceptor implements Interceptor{

	@Override
	public void intercept(ActionInvocation ai) {
		ai.invoke();
	}
	
}



在自定义的拦截器栈上继承上面的基类:

/**
 * 账户设置拦截器
 * 
 * @author yongtree
 * @date 2013-7-22 上午11:37:18
 * @version 1.0
 * 
 */
public class ProfileSetInterceptorStack extends CamelInterceptorStack {

	@Override
	public void config() {
		addInterceptors(new ProfileSetInterceptor());
		super.config();
	}
	
	class ProfileSetInterceptor implements Interceptor{

		public void intercept(ActionInvocation ai) {
			BaseController controller = (BaseController) ai.getController();
			if(controller.getLoginUser()==null){
				controller.setCommonMsg(CamelConstants.STAUTS_USER_NOT_LOGIN);
				controller.renderJson();
			}else{
				ai.invoke();
			}
		}
		
	}

}



// 资料设置
	@Before({ProfileSetInterceptorStack.class,Tx.class})
	public void profile_set() {
//省略处理逻辑
}



简单介绍一下拦截器的注册,就是下面这段话中取用的拦截器如何注册进来。主要来源于本平台最核心的插件注册器,插件注册的时候会把拦截器注册进来,保存在平台的拦截器上下文中,明年平台正式开源时再详细介绍,希望对你有帮助。
Camel.me().getIntercepterStackMap().get(this.getClass()
				.getName())


我的想法和你差不多,只不过你是自定义了一套拦截器堆栈,然后注解到方法或者类上边,而我想的是最开始启动的时候,读取配置文件或者什么方式,对不同的业务组件加载对应的拦截器
0
莫莫水心
莫莫水心

引用来自“JFinal”的答案

    回到你的问题,其实不太明白你的具体需求,最好是贴出代码
其实就是 http://www.oschina.net/question/925382_123627这个链接的需求
返回顶部
顶部