JFinal 3.5 釋出,將能上的菜先上了
jfinal 新功能經過 6 個月的醞釀、開發,在大幅度的創新來臨之前,jfinal 3.5 這一版先穩一穩,趁著國慶長假,將能上的菜先上了。
jfinal 3.5 這一版針對這 6 個月以來使用者反饋最強烈、最頻繁的需求進行了開發,同時對原有程式碼進行了極其精緻的優化與打磨。
jfinal 3.5 諸多內部優化值得升級使用,諸多基礎性調整為下一步進化做好準備。
1、Controller 依賴注入
jfinal 3.5 添加了 Controller 依賴注入功能,使用前需要配置啟用該功能:
public void configConstant(Constants me) { me.setInjectDependency(true); }
然後在 Controller 中只需對屬性使用 @Inject 註解即可:
public class MyController extends Controller { @Inject Service service; public void index() { service.justDoIt(); } }
新增該功能主要目標是為了自動化觸發業務層 AOP 與進一步減少程式碼量,如上程式碼中的 Service 中使用的 @Before 配置的攔截器會自動生效,而老版本需要手動 enhance 一次。
2、Interceptor 依賴注入
@Inject 還可以向攔截器屬性注入依賴物件,用法與 Controller 之中完全一樣:
public class MyInterceptor implements Interceptor { @Inject Service service; public void intercept(Invocation inv) { service.justDoIt(); } }
jfinal 依賴注入功能與 spring 有著本質的不同,jfinal 依賴注入的核心目標是為了實現 AOP 自動化與節省程式碼量,而且與 IOC/">IOC 毫無關係,更不需要 IOC 容器。極簡設計,實現該功能只用了 243 行程式碼。
3、Aop 任意時空支援 AOP 及 Inject
jfinal 3.5 添加了 Aop 工具類用來全面取代老版本中的 Enhancer,可在任意地方通過 Aop.get(…) 方法建立 AOP 代理物件,實現 AOP 功能的同時進行依賴注入:
Service service = Aop.get(Service.class);
以上程式碼會建立 Service 物件,如果 Service 中使用了 @Before 配置過攔截器將會自動生效,如果 Service 中的屬性使用了 @Inject,則會被注入依賴物件。還可通過 Aop.inject(...) 方法來注入依賴物件:
Service service = new Service(); service = Aop.inject(service);
以上程式碼會為 service 中的 @Inject 屬性注入依賴物件 ,Aop.inject(...) 方法相對於 Aop.get(...) 少一個物件建立過程。Aop 可以在 Controller、Interceptor 之外快捷使用 AOP、Inject 功能。
4、主幹版本加入 action 引數注入功能
由於老版本照顧了 java 1.6、1.7 使用者編譯級別為 1.6,action 引數注入功能做到了 jfinal-java8 分支版本之中。 jfinal 3.5 最低要求 JDK 1.8, action 引數注入功能自然也就做到了主幹之中:
public class LoginController extends Controller { public void index(String userName, String password) { Ret ret = service.login(userName, password); renderJson(ret); } }
以上 index() 這個 action 被注入了 userName、password 形參,省去了對 getPara、getFile 系列方法的呼叫程式碼,將進一步提升開發效率。該功能還支援 File、Model、RawData、Date 等常用型別,還可以通過擴充套件 IParaGetter 介面實現注入任意型別的資料。本功能由 @瑪雅牛 大神貢獻,再次感謝 @瑪雅牛。
5、jetty server 模組升級為 2018.11 版本
jetty server 模組升級到 jetty 最新版 9.4.12.v20180830, 由於是 java 8 起步,使用者可自由升級 jetty 到未來的更高版本。升級後的 jetty server 支援所有版本的 eclipse,支援 IDEA 熱載入,並且統一 eclipse、IDEA 啟動引數:
JFinal.start("src/main/webapp", 80, "/", 5);
老版本 jetty server 無法在部分高版本 eclipse 中使用,無法在 IDEA 下支援熱載入,jetty server 最新版 maven 座標如下:
<dependency> <groupId>com.jfinal</groupId> <artifactId>jetty-server</artifactId> <version>2018.11</version> </dependency>
6、NotAction 註解
NotAction 註解用於 Controller 上原本為 action 的方法之上,可以強制該方法不成為 action:
public abstract class BaseController extends Controller @NotAction public void getLoginUser() { ...... } }
以上程式碼中的 getLoginUser() 將不會成為 action,不會生成訪問路由,老版本中的 @Before(NotAction.class) 可改用 @NotAction 註解實現。
7、Controller 新增 getRawData()
getRawData() 便於接收客戶端傳送過來的 json 或者 xml 資料:
public void index() { String jsonStr = getRawData(); User user = FastJson.getJson().parse(jsonStr, User.class); }
getRawData() 有助於提升 API 型專案的開發體驗,在減少程式碼的同時進一步提升開發效率。
8、Controller 新增 getKv()
getKv() 將表單引數封裝成 Kv/HashMap 物件,方便使用其中的一些工具方法:
public void index() { renderJson(getKv()); }
9、enjoy 模板支援自定義 Field表示式
如下程式碼將支援 object.field 表示式訪問 isField() 方法:
Engine.addFieldGetterToLast(new FieldGetters.IsMethodFieldGetter());
通過擴充套件 IFieldGetter 介面,可以自由定製 object.field 表示式的獲取方式。
10、改進 ClassPathSource
解決 URL.openConnection() 在 linux 下開啟檔案控制代碼不能及時關閉的問題。
上述是一些看得到、感知得到的增強與改進,此外還有超過 50 項的內部優化、打磨是看不到的,後續會在 changelog 中整理出來。精益求精的 jfinal 3.5 版本,值得你升級。
One More Thing:
近幾天俱樂部將會線上直播講解 jfinal 3.5 與 club 1.6 的新功能與新用法。與 jfinal 3.5 一同釋出的還有俱樂部專享專案 jfinal club 1.6,該專案提供一套極簡的許可權管理以及內容管理後臺,截圖與功能介紹猛擊 ofollow,noindex">傳送門 ,現在就加入俱樂部獲取專享福利:http://www.jfinal.com/club