spring源碼解析
① spring源碼解析怎麼不見了,我已
選中必要的jar包,上面給出的源碼jar包中,導入spring3.0.5中的所有jar包。
其中lib內的是spring的jar包,用到哪個導入哪個,不知道的話,全部導入就行了。
② spring源碼要怎麼講
《SPRING技術內幕——深入解析SPRING架構與設計原理》
該書講了spring的ioc容器原理,在xml的spring配置文件中,對象是如何解析並生成的。
spring的aop,面向切面編程。這兩塊是比較重要的,屬於核心部分。
其他的如spring mvc ,spring jdbc與hibernate,ibatise集成,spring事務,spring security,
spring 任務調度都有介紹。
大體來說,屬於跟著代碼走向,一個類一個類介紹了一下。其實代碼都是有英文注釋的。
跟著作都的思路看過來也還是可以的,最好是對照類圖分析。
③ 推薦一本關於spring 源碼分析的書,要求內容詳細,中文 謝謝
《SPRING技術內幕——深入解析SPRING架構與設計原理》
該書講了spring的ioc容器原理,在xml的spring配置文件中,對象是如何解析並生成的。
spring的aop,面向切面編程。這兩塊是比較重要的,屬於核心部分。
其他的如spring mvc ,spring jdbc與hibernate,ibatise集成,spring事務,spring security,
spring 任務調度都有介紹。
大體來說,屬於跟著代碼走向,一個類一個類介紹了一下。其實代碼都是有英文注釋的。
跟著作都的思路看過來也還是可以的,最好是對照類圖分析。
④ 怎麼閱讀Spring源碼
先滿足前提:
一,最基本
1. 了解 java語法
2. 了解設計模式
二,項目基礎
1. 已經了解 Spring Core 的功能
2. 已經過了一遍 public api
3. 已經根據自己對 IoC container 的理解,實現了一個最簡單的 IoC container
滿足了之後,
再進入 spring-core 和 spring-beans 的世界吧。
⑤ spring啟動過程源碼詳解
Spring啟動過程源代碼的介紹,需要根據程序運行數據信息處理。
因為這種啟動過程需要源代碼的一個提供信息,所以源代碼編寫程序要根據電源電壓來決定。
⑥ 有多少人能讀懂spring源碼
研究框架的源碼: 一、前提: 需要基礎很扎實,做過很多項目了之後。 二、作用: 1、為了更好的掌握框架 2、更好的處理代碼中出現的問題或者bug 3、為了以後擔當系統架構師打下基礎 三、好處: 1、為了自己更深入的了解框架的原理
⑦ 如何高效的學習spring源碼
首先Java的基礎、面向對象的基礎和設計模式的基礎知識是必不可少的。
關於設計模式我覺得不用學太多,但以下三個模式是學習Spring必不可少的:factory模式(包括簡單工廠和抽象工廠), Strategy模式,Template method模式。如果不掌握這些你就根本沒法領悟Spring的精髓,只能依樣畫葫蘆地照搬,這是很可怕的事。
⑧ 如何評價spring源碼深度解析
您好,希望以下回答能幫助您 《SPRING技術內幕——深入解析SPRING架構與設計原理》 該書講了spring的ioc容器原理,在xml的spring配置文件中,對象是如何解析並生成的。 spring的aop,面向切面編程。這兩塊是比較重要的,屬於核心部分。 其他的如spring mvc ,spring jdbc與hibernate,ibatise集成,spring事務,spring security, spring 任務調度都有介紹。 大體來說,屬於跟著代碼走向,一個類一個類介紹了一下。其實代碼都是有英文注釋的。 跟著作都的思路看過來也還是可以的,最好是對照類圖分析。 如您還有疑問可繼續追問。
⑨ 讀過完整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
//-------------------------
⑩ 看透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 ) {