學習一
java.bean.PropertyChangeListener用來監聽bean類的屬性值改變。當改變時同時執行對應事件。並且是線程安全的。tomcat用此reload的Boolean值改變是否要從新加載。java
public class Demo2 implements PropertyChangeListener{ PropertyChangeSupport support = new PropertyChangeSupport(this); private String name; public String getName() { return name; } public Demo2() { this.name = "apple"; addListenProperty(this); } public void setName(String name) { String oldName = this.name; this.name = name; support.firePropertyChange("name", oldName, this.name); } public void addListenProperty(PropertyChangeListener li) { support.addPropertyChangeListener(li); } @Override public void propertyChange(PropertyChangeEvent evt) { System.out.println("--------------------------------"); System.out.println(evt.getOldValue()); System.out.println(evt.getNewValue()); System.out.println(evt.getPropertyName()); ((Demo2)evt.getSource()).gotoSchool(); System.out.println("--------------------------------"); } public void gotoSchool() { System.out.println("welcome to MIT !"); } }
Test測試類web
public class Demo { public static void main(String[] args) { Demo2 t = new Demo2(); t.setName("jobs"); System.out.println("~~~~~~~~~~~~~~~~"); t.setName("steven"); } }
測試結果數組
-------------------------------- apple jobs name welcome to MIT ! -------------------------------- ~~~~~~~~~~~~~~~~ -------------------------------- jobs steven name welcome to MIT ! --------------------------------
學習二
接口Pipeline 流水線功能學習有點相似於過濾器構造。它有一個Value數組。使用 System.arraycopy() 來擴展流水線閥門個數。
invoke方法傳遞到下一個。閥門所有經過以後有一個basic方法。就是warpper包裝器了。
這時候開始加載Servlet.class。執行service方法。閥門能夠用來HeaderLoggerValve,ClientIPLoggerValve記錄日誌。tomcat
public interface Pipeline { public Valve getBasic(); public void setBasic(Valve valve); public void addValve(Valve valve); public Valve[] getValves(); public void removeValve(Valve valve); public Valve getFirst(); }
接下來接口Lifecycle,用於控制類的生命週期了。幾乎全部的容器都實現了這個類。
還有loader類。類的加載。動態加載webapp下的class文件。有點複雜有時間在看看。安全
附上tomcat各容器之間關係圖,多看看,多想一想。app
流程圖webapp