歡迎閱讀我的開源項目《迷你微信》服務器與《迷你微信》客戶端
序言Spring是一個輕量級的java 開發框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中闡述的部分理念和原型衍生而來。它是為了解決企業應用開發的復雜性而創建的。框架的主要優勢之一就是其分層架構,分層架構允許使用者選擇使用哪一個組件,同時為 J2EE 應用程序開發提供集成的框架。Spring使用基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅限于服務器端的開發。從簡單性、可測試性和松耦合的角度而言,任何Java應用都可以從Spring中受益。Spring的核心是控制反轉(IoC)和面向切面(AOP)。簡單來說,Spring是一個分層的JavaSE/EEfull-stack(一站式) 輕量級開源框架。——百度百科
博主在《迷你微信》服務器項目上對Spring的使用主要在于依賴注入,也是Spring的核心功能,通過依賴注入的方法,我們就可以大量的減少動態創建和單例的使用,由Spring進行創建初始化和注入。
配置與使用關于Spring的環境配置就不在這里詳細說明了,只要在項目中導入Spring的jar包和添加applicationContext.xml文件就好了,在這里咱們主要講講applicationContext.xml文件的配置:
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"><!--上面的不用細看,都是配置必須的東西,主要是下面的東西 --><!-- Log模塊 --><bean id="MyLogger" class="server.MyLogger"></bean><!-- 網絡模塊 --><bean id="ServerNetwork" class="server.ServerNetwork"><property name="myLogger"><ref bean="MyLogger" /></property></bean>在這里,博主刪減了大量代碼,只為了簡要的介紹Spring的簡單使用,詳細代碼請參考開源項目《迷你微信》服務器。首先,創建了一個叫MyLogger的Bean,這個名字是你自己起的,后面的class參數是你這個類所在的項目位置;接著,是ServerNetwork,這個類具體是干啥的這里就不介紹了,與討論的東西無關。可以看到,ServerNetwork中有一個參數myLogger,而這個myLogger又有一個指向MyLogger的引用,代表的意義是,在Java的類ServerNetwork中,有一個叫myLogger的參數,這個參數所要設置的值為之前創建的一個叫做MyLogger的東東。這里,博主要向大家強調Spring的幾個特點:
在使用Mina框架時,Spring是可以跟Mina緊密結合的,讓Spring來創建Mina的整個連接過程是配置式編程的一種典型的做法,詳細可以參考官網介紹,博主表示官網說的太簡略,所以自己也只配出了一半左右。
初始化問題由于上面所述的“由于注入階段是在創建完所有bean對象后才開始的,所以不要在要創建的對象的構造方法中使用要注入的對象”問題,會導致很多類的初始化出現問題,因為若是將初始化方法寫在構造方法中,調用到未注入的參數,就會出現NullPointer的異常,這種問題如何解決呢?博主發現了一個辦法:
首先,在每個需要初始化的類中添加init()方法來進行初始化:
public class A{public A(){}public void init(){// 初始化}}這樣,就將初始化過程和構造方法分離開來了。然而,初始化方法何時調用呢?請接著看(代碼來自開源項目《迷你微信》服務器)
public class Server { public static void main(String[] args) throws IOException { // 開啟Spring,進行依賴注入 ApplicationContext ctx = new FileSystemXmlApplicationContext("applicationContext.xml"); // 調用A的初始化方法 ((A) ctx.getBean("A")).init(); }}我們可以看到,首先,我們在最開始的Main方法內運行了applicationContext.xml文件,他是Spring的配置文件,可以開始Spring的依賴注入,然后我們從這里面,拿出已經被Spring實例化的A對象,這時,所有配置的對象都已經實例化和參數注入好了,就可以調用其中的初始化方法init()了。
歡迎閱讀我的開源項目《迷你微信》服務器與《迷你微信》客戶端
新聞熱點
疑難解答