Browse Source

jfinal 3.4

James 8 years ago
parent
commit
67068dd2c1

+ 22 - 0
src/main/java/com/jfinal/config/Constants.java

@@ -53,6 +53,7 @@ final public class Constants {
 	
 	private ITokenCache tokenCache = null;
 	private ControllerFactory controllerFactory = null;
+	private int configPluginOrder = 2;
 	
 	/**
 	 * Set development mode.
@@ -67,6 +68,27 @@ final public class Constants {
 	}
 	
 	/**
+	 * 配置 configPlugin(Plugins me) 在 JFinalConfig 中被调用的次序.
+	 * 
+	 * 取值 1、2、3、4、5 分别表示在 configConstant(..)、configRoute(..)、
+	 * configEngine(..)、configInterceptor(..)、configHandler(...)
+	 * 之后被调用
+	 * 
+	 * 默认值为 2,那么 configPlugin(..) 将在 configRoute(...) 调用之后被调用
+	 * @param 取值只能是 1、2、3、4、5
+	 */
+	public void setConfigPluginOrder(int configPluginOrder) {
+		if (configPluginOrder < 1 || configPluginOrder > 5) {
+			throw new IllegalArgumentException("configPluginOrder 只能取值为:1、2、3、4、5");
+		}
+		this.configPluginOrder = configPluginOrder;
+	}
+	
+	public int getConfigPluginOrder() {
+		return configPluginOrder;
+	}
+	
+	/**
 	 * Set the renderFactory
 	 */
 	public void setRenderFactory(IRenderFactory renderFactory) {

+ 19 - 5
src/main/java/com/jfinal/config/Routes.java

@@ -37,6 +37,8 @@ public abstract class Routes {
 	private List<Route> routeItemList = new ArrayList<Route>();
 	private List<Interceptor> injectInters = new ArrayList<Interceptor>();
 	
+	private boolean clearAfterMapping = true;
+	
 	/**
 	 * Implement this method to add route, add interceptor and set baseViewPath
 	 */
@@ -117,12 +119,24 @@ public abstract class Routes {
 				InterceptorManager.NULL_INTERS;
 	}
 	
+	/**
+	 * 配置是否在路由映射完成之后清除内部数据,以回收内存,默认值为 true.
+	 * 
+	 * 设置为 false 通常用于在系统启动之后,仍然要使用 Routes 的场景,
+	 * 例如希望拿到 Routes 生成用于控制访问权限的数据
+	 */
+	public void setClearAfterMapping(boolean clearAfterMapping) {
+		this.clearAfterMapping = clearAfterMapping;
+	}
+	
 	public void clear() {
-		routesList = null;
-		controllerKeySet = null;
-		baseViewPath = null;
-		routeItemList = null;
-		injectInters = null;
+		if (clearAfterMapping) {
+			routesList = null;
+			controllerKeySet = null;
+			baseViewPath = null;
+			routeItemList = null;
+			injectInters = null;
+		}
 	}
 	
 	public static class Route {

+ 17 - 1
src/main/java/com/jfinal/core/Config.java

@@ -48,11 +48,27 @@ class Config {
 	 */
 	static void configJFinal(JFinalConfig jfinalConfig) {
 		jfinalConfig.configConstant(constants);			initLogFactory();	initEngine();
-		jfinalConfig.configPlugin(plugins);				startPlugins();		// very important!!!
+		
+		configPluginWithOrder(1, jfinalConfig);
 		jfinalConfig.configRoute(routes);
+		
+		configPluginWithOrder(2, jfinalConfig);
 		jfinalConfig.configEngine(engine);
+		
+		configPluginWithOrder(3, jfinalConfig);
 		jfinalConfig.configInterceptor(interceptors);
+		
+		configPluginWithOrder(4, jfinalConfig);
 		jfinalConfig.configHandler(handlers);
+		
+		configPluginWithOrder(5, jfinalConfig);
+	}
+	
+	private static void configPluginWithOrder(int order, JFinalConfig jfinalConfig) {
+		if (order == constants.getConfigPluginOrder()) {
+			jfinalConfig.configPlugin(plugins);
+			startPlugins();		// very important!!!
+		}
 	}
 	
 	/**