⑴ 推薦一本關於spring 源碼分析的書,要求內容詳細,中文 謝謝
《SPRING技術內幕——深入解析SPRING架構與設計原理》
該書講了spring的ioc容器原理,在xml的spring配置文件中,對象是如何解析並生成的。
spring的aop,面向切面編程。這兩塊是比較重要的,屬於核心部分。
其他的如spring mvc ,spring jdbc與hibernate,ibatise集成,spring事務,spring security,
spring 任務調度都有介紹。
大體來說,屬於跟著代碼走向,一個類一個類介紹了一下。其實代碼都是有英文注釋的。
跟著作都的思路看過來也還是可以的,最好是對照類圖分析。
⑵ 怎麼找到spring註解解析器的源碼
下面用的是4.2.5的源碼。
從這個文件開始看:META-INF/spring.handlers
文件里的內容是http://www.springframework.org/schema/mvc=org.springframework.web.servlet.config.MvcNamespaceHandler
MvcNamespaceHandler源碼:
⑶ spring啟動過程源碼詳解
Spring啟動過程源代碼的介紹,需要根據程序運行數據信息處理。
因為這種啟動過程需要源代碼的一個提供信息,所以源代碼編寫程序要根據電源電壓來決定。
⑷ spring源碼解析怎麼不見了,我已
選中必要的jar包,上面給出的源碼jar包中,導入spring3.0.5中的所有jar包。
其中lib內的是spring的jar包,用到哪個導入哪個,不知道的話,全部導入就行了。
⑸ Yii2框架源碼分析之如何實現注冊和登錄
java開源框架的源代碼怎麼讀?說讀開源框架的源代碼對自己寫程序很有幫助的,我不知道從那裡下手 找一個你熟悉的項目,下回來源碼,然後單步跟蹤一遍,前題有一定基礎,至少會單步跟蹤調試對ide也得熟悉些,項目別選太大的,像apache裡面的項目都還可以。一開始還是比較艱難的,時間長了就好了。 如同你看不懂高手過招一樣。 還是一步一步的來吧。 先看一些基礎知識,寫一些東西,然後重點看自己用到的,或者即將用到的部分,這樣提高效果會更好。 開始的時候是把源代碼關聯,有不明白的地方可以ctrl直接過去看。之後有一些積攢之後,可以去看開源項目中的閃亮的地方,比如Spring中的IOC。然後參照自己去實現一個簡單的DEMO,之中可以參考一些資料。個人理解這樣會比較快速的將一個項目中的一部分較為深入的了解。畢竟一個成熟的開源項目技術的積攢及范圍都比較大。完全了解沒有必要也沒有可能。 我讀Spring的經驗。 首先要搞清它大體的處理步驟,然後再去詳細看每個類的具體內容。讀代碼,最忌從一開始就企圖詳細理解一個大工程的所有細節。先看大匡,然後再逐步掌握自己感興趣的細節。 讀代碼的時候可以把框架的代碼讀取到IDE的工程中去, 例如,用Eclipse讀代碼,方便得很。 或者在開發中設定classpath時,把代碼也帶上, 個人認為,多看例如JDK、Spring這樣優秀的代碼,對於掌握Java編程的精髓很有幫助。 初學者也不例外! 其實框架就是DB訪問,畫面顯示,資源管理。 首先要知道你的框架的特點,也就是他的側重點。 我看源代碼喜歡全局搜索,一直找到Java自帶的基礎類。一條先走到黑。嗬嗬,挺笨的 不過建議先會用,熟練用,在研讀。會快一些,少走彎路 不管是在校的學生還是剛參加工作的,都要從基礎開始,把一些經典的基礎問題搞明白了之後再去研究框架,其實感覺框架要先明白框架的總體,有時候不明白框架甚至看著源代碼都不知道屬於哪一類,引入也會產生問題,之後在去看源代碼。最主要的是光看不行,要親手做一下,即使是最簡單的程序也要親手做,如果是人家的程序照著手動敲一遍也會有很大的收獲的 對於開源項目,我覺得從如下方面著手比較好: 2.了解整體項目的技術架構 3.熟悉它用的技術與知識面,並逐個掌握 4.從單個模塊著手,調試代碼,熟悉基基本的流程與業務 5.在不修改其源碼的基礎上做一些擴展開發的工作,為我所用6.修改並優化其代碼
⑹ 如何分析spring mvc源碼
1. SpringMVC入門
SpringMVC的入門文章, 對於某些沒接觸過SpringMVC的同學來說,可以閱讀以下,了解這個框架的結構以及使用,以入門的同學可以選擇不看~
2. SpringMVC核心分發器DispatcherServlet分析
SpringMVC入口Servlet -> DispatcherServlet的分析,解釋了DispatcherServlet的父類FrameworkServlet以及FrameworkServlet的父類HttpServletBean的作用
3. 詳解SpringMVC請求的時候是如何找到正確的Controller
⑺ 看透springmvc源代碼分析與實踐 怎麼樣
Tomcat 里的Server由org.apache.catalina.startup.Catalina來管理
,Catalina是整個Tomcat的管理類,它裡面的三個方法load,start,stop分別用來管理整個伺服器的生命周期,load方法用於根據conf/server.xml文件創建Server並調用
Server的init方法進行初始化,start
方法用於啟動伺服器,stop方法用於停止伺服器,start和stop方法在內部分別調用了Server的start
和stop方法,load方法內部調用了Server的init方法,這三個方法都
會按容器的結構逐層調用相應的方法,比如,Server的start方法中會調用
所有的Service中的start方法,Service中的start方法又會調用所包含的connectors和container的start方法,這樣整個伺服器就啟動了,init和stop方法也一樣,這就是tomcat生命周期的管理方式。
Catalina中還有個await方法很重要,此方法直接調用 了Server的await方法,這個方法的作用是進入一個循環,讓主線程不會退出。
Tomcat的入口org.apache.catalina.startup.Bootstrap.main(),
Bootstrap的作用類似一個CatalinaAdaptor,具體過程還是使用Catalina來完成,這么做的好處是可以把啟動的入口和具體的管理類分開,這樣可以就可以方便創建出多種啟動方式 ,每種啟動方式只需要寫一個相應的CatalinaAdaptor就可以了。
Bootstrap是Tomcat的入口,正常情況下啟動Tomcat就是調用的Bootstrap的main方法,其代碼如下:
// org.apache.catalina.startup.Bootstrap
public static void main(String args[]) {
// 先新建一個Bootstrap
if (daemon == null) {
Bootstrap bootstrap = new Bootstrap();
try {
//初始化了ClassLoader,並用ClassLoader創建了Catalina實例,賦給catalinaDaemon變數
bootstrap.init();
} catch (Throwable t) {
handleThrowable(t);
t.printStackTrace();
return;
}
daemon = bootstrap;
} else {
Thread.currentThread().setContextClassLoader(daemon.catalinaLoader);
}
try {
String command = "start";
if (args.length > 0) {
command = args[args.length - 1];
}
if (command.equals("startd")) {
args[args.length - 1] = "start";
daemon.load(args);
daemon.start();
} else if (command.equals("stopd")) {
args[args.length - 1] = "stop";
daemon.stop();
} else if (command.equals("start")) {
daemon.setAwait(true);
daemon.load(args);
daemon.start();
} else if (command.equals("stop")) {
daemon.stopServer(args);
} else if (command.equals("configtest")) {
daemon.load(args);
if (null==daemon.getServer()) {
System.exit(1);
}
System.exit(0);
} else {
log.warn("Bootstrap: command \"" + command + "\" does not exist.");
}
} catch (Throwable t) {
if (t instanceof InvocationTargetException &&
t.getCause() != null) {
t = t.getCause();
}
handleThrowable(t);
t.printStackTrace();
System.exit(1);
}
}
可以看到這里的main非常簡單,只有兩部分內容:首先新建了Bootstrap,並執行init方法初始化;然後處理main方法傳入的命令,如果args參數為空,默認執行start。
在init方法里初始化了ClassLoader,並用ClassLoader創建了Catalina實例,然後賦給catalinaDaemon變數,後面對命令的操作都要使用catalinaDaemon來具體執行。
對start命令的處理調用了三個方法:setAwait(true)、load(args)和start()。這三個方法內部都調用了Catalina的相應方法進行具體執行,只不過是用反射來調用的。start方法(另外兩個方法會處理一些參數,調用方法類似)的代碼如下:
// org.apache.catalina.startup.Bootstrap
public void start()
throws Exception {
if( catalinaDaemon==null ) init();
Method method = catalinaDaemon.getClass().getMethod("start", (Class [] )null);
method.invoke(catalinaDaemon, (Object [])null);
}
這里首先判斷catalinaDaemon有沒有初始化,如果沒有則調用init方法對其進行初始化,然後使用Method進行反射調用Catalina的start方法。Method是java.lang.reflect包里的
類,代表一個具體的方法,可以使用其中的invoke方法來執行所代表的方法,invoke方法有兩個參數,第一參數是Method方法所在的實體,第二個參數是可變參數用於Method方法執行時所需要的參數,所以上面的調用相當於((Catalina)catalinaDaemon).start()。setAwait和load也用類似的方法調用了Catalina中的setAwait和load方法。
7.1.3Catalina的啟動過程
從前面的內容可以知道,Catalina的啟動主要是調用setAwait、load和start方法來完成的。setAwait方法用於設置Server啟動完成後是否進入等待狀態的標志,如果為true則進入,否則不進入;load方法用於載入配置文件,創建並初始化Server;start方法用於啟動伺服器。下面分別來看一下這三個方法。
首先來看setAwait方法,代碼如下:
// org.apache.catalina.startup.Catalina
public void setAwait(boolean b) {
await = b;
}
這個方法非常簡單,就是設置await屬性的值,await屬性會在start方法中的伺服器啟動完之後使用它來判斷是否進入等待狀態。
Catalina的load方法根據conf/server.xml創建了Server對象,並賦值給server屬性(具體解析操作是通過開源項目Digester完成的),然後調用了server的init方法,代碼如下:
// org.apache.catalina.startup.Catalina
public void load() {
long t1 = System.nanoTime();
// 省略創建 server代碼,創建過程使用Digester完成
try {
getServer().init();
} catch (LifecycleException e) {
if (Boolean.getBoolean("org.apache.catalina.startup.EXIT_ON_INIT_FAILURE")) {
throw new java.lang.Error(e);
} else {
log.error("Catalina.start", e);
}
}
long t2 = System.nanoTime();
if(log.isInfoEnabled()) {
//啟動過程中,控制台可以看到
log.info("Initialization processed in " + ((t2 - t1) / 1000000) + " ms");
}
}
Catalina的start方法主要調用了server的start方法啟動伺服器,並根據await屬性判斷是否讓程序進入了等待狀態,代碼如下:
//org.apache.catalina.startup.Catalina
public void start() {
if (getServer() == null) {
load();
}
long t1 = System.nanoTime();
try {
// 調用Server的start方法啟動伺服器
getServer().start();
} catch (LifecycleException e) {
log.fatal(sm.getString("catalina.serverStartFail"), e);
try {
getServer().destroy();
} catch (LifecycleException e1) {
log.debug("destroy() failed for failed Server ", e1);
}
return;
}
long t2 = System.nanoTime();
if(log.isInfoEnabled()) {
log.info("Server startup in " + ((t2 - t1) / 1000000) + " ms");
}
// 此處省略了注冊關閉鉤子代碼
// 進入等待狀態
if (await) {
await();
stop();
}
}
這里首先判斷Server是否已經存在了,如果不存在則調用load方法來初始化Server,然後調用Server的start方法來啟動伺服器,最後注冊了關閉鉤子並根據await屬性判斷是否進入等待狀態,之前我們已將這里的await屬性設置為true了,所以需要進入等待狀態。進入等待狀態會調用await和stop兩個方法,await方法直接調用了Server的await方法,Server的await方法內部會執行一個while循環,這樣程序就停到了await方法,當await方法里的while循環退出時,就會執行stop方法,從而關閉伺服器。
7.1.4Server的啟動過程
Server介面中提供addService(Service service)、removeService(Service
service)來添加和刪除Service,Server的init方法和start方法分別循環調用了每個Service的init方法和start方法來啟動所有Service。
Server的默認實現是org.apache.catalina.core.StandardServer,StandardServer繼承自Lifecycle-MBeanBase,LifecycleMBeanBase又繼承自LifecycleBase,init和start方法就定義在了LifecycleBase中,LifecycleBase里的init方法和start方法又調用initInternal方法和startInternal方法,這兩個方法都是模板方法,由子類具體實現,所以調用StandardServer的init和start方法時會執行StandardServer自己的initInternal和startInternal方法,這就是Tomcat生命周期的管理方式,更詳細的過程見7.2節。StandardServer中的initInternal和startInternal方法分別循環調用了每一個service的start和init方法,代碼如下:
//org.apache.catalina.core.StandardServer
protected void startInternal() throws LifecycleException {
……
synchronized (servicesLock) {
for (int i = 0; i < services.length; i++) {
services[i].start();
}
}
}
protected void initInternal() throws LifecycleException {
……
for (int i = 0; i < services.length; i++) {
services[i].init();
}
}
除了startInternal和initInternal方法,StandardServer中還實現了await方法,Catalina中就是調用它讓伺服器進入等待狀態的,其核心代碼如下:
//org.apache.catalina.core.StandardServer
public void await() {
// 如果埠為-2則不進入循環,直接返回
if( port == -2 ) {
⑻ 讀過完整Spring源碼的來領分
不為領分,談點個人看法
不要過於急於掌握,先明白什麼是spring,spring的本質是什麼,對象間關系,為什麼要通過IoC這樣的方式來管理。
學習資料:
spring2.0中文手冊 http://www.redsaga.com/spring_ref/2.0/html/
推薦書籍:expert one-on-one J2EE Development without EJB 有中文版
//-------------------------
// www.1x3x.net/blog
//-------------------------
⑼ 如何評價spring源碼深度解析
您好,希望以下回答能幫助您 《SPRING技術內幕——深入解析SPRING架構與設計原理》 該書講了spring的ioc容器原理,在xml的spring配置文件中,對象是如何解析並生成的。 spring的aop,面向切面編程。這兩塊是比較重要的,屬於核心部分。 其他的如spring mvc ,spring jdbc與hibernate,ibatise集成,spring事務,spring security, spring 任務調度都有介紹。 大體來說,屬於跟著代碼走向,一個類一個類介紹了一下。其實代碼都是有英文注釋的。 跟著作都的思路看過來也還是可以的,最好是對照類圖分析。 如您還有疑問可繼續追問。
⑽ 對於一個初級JAVA程序員,怎麼去看Spring源碼比較好
到網上找一些別人讀Spring源碼分析的博客和文章,結合著看