??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲国产中文在线二区三区免,国产AV无码专区亚洲AVJULIA,亚洲熟妇AV一区二区三区宅男http://www.tkk7.com/zhb8015/category/51823.htmlzh-cnFri, 26 Oct 2012 21:28:54 GMTFri, 26 Oct 2012 21:28:54 GMT60Tomcat pȝ架构与设计模式,W?2 部分: 设计模式分析(?http://www.tkk7.com/zhb8015/articles/379376.htmlzhb8015zhb8015Mon, 28 May 2012 09:58:00 GMThttp://www.tkk7.com/zhb8015/articles/379376.htmlhttp://www.tkk7.com/zhb8015/comments/379376.htmlhttp://www.tkk7.com/zhb8015/articles/379376.html#Feedback0http://www.tkk7.com/zhb8015/comments/commentRss/379376.htmlhttp://www.tkk7.com/zhb8015/services/trackbacks/379376.html
http://www.ibm.com/developerworks/cn/java/j-lo-tomcat2/

门面设计模式

门面设计模式?Tomcat 中有多处使用Q在 Request ?Response 对象装中、Standard Wrapper ? ServletConfig 装中、ApplicationContext ?ServletContext 装中等都用Cq种设计模式?/p>

门面设计模式的原?/a>

q么多场合都用到了这U设计模式,那这U设计模式究竟能有什么作用呢Q顾名思义Q就是将一个东西封装成一个门面好与h家更Ҏq行交流Q就像一个国家的外交部一栗?/p>

q种设计模式主要用在一个大的系l中有多个子pȝl成Ӟq多个子pȝ肯定要涉及到怺通信Q但是每个子pȝ又不能将自己的内部数据过多的?露给其它pȝQ不然就没有必要划分子系l了。每个子pȝ都会设计一个门面,把别的系l感兴趣的数据封装v来,通过q个门面来进行访问。这是门面设计模式 存在的意义?/p>

门面设计模式C意囑֦下:


?1. 门面C意?/strong>
?1. 门面C意? src=

Client 只能讉K?Façade 中提供的数据是门面设计模式的关键Q至?Client 如何讉K Façade ?Subsystem 如何提供 Façade 门面设计模式q没有规定死?/p>

Tomcat 的门面设计模式示?/a>

Tomcat 中门面设计模式用的很多Q因?Tomcat 中有很多不同lgQ每个组件要怺交互数据Q用门面模式隔离数据是个很好的方法?/p>

下面?Request 上用的门面设计模式Q?/p>
?2. Request 的门面设计模式类?/strong>
?2. Request 的门面设计模式类? src=

从图中可以看?HttpRequestFacade cd装了 HttpRequest 接口能够提供数据Q通过 HttpRequestFacade 讉K到的数据都被代理?HttpRequest 中,通常被封装的对象都被设ؓ Private 或? Protected 讉K修饰Q以防止?Façade 中被直接讉K?/p>

回页?/a>

观察者设计模?/a>

q种设计模式也是常用的设计方法通常也叫发布 - 订阅模式Q也是事g监听机制Q通常在某个事件发生的前后会触发一些操作?/p>

观察者模式的原理

观察者模式原理也很简单,是你在做事的时候旁ҎL一个h在盯着你,当你做的事情是它感兴的时候,它就会跟着做另外一些事情。但是盯着你的人必要C那去登记Q不然你无法通知它。观察者模式通常包含下面q几个角Ԍ

  • Subject 是抽象主题Q它负责理所有观察者的引用Q同时定义主要的事g操作?/li>
  • ConcreteSubject 具体主题Q它实现了抽象主题的所有定义的接口Q当自己发生变化Ӟ会通知所有观察者?/li>
  • Observer 观察者:监听主题发生变化相应的操作接口?/li>

Tomcat 的观察者模式示?/a>

Tomcat 中观察者模式也有多处用,前面讲的控制lg生命周期?Lifecycle 是q种模式的体玎ͼq有?Servlet 实例的创建、Session 的管理、Container {都是同L原理。下面主要看一?Lifecycle 的具体实现?/p>

Lifecycle 的观察者模式结构图Q?/p>
?3. Lifecycle 的观察者模式结构图
?3. Lifecycle 的观察者模式结构图

上面的结构图中,LifecycleListener 代表的是抽象观察者,它定义一?lifecycleEvent ҎQ这个方法就是当主题变化时要执行的方法?ServerLifecycleListener 代表的是具体的观察者,它实C LifecycleListener 接口的方法,是q个具体的观察者具体的实现方式。Lifecycle 接口代表的是抽象主题Q它定义了管理观察者的Ҏ和它要所做的其它Ҏ。?StandardServer 代表的是具体主题Q它实现了抽象主题的所有方法。这?Tomcat 对观察者做了扩展,增加了另外两个类QLifecycleSupport、LifecycleEventQ它们作助类扩展了观察者的功能?LifecycleEvent 使得可以定义事gcdQ不同的事g可区别处理,更加灉|。LifecycleSupport cM理了主题对多观察者的理Q将q个理抽出来统一实现Q以后如果修改只要修?LifecycleSupport cd可以了,不需要去修改所有具体主题,因ؓ所有具体主题的对观察者的操作都被代理l?LifecycleSupport cM。这可以认ؓ是观察者模式的改进版?/p>

LifecycleSupport 调用观察者的Ҏ代码如下Q?/p>
清单 1. LifecycleSupport 中的 fireLifecycleEvent Ҏ
				 public void fireLifecycleEvent(String type, Object data) {     LifecycleEvent event = new LifecycleEvent(lifecycle, type, data);     LifecycleListener interested[] = null;     synchronized (listeners) {         interested = (LifecycleListener[]) listeners.clone();     }     for (int i = 0; i < interested.length; i++)         interested[i].lifecycleEvent(event); } 

主题是怎么通知观察者呢Q看下面代码Q?/p>
清单 2. 容器中的 start Ҏ
				 public void start() throws LifecycleException {     lifecycle.fireLifecycleEvent(BEFORE_START_EVENT, null);     lifecycle.fireLifecycleEvent(START_EVENT, null);     started = true;     synchronized (services) {         for (int i = 0; i < services.length; i++) {             if (services[i] instanceof Lifecycle)                 ((Lifecycle) services[i]).start();             }         }     lifecycle.fireLifecycleEvent(AFTER_START_EVENT, null); } 

回页?/a>

命o设计模式

前面?Tomcat 中两个核心组?Connector ? ContainerQ比作一对夫妅R男的将接受q来的请求以命o的方式交l女Mh。对应到 Connector ? ContainerQConnector 也是通过命o模式调用 Container 的?/p>

命o模式的原?/a>

命o模式主要作用是装命oQ把发出命o的责d执行命o的责d开。也是一U功能的分工。不同的模块可以对同一个命令做Z同解释?/p>

下面是命令模式通常包含下面几个角色Q?/p>

  • ClientQ创Z个命令,q决定接受?/li>
  • Command 命oQ命令接口定义一个抽象方?/li>
  • ConcreteCommandQ具体命令,负责调用接受者的相应操作
  • Invoker h者:负责调用命o对象执行h
  • Receiver 接受者:负责具体实施和执行一ơ请?/li>

Tomcat 中的命o模式的示?/a>

Tomcat 中命令模式在 Connector ?Container lg之间有体玎ͼTomcat 作ؓ一个应用服务器Q无疑会接受到很多请求,如何分配和执行这些请求是必须的功能?/p>

下面看一?Tomcat 是如何实现命令模式的Q下面是 Tomcat 命o模式的结构图Q?/p>
?4. Tomcat 命o模式的结构图
?4. Tomcat 命o模式的结构图

Connector 作ؓ抽象h者,HttpConnector 作ؓ具体h者。HttpProcessor 作ؓ命o。Container 作ؓ命o的抽象接受者,ContainerBase 作ؓ具体的接受者。客L是应用服务?Server lg了。Server 首先创徏命oh?HttpConnector 对象Q然后创建命?HttpProcessor 命o对象。再把命令对象交l命令接受?ContainerBase 容器来处理命令。命令的最l是?Tomcat ?Container 执行的。命令可以以队列的方式进来,Container 也可以以不同的方式来处理hQ如 HTTP1.0 协议?HTTP1.1 的处理方式就会不同?/p>

回页?/a>

责Q链模?/a>

Tomcat 中一个最Ҏ发现的设计模式就是责任链模式Q这个设计模式也?Tomcat ?Container 设计的基Q整个容器的是通过一个链q接在一Pq个链一直将h正确的传递给最l处理请求的那个 Servlet?/p>

责Q链模式的原理

责Q链模式,是很多对象有每个对象对其下家的引用而连接v来Ş成一条链Q请求在q条链上传递,直到链上的某个对象处理此hQ或者每个对象都可以处理hQƈ传给下一Ӟ直到最l链上每个对象都处理完。这样可以不影响客户端而能够在链上增加L的处理节炏V?/p>

通常责Q链模式包含下面几个角Ԍ

  • HandlerQ抽象处理者)Q定义一个处理请求的接口
  • ConcreteHandlerQ具体处理者)Q处理请求的具体c,或者传l下?/li>

Tomcat 中责任链模式CZ

?tomcat 中这U设计模式几乎被完整的用,tomcat 的容器设|就是责任链模式Q从 Engine ?Host 再到 Context 一直到 Wrapper 都是通过一个链传递请求?/p>

Tomcat 中责任链模式的类l构囑֦下:


?5. Tomcat 责Q链模式的l构?/strong>
?5. Tomcat 责Q链模式的l构? src=

上图基本描述了四个子容器使用责Q链模式的cȝ构图Q对应的责Q链模式的角色QContainer 扮演抽象处理者角Ԍ具体处理者由 StandardEngine {子容器扮演。与标准的责任链不同的是Q这里引入了 Pipeline ?Valve 接口。他们有什么作用呢Q?/p>

实际?Pipeline ?Valve 是扩展了q个铄功能Q得在铑־下传递过E中Q能够接受外界的q预。Pipeline 是q接每个子容器的子Q里面传递的 Request ?Response 对象好比子里流的水Q?Valve 是q个子上开的一个个口子,让你有机会能够接触到里面的水Q做一些额外的事情?/p>

Z防止水被引出来而不能流C一个容器中Q每一D늮子最后L一个节点保证它一定能到下一个子容器Q所以每个容器都有一?StandardXXXValve。只要涉及到q种有链式是处理程q是一个非常值得借鉴的模式?/p>

参考资?

学习

讨论



zhb8015 2012-05-28 17:58 发表评论
]]>
Spring 框架的设计理念与设计模式分析Q{Q?/title><link>http://www.tkk7.com/zhb8015/articles/379375.html</link><dc:creator>zhb8015</dc:creator><author>zhb8015</author><pubDate>Mon, 28 May 2012 09:53:00 GMT</pubDate><guid>http://www.tkk7.com/zhb8015/articles/379375.html</guid><wfw:comment>http://www.tkk7.com/zhb8015/comments/379375.html</wfw:comment><comments>http://www.tkk7.com/zhb8015/articles/379375.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/zhb8015/comments/commentRss/379375.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/zhb8015/services/trackbacks/379375.html</trackback:ping><description><![CDATA[原文地址Q?div>http://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/</div><br /><br /><div><p><a name="major1">Spring 的骨骼架?/a></p> <p>Spring d有十几个lgQ但是真正核心的lg只有几个Q下面是 Spring 框架的M架构图:</p> <br /><a name="fig1"><strong>?1 .Spring 框架的M架构?/strong></a><br /> <img alt="?1 .Spring 框架的M架构? src="http://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/image001.gif" height="354" width="512" /> <br /> <p>从上图中可以看出 Spring 框架中的核心lg只有三个QCore、Context ?Beans。它们构v了整?Spring 的骨骼架构。没有它们就不可能有 AOP、Web {上层的Ҏ功能。下面也主要从q三个组件入手分?Spring?/p> <p><a name="minor1.1">Spring 的设计理?/a></p> <p>前面介绍?Spring 的三个核心组Ӟ如果再在它们三个中选出核心的话Q那非 Beans lg莫属了,Zq样_其实 Spring 是面向 Bean 的编E(BOP,Bean Oriented ProgrammingQ,Bean ?Spring 中才是真正的主角?/p> <p>Bean ?Spring 中作用就?Object ?OOP 的意义一P没有对象的概念就像没有面向对象编E,Spring 中没?Bean 也就没有 Spring 存在的意义。就像一ơ演台都准备好了但是却没有演员一栗ؓ什么要 Bean q种角色 Bean 或者ؓ何在 Spring 如此重要Q这?Spring 框架的设计目标决定,Spring Z如此行Q我们用 Spring 的原因是什么,x你会发现原来 Spring 解决了一个非常关键的问题他可以让你把对象之间的依赖关p{而用配置文g来管理,也就是他的依赖注入机制。而这个注入关pd一个叫 Ioc 容器中管理,?Ioc 容器中有又是什么就是被 Bean 包裹的对象。Spring 正是通过把对象包装在 Bean 中而达到对q些对象理以及一些列额外操作的目的?/p> <p>它这U设计策略完全类g Java 实现 OOP 的设计理念,当然?Java 本n的设计要?Spring 复杂太多太多Q但是都是构Z个数据结构,然后Ҏq个数据l构设计他的生存环境Qƈ让它在这个环境中按照一定的规律在不停的q动Q在它们的不停运动中?计一pd与环境或者与其他个体完成信息交换。这h来回q头x我们用到的其他框枉是大慨类似的设计理念?/p> <p><a name="minor1.2">核心lg如何协同工作</a></p> <p>前面?Bean ?Spring 中关键因素,?Context ?Core 又有何作用呢Q前面吧 Bean 比作一场演Z的演员的话,?Context 是q场演出的舞台背景,?Core 应该是演出的道具了。只有他们在一h能具备能演出一场好戏的最基本的条件。当然有最基本的条件还不能使这场演颖而出Q还要他表演的节目够的_?彩,q些节目是 Spring 能提供的特色功能了?/p> <p>我们知道 Bean 包装的是 ObjectQ?Object 必然有数据,如何l这些数据提供生存环境就?Context 要解决的问题Q对 Context 来说他就是要发现每个 Bean 之间的关p,为它们徏立这U关pdƈ且要l护好这U关pR所?Context 是一?Bean 关系的集合,q个关系集合又叫 Ioc 容器Q一旦徏立vq个 Ioc 容器?Spring 可以ؓ你工作了。那 Core lg又有什么用武之地呢Q其?Core 是发现、徏立和l护每个 Bean 之间的关pL需要的一些列的工P从这个角度看来,Core q个lg? Util 更能让你理解?/p> <p>它们之间可以用下图来表示Q?/p> <br /><a name="fig2"><strong>?2. 三个lg关系</strong></a><br /> <img alt="?2. 三个lg关系" src="http://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/image002.gif" height="230" width="435" /> <br /> <p><a name="minor1.3">核心lg详解</a></p> <p>q里详l介l每个组件内部类的层ơ关p,以及它们在运行时的时序顺序。我们在使用 Spring 是应该注意的地方?/p> <p> <strong>Bean lg</strong> </p> <p>前面已经说明?Bean lg?Spring 的重要性,下面看看 Bean q个lg式怎么设计的。Bean lg?Spring ? org.springframework.beans 包下。这个包下的所有类主要解决了三件事QBean 的定义、Bean 的创Z及对 Bean 的解析。对 Spring 的用者来说唯一需要关心的是 Bean 的创建,其他两个?Spring 在内部帮你完成了Q对你来说是透明的?/p> <p>Spring Bean 的创建时典型的工厂模式,他的接口?BeanFactoryQ下图是q个工厂的承层ơ关p:</p> <br /><a name="fig3"><strong>?4. Bean 工厂的承关p?/strong></a><br /> <img alt="?4. Bean 工厂的承关p? src="http://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/image003.png" height="252" width="572" /> <br /> <p>BeanFactory 有三个子c:ListableBeanFactory、HierarchicalBeanFactory ? AutowireCapableBeanFactory。但是从上图中我们可以发现最l的默认实现cL DefaultListableBeanFactoryQ他实现了所有的接口。那Z要定义这么多层次的接口呢Q查阅这些接口的源码和说明发玎ͼ每个接口 都有他用的场合Q它主要是ؓ了区分在 Spring 内部在操作过E中对象的传递和转化q程中,对对象的数据讉K所做的限制。例? ListableBeanFactory 接口表示q些 Bean 是可列表的,?HierarchicalBeanFactory 表示的是q些 Bean 是有l承关系的,也就是每?Bean 有可能有?Bean。AutowireCapableBeanFactory 接口定义 Bean 的自动装配规则。这四个接口共同定义?Bean 的集合、Bean 之间的关pR以?Bean 行ؓ?/p> <p>Bean 的定义主要有 BeanDefinition 描述Q如下图说明了这些类的层ơ关p:</p> <br /><a name="fig4"><strong>?5. Bean 定义的类层次关系?/strong></a><br /> <img alt="?5. Bean 定义的类层次关系? src="http://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/image004.png" height="336" width="497" /> <br /> <p>Bean 的定义就是完整的描述了在 Spring 的配|文件中你定义的 <bean/> 节点中所有的信息Q包括各U子节点。当 Spring 成功解析你定义的一?<bean/> 节点后,?Spring 的内部他p转化?BeanDefinition 对象。以后所有的操作都是对这个对象完成的?/p> <p>Bean 的解析过E非常复杂,功能被分的很l,因ؓq里需要被扩展的地方很多,必须保证有够的灉|性,以应对可能的变化。Bean 的解析主要就是对 Spring 配置文g的解析。这个解析过E主要通过下图中的cd成:</p> <br /><a name="fig5"><strong>?6. Bean 的解析类</strong></a><br /> <img alt="?6. Bean 的解析类" src="http://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/image005.png" height="192" width="572" /> <br /> <p>当然q有具体?tag 的解析这里ƈ没有列出?/p> <p> <strong>Context lg</strong> </p> <p>Context ?Spring ?org.springframework.context 包下Q前面已l讲解了 Context lg?Spring 中的作用Q他实际上就是给 Spring 提供一个运行时的环境,用以保存各个对象的状态。下面看一下这个环境是如何构徏的?/p> <p>ApplicationContext ?Context 的顶U父c,他除了能标识一个应用环境的基本信息外,他还l承了五个接口,q五个接口主要是扩展?Context 的功能。下面是 Context 的类l构图:</p> <br /><a name="fig6"><strong>?7. Context 相关的类l构?/strong></a><br /> <img alt="?7. Context 相关的类l构? src="http://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/image006.png" height="234" width="572" /> <br /> <p>Q查?<a target="_blank">?7 的清晰版?/a>。)</p> <p>从上图中可以看出 ApplicationContext l承?BeanFactoryQ这也说明了 Spring 容器中运行的M对象?BeanQ另?ApplicationContext l承?ResourceLoader 接口Q? ApplicationContext 可以讉KCQ何外部资源,q将?Core 中详l说明?/p> <p>ApplicationContext 的子cM要包含两个方面:</p> <ol type="1"><li>ConfigurableApplicationContext 表示?Context 是可修改的,也就是在构徏 Context 中用户可以动态添加或修改已有的配|信息,它下面又有多个子c,其中最l常使用的是可更新的 ContextQ即 AbstractRefreshableApplicationContext cR?/li><li>WebApplicationContext ֐思义Q就是ؓ web 准备?Context 他可以直接访问到 ServletContextQ通常情况下,q个接口使用的少?/li></ol> <p>再往下分是按照构徏 Context 的文件类型,接着是讉K Context 的方式。这样一U一U构成了完整?Context {层次?/p> <p>M来说 ApplicationContext 必须要完成以下几件事Q?/p> <ul><li>标识一个应用环?/li><li>利用 BeanFactory 创徏 Bean 对象</li><li>保存对象关系?/li><li>能够捕获各种事g</li></ul> <p>Context 作ؓ Spring ?Ioc 容器Q基本上整合?Spring 的大部分功能Q或者说是大部分功能的基?/p> <p> <strong>Core lg</strong> </p> <p>Core lg作ؓ Spring 的核心组Ӟ他其中包含了很多的关键类Q其中一个重要组成部分就是定义了资源的访问方式。这U把所有资源都抽象成一个接口的方式很值得在以后的设计中拿来学习。下面就重要看一下这个部分在 Spring 的作用?/p> <p>下图?Resource 相关的类l构图:</p> <br /><a name="fig7"><strong>?8. Resource 相关的类l构?/strong></a><br /> <img alt="?8. Resource 相关的类l构? src="http://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/image007.png" height="235" width="572" /> <br /> <p>Q查?<a target="_blank">?8 的清晰版?/a>。)</p> <p>从上囑֏以看?Resource 接口装了各U可能的资源cdQ也是对用者来说屏蔽了文gcd的不同。对资源的提供者来_如何把资源包装v来交l其他h用这也是一个问题,我们看到 Resource 接口l承?InputStreamSource 接口Q这个接口中有个 getInputStream ҎQ返回的? InputStream cR这h有的资源都被可以通过 InputStream q个cL获取Q所以也屏蔽了资源的提供者。另外还有一个问题就是加载资源的问题Q也是资源的加载者要l一Q从上图中可以看个Q务是? ResourceLoader 接口完成Q他屏蔽了所有的资源加蝲者的差异Q只需要实现这个接口就可以加蝲所有的资源Q他的默认实现是 DefaultResourceLoader?/p> <p>下面看一?Context ?Resource 是如何徏立关pȝQ首先看一下他们的cdpdQ?/p> <br /><a name="fig8"><strong>?9. Context ?Resource 的类关系?/strong></a><br /> <img alt="?9. Context ?Resource 的类关系? src="http://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/image008.png" height="359" width="572" /> <br /> <p>从上囑֏以看出,Context 是把资源的加载、解析和描述工作委托l了 ResourcePatternResolver cL完成Q他相当于一个接头hQ他把资源的加蝲、解析和资源的定义整合在一起便于其他组件用。Core lg中还有很多类似的方式?/p> <p> <strong>Ioc 容器如何工作</strong> </p> <p>前面介绍?Core lg、Bean lg?Context lg的结构与怺关系Q下面这里从使用者角度看一下他们是如何q行的,以及我们如何?Spring 完成各种功能QSpring 到底能有那些功能Q这些功能是如何得来的,下面介绍?/p> <p> <strong>如何创徏 BeanFactory 工厂</strong> </p> <p>正如?2 描述的那PIoc 容器实际上就?Context lgl合其他两个lg共同构徏了一?Bean 关系|,如何构徏q个关系|?构徏的入口就?AbstractApplicationContext cȝ refresh Ҏ中。这个方法的代码如下Q?/p> <br /><a name="listing1"><strong>清单 1. AbstractApplicationContext.refresh</strong></a><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><pre> public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { // Prepare this context for refreshing. prepareRefresh(); // Tell the subclass to refresh the internal bean factory. ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); // Prepare the bean factory for use in this context. prepareBeanFactory(beanFactory); try { // Allows post-processing of the bean factory in context subclasses. postProcessBeanFactory(beanFactory); // Invoke factory processors registered as beans in the context. invokeBeanFactoryPostProcessors(beanFactory); // Register bean processors that intercept bean creation. registerBeanPostProcessors(beanFactory); // Initialize message source for this context. initMessageSource(); // Initialize event multicaster for this context. initApplicationEventMulticaster(); // Initialize other special beans in specific context subclasses. onRefresh(); // Check for listener beans and register them. registerListeners(); // Instantiate all remaining (non-lazy-init) singletons. finishBeanFactoryInitialization(beanFactory); // Last step: publish corresponding event. finishRefresh(); } catch (BeansException ex) { // Destroy already created singletons to avoid dangling resources. destroyBeans(); // Reset 'active' flag. cancelRefresh(ex); // Propagate exception to caller. throw ex; } } } </pre></td></tr></tbody></table><br /> <p>q个Ҏ是构徏整个 Ioc 容器q程的完整的代码Q了解了里面的每一行代码基本上׃解大部分 Spring 的原理和功能了?/p> <p>q段代码主要包含q样几个步骤Q?/p> <ul><li>构徏 BeanFactoryQ以便于产生所需?#8220;演员”</li><li>注册可能感兴的事g</li><li>创徏 Bean 实例对象</li><li>触发被监听的事g</li></ul> <p>下面q合代码分析这几个q程?/p> <p>W二三句是在创建和配置 BeanFactory。这里是 refresh 也就是刷新配|,前面介绍?Context 有可更新的子c,q里正是实现q个功能Q当 BeanFactory 已存在是更斎ͼ如果没有新创徏。下面是更新 BeanFactory 的方法代码:</p> <br /><a name="listing2"><strong>清单 2. AbstractRefreshableApplicationContext. refreshBeanFactory</strong></a><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><pre> protected final void refreshBeanFactory() throws BeansException { if (hasBeanFactory()) { destroyBeans(); closeBeanFactory(); } try { DefaultListableBeanFactory beanFactory = createBeanFactory(); beanFactory.setSerializationId(getId()); customizeBeanFactory(beanFactory); loadBeanDefinitions(beanFactory); synchronized (this.beanFactoryMonitor) { this.beanFactory = beanFactory; } } catch (IOException ex) { throw new ApplicationContextException( "I/O error parsing bean definition source for " + getDisplayName(), ex); } } </pre></td></tr></tbody></table><br /> <p>q个Ҏ实现?AbstractApplicationContext 的抽象方? refreshBeanFactoryQ这D代码清楚的说明?BeanFactory 的创E。注?BeanFactory 对象的类型的变化Q前面介l了他有很多子类Q在什么情况下使用不同的子c这非常关键。BeanFactory 的原始对象是 DefaultListableBeanFactoryQ这个非常关键,因ؓ他设计到后面对这个对象的多种操作Q下面看一下这个类的承层ơ类图:</p> <br /><a name="fig9"><strong>?10. DefaultListableBeanFactory cȝ承关pd</strong></a><br /> <img alt="?10. DefaultListableBeanFactory cȝ承关pd" src="http://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/image009.png" height="253" width="572" /> <br /> <p>Q查?<a target="_blank">?10 的清晰版?/a>。)</p> <p>从这个图中发现除?BeanFactory 相关的类外,q发C?Bean ?register 相关。这? refreshBeanFactory Ҏ中有一?loadBeanDefinitions(beanFactory) 找到答案,q个Ҏ开始加载、解?Bean 的定义,也就是把用户定义的数据结构{化ؓ Ioc 容器中的特定数据l构?/p> <p>q个q程可以用下面时序图解释Q?/p> <br /><a name="fig10"><strong>?11. 创徏 BeanFactory 时序?/strong></a><br /> <img alt="?11. 创徏 BeanFactory 时序? src="http://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/image010.png" height="250" width="572" /> <br /> <p>Q查?<a target="_blank">?11 的清晰版?/a>。)</p> <p>Bean 的解析和登记程时序囑֦下:</p> <br /><a name="fig11"><strong>?12. 解析和登?Bean 对象时序?/strong></a><br /> <img alt="?12. 解析和登?Bean 对象时序? src="http://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/image011.png" height="368" width="572" /> <br /> <p>Q查?<a target="_blank">?12 的清晰版?/a>。)</p> <p>创徏?BeanFactory 后,接下L加一?Spring 本n需要的一些工LQ这个操作在 AbstractApplicationContext ?prepareBeanFactory Ҏ完成?/p> <p>AbstractApplicationContext 中接下来的三行代码对 Spring 的功能扩展性v了至关重要的作用。前两行主要是让你现在可以对已经构徏?BeanFactory 的配|做修改Q后面一行就是让你可以对以后再创? Bean 的实例对象时d一些自定义的操作。所以他们都是扩展了 Spring 的功能,所以我们要学习使用 Spring 必须对这一部分搞清楚?/p> <p>其中?invokeBeanFactoryPostProcessors Ҏ中主要是获取实现 BeanFactoryPostProcessor 接口的子cRƈ执行它的 postProcessBeanFactory ҎQ这个方法的声明如下Q?/p> <br /><a name="listing3"><strong>清单 3. BeanFactoryPostProcessor.postProcessBeanFactory</strong></a><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><pre> void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException; </pre></td></tr></tbody></table><br /> <p>它的参数?beanFactoryQ说明可以对 beanFactory 做修改,q里注意q个 beanFactory ? ConfigurableListableBeanFactory cd的,q也印证了前面介l的不同 BeanFactory 所使用的场合不同,q里只能是可配置?BeanFactoryQ防止一些数据被用户随意修改?/p> <p>registerBeanPostProcessors Ҏ也是可以获取用户定义的实C BeanPostProcessor 接口的子c,q执行把它们注册?BeanFactory 对象中的 beanPostProcessors 变量中。BeanPostProcessor 中声明了两个ҎQpostProcessBeforeInitialization、postProcessAfterInitialization 分别用于?Bean 对象初始化时执行。可以执行用戯定义的操作?/p> <p>后面的几行代码是初始化监听事件和对系l的其他监听者的注册Q监听者必L ApplicationListener 的子cR?/p> <p> <strong>如何创徏 Bean 实例q构?Bean 的关pȝ</strong> </p> <p>下面是 Bean 的实例化代码Q是?finishBeanFactoryInitialization Ҏ开始的?/p> <br /><a name="listing4"><strong>清单 4. AbstractApplicationContext.finishBeanFactoryInitialization</strong></a><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><pre> protected void finishBeanFactoryInitialization( ConfigurableListableBeanFactory beanFactory) { // Stop using the temporary ClassLoader for type matching. beanFactory.setTempClassLoader(null); // Allow for caching all bean definition metadata, not expecting further changes. beanFactory.freezeConfiguration(); // Instantiate all remaining (non-lazy-init) singletons. beanFactory.preInstantiateSingletons(); } </pre></td></tr></tbody></table><br /> <p>从上面代码中可以发现 Bean 的实例化是在 BeanFactory 中发生的。preInstantiateSingletons Ҏ的代码如下:</p> <br /><a name="listing5"><strong>清单 5. DefaultListableBeanFactory.preInstantiateSingletons</strong></a><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><pre> public void preInstantiateSingletons() throws BeansException { if (this.logger.isInfoEnabled()) { this.logger.info("Pre-instantiating singletons in " + this); } synchronized (this.beanDefinitionMap) { for (String beanName : this.beanDefinitionNames) { RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName); if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) { if (isFactoryBean(beanName)) { final FactoryBean factory = (FactoryBean) getBean(FACTORY_BEAN_PREFIX+ beanName); boolean isEagerInit; if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) { isEagerInit = AccessController.doPrivileged( new PrivilegedAction<Boolean>() { public Boolean run() { return ((SmartFactoryBean) factory).isEagerInit(); } }, getAccessControlContext()); } else { isEagerInit = factory instanceof SmartFactoryBean && ((SmartFactoryBean) factory).isEagerInit(); } if (isEagerInit) { getBean(beanName); } } else { getBean(beanName); } } } } } </pre></td></tr></tbody></table><br /> <p>q里出现了一个非帔R要的 Bean —— FactoryBeanQ可以说 Spring 一大半的扩展的功能都与q个 Bean 有关Q这是个Ҏ?Bean 他是个工?BeanQ可以?Bean ?BeanQ这里的产生 Bean 是指 Bean 的实例,如果一个类l承 FactoryBean 用户可以自己定义产生实例对象的方法只要实C?getObject Ҏ。然而在 Spring 内部q个 Bean 的实例对象是 FactoryBeanQ通过调用q个对象?getObject Ҏp获取用户自定义生的对象Q从而ؓ Spring 提供了很好的扩展性。Spring 获取 FactoryBean 本n的对象是在前面加?& 来完成的?/p> <p>如何创徏 Bean 的实例对象以及如何构?Bean 实例对象之间的关联关pd Spring 中的一个核心关键,下面是这个过E的程图?/p> <br /><a name="fig12"><strong>?13.Bean 实例创徏程?/strong></a><br /> <img alt="?13.Bean 实例创徏程? src="http://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/image012.gif" height="800" width="543" /> <br /> <p>Q查?<a target="_blank">?13 的清晰版?/a>。)</p> <p>如果是普通的 Bean q接创Z的实例,是通过调用 getBean Ҏ。下面是创徏 Bean 实例的时序图Q?/p> <br /><a name="fig13"><strong>?14.Bean 实例创徏时序?/strong></a><br /> <img alt="?14.Bean 实例创徏时序? src="http://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/image013.png" height="490" width="572" /> <br /> <p>Q查?<a target="_blank">?14 的清晰版?/a>。)</p> <p>q有一个非帔R要的部分是建立 Bean 对象实例之间的关p,q也?Spring 框架的核心竞争力Q何时、如何徏立他们之间的关系L下面的时序图Q?/p> <br /><a name="fig14"><strong>?15.Bean 对象关系建立</strong></a><br /> <img alt="?15.Bean 对象关系建立" src="http://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/image014.png" height="453" width="572" /> <br /> <p>Q查?<a target="_blank">?15 的清晰版?/a>。)</p> <p> <strong>Ioc 容器的扩展点</strong> </p> <p>现在q有一个问题就是如何让q些 Bean 对象有一定的扩展性,是可以加入用户的一些操作。那么有哪些扩展点呢Q?Spring 又是如何调用到这些扩展点的?</p> <p>?Spring ?Ioc 容器来说Q主要有q么几个。BeanFactoryPostProcessorQ? BeanPostProcessor。他们分别是在构?BeanFactory 和构?Bean 对象时调用。还有就? InitializingBean ?DisposableBean 他们分别是在 Bean 实例创徏和销毁时被调用。用户可以实现这些接口中定义的方法,Spring ׃在适当的时候调用他们。还有一个是 FactoryBean 他是个特D的 BeanQ这?Bean 可以被用h多的控制?/p> <p>q些扩展炚w常也是我们使用 Spring 来完成我们特定Q务的地方Q如何精?Spring q你有没有掌握?Spring 有哪些扩展点Qƈ且如何用他们,要知道如何用他们就必须了解他们内在的机理。可以用下面一个比L解释?/p> <p>我们?Ioc 容器比作一个箱子,q个子里有若干个球的模子,可以用这些模子来造很多种不同的球Q还有一个造这些球模的机器Q这个机器可以生球模。那么他们的对应?pd?BeanFactory 是那个造球模的机器Q球模就?BeanQ而球模造出来的球就?Bean 的实例。那前面所说的几个扩展点又在什么地方呢Q?BeanFactoryPostProcessor 对应到当造球模被造出来时Q你有Z可以对其做出讑ֽ的修正,也就是他可以帮你修改球模。?InitializingBean ? DisposableBean 是在球模造球的开始和l束阶段Q你可以完成一些预备和扫尾工作。BeanPostProcessor 可以让你对球模造出来的球做出适当的修正。最后还有一? FactoryBeanQ它可是一个神奇的球模。这个球模不是预先就定型了,而是׃来给他确定它的ŞӞ既然你可以确定这个球模型的ŞӞ当然他造出?的球肯定是你想要的球了Q这样在q个子里尼可以发现所有你惌的球</p> <p> <strong>Ioc 容器如何为我所?/strong> </p> <p>前面的介l了 Spring 容器的构E,?Spring 能ؓ我们做什么,Spring ?Ioc 容器又能做什么呢Q我们? Spring 必须要首先构?Ioc 容器Q没有它 Spring 无法工作QApplicatonContext.xml 是 Ioc 容器的默认配|文ӞSpring 的所有特性功能都是基于这?Ioc 容器工作的,比如后面要介l的 AOP?/p> <p>Ioc 它实际上是Z构徏了一个魔方,Spring Z搭好了骨骼架构,q个方到底能变Z么好的东西出来,q必要有你的参与。那我们怎么参与Q这是前面说的要了?Spring 中那有些扩展点,我们通过实现那些扩展Ҏ改变 Spring 的通用行ؓ。至于如何实现扩展点来得到我们想要的个性结果,Spring 中有很多例子Q其?AOP 的实现就?Spring 本n实现了其扩展Ҏ辑ֈ了它惌的特性功能,可以拿来参考?/p> <p ibm-back-to-top"=""><a >回页?/a></p><p><a name="major2">Spring ?AOP Ҏ详?/a></p> <p><a name="minor2.1">动态代理的实现原理</a></p> <p>要了?Spring ?AOP 必d了解的动态代理的原理Q因?AOP 是Z动态代理实现的。动态代理还要从 JDK 本n说v?/p> <p>?Jdk ?java.lang.reflect 包下有个 Proxy c,它正是构造代理类的入口。这个类的结构入下:</p> <br /><a name="fig15"><strong>?16. Proxy cȝ?/strong></a><br /> <img alt="?16. Proxy cȝ? src="http://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/image015.png" height="363" width="472" /> <br /> <p>从上囑֏现最后面四个是公有方法。而最后一个方?newProxyInstance 是创徏代理对象的方法。这个方法的源码如下Q?/p> <br /><a name="listing6"><strong>清单 6. Proxy. newProxyInstance</strong></a><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><pre> public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException { if (h == null) { throw new NullPointerException(); } Class cl = getProxyClass(loader, interfaces); try { Constructor cons = cl.getConstructor(constructorParams); return (Object) cons.newInstance(new Object[] { h }); } catch (NoSuchMethodException e) { throw new InternalError(e.toString()); } catch (IllegalAccessException e) { throw new InternalError(e.toString()); } catch (InstantiationException e) { throw new InternalError(e.toString()); } catch (InvocationTargetException e) { throw new InternalError(e.toString()); } } </pre></td></tr></tbody></table><br /> <p>q个Ҏ需要三个参敎ͼClassLoaderQ用于加载代理类?Loader c,通常q个 Loader 和被代理的类是同一? Loader cRInterfacesQ是要被代理的那些那些接口。InvocationHandlerQ就是用于执行除了被代理接口中方法之外的用户自定义的操作Q?他也是用户需要代理的最l目的。用戯用目标方法都被代理到 InvocationHandler cM定义的唯一Ҏ invoke 中。这在后面再详解?/p> <p>下面q是看看 Proxy 如何产生代理cȝq程Q他构造出来的代理cd底是什么样子?下面揭晓啦?/p> <br /><a name="fig16"><strong>?17. 创徏代理对象时序?/strong></a><br /> <img alt="?17. 创徏代理对象时序? src="http://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/image016.png" height="470" width="534" /> <br /> <p>其实从上图中可以发现正在构造代理类的是?ProxyGenerator ?generateProxyClass 的方法中。ProxyGenerator cd sun.misc 包下Q感兴趣的话可以看看他的源码?/p> <p>假如有这样一个接口,如下Q?/p> <br /><a name="listing7"><strong>清单 7. SimpleProxy c?/strong></a><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><pre> public interface SimpleProxy { public void simpleMethod1(); public void simpleMethod2(); } </pre></td></tr></tbody></table><br /> <p>代理来生成的cȝ构如下:</p> <br /><a name="listing8"><strong>清单 8. $Proxy2 c?/strong></a><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><pre> public class $Proxy2 extends java.lang.reflect.Proxy implements SimpleProxy{ java.lang.reflect.Method m0; java.lang.reflect.Method m1; java.lang.reflect.Method m2; java.lang.reflect.Method m3; java.lang.reflect.Method m4; int hashCode(); boolean equals(java.lang.Object); java.lang.String toString(); void simpleMethod1(); void simpleMethod2(); } </pre></td></tr></tbody></table><br /> <p>q个cM的方法里面将会是调用 InvocationHandler ?invoke ҎQ而每个方法也对应一个属性变量,q个属性变?m 也将传给 invoke Ҏ中的 Method 参数。整个代理就是这样实现的?/p> <p><a name="minor2.2">Spring AOP 如何实现</a></p> <p>从前面代理的原理我们知道Q代理的目的是调用目标方法时我们可以转而执?InvocationHandler cȝ invoke ҎQ所以如何在 InvocationHandler 上做文章是 Spring 实现 Aop 的关键所在?/p> <p>Spring ?Aop 实现是遵?Aop 联盟的约定。同?Spring 又扩展了它,增加了如 Pointcut、Advisor {一些接口得更加灵zR?/p> <p>下面?Jdk 动态代理的cdQ?/p> <br /><a name="fig17"><strong>?18. Jdk 动态代理的cd</strong></a><br /> <img alt="?18. Jdk 动态代理的cd" src="http://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/image017.png" height="276" width="572" /> <br /> <p>上图清楚的显CZ Spring 引用?Aop Alliance 定义的接口。姑且不讨论 Spring 如何扩展 Aop AllianceQ先看看 Spring 如何实现代理cȝQ要实现代理cd Spring 的配|文件中通常是这样定一?Bean 的,如下Q?/p> <br /><a name="listing9"><strong>清单 9. 配置代理c?Bean</strong></a><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><pre> <bean id="testBeanSingleton" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="proxyInterfaces"> <value> org.springframework.aop.framework.PrototypeTargetTests$TestBean </value> </property> <property name="target"><ref local="testBeanTarget"></ref> </property> <property name="singleton"><value>true</value></property> <property name="interceptorNames"> <list> <value>testInterceptor</value> <value>testInterceptor2</value> </list> </property> </bean> </pre></td></tr></tbody></table><br /> <p>配置上看到要讄被代理的接口Q和接口的实现类也就是目标类Q以及拦截器也就在执行目标方法之前被调用Q这?Spring 中定义的各种各样的拦截器Q可以选择使用?/p> <p>下面看看 Spring 如何完成了代理以及是如何调用拦截器的?/p> <p>前面提到 Spring Aop 也是实现其自w的扩展Ҏ完成q个Ҏ的Q从q个代理cd以看出它正是l承?FactoryBean ? ProxyFactoryBeanQFactoryBean 之所以特别就在它可以让你自定义对象的创徏Ҏ。当然代理对象要通过 Proxy cL动态生成?/p> <p>下面?Spring 创徏的代理对象的时序图:</p> <br /><a name="fig18"><strong>?19.Spring 代理对象的?/strong></a><br /> <img alt="?19.Spring 代理对象的? src="http://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/image018.png" height="355" width="572" /> <br /> <p>Spring 创徏了代理对象后Q当你调用目标对象上的方法时Q将都会被代理到 InvocationHandler cȝ invoke Ҏ中执行,q在前面已经解释。在q里 JdkDynamicAopProxy cdC InvocationHandler 接口?/p> <p>下面再看?Spring 是如何调用拦截器的,下面是这个过E的时序图:</p> <br /><a name="fig19"><strong>?20.Spring 调用拦截?/strong></a><br /> <img alt="?20.Spring 调用拦截? src="http://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/image019.png" height="581" width="572" /> <br /> <p>以上所说的都是 Jdk 动态代理,Spring q支持一U?CGLIB cM理,感兴自q吧?/p> <p ibm-back-to-top"=""><a >回页?/a></p><p><a name="major3">Spring 中设计模式分?/a></p> <p>Spring 中用的设计模式也很多,比如工厂模式、单例模式、模版模式等Q在?Webx 框架的系l架构与设计模式》、?Tomcat 的系l架构与模式设计分析》已l有介绍Q这里就不赘qC。这里主要介l代理模式和{略模式?/p> <p><a name="minor3.1">代理模式</a></p> <p> <strong>代理模式原理</strong> </p> <p>代理模式是l某一个对象创Z个代理对象,而由q个代理对象控制对原对象的引用,而创个代理对象就是可以在调用原对象是可以增加一些额外的操作。下面是代理模式的结构:</p> <br /><a name="fig20"><strong>?21. 代理模式的结?/strong></a><br /> <img alt="?21. 代理模式的结? src="http://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/image020.png" height="245" width="398" /> <br /> <ul><li>SubjectQ抽象主题,它是代理对象的真实对象要实现的接口,当然q可以是多个接口l成?/li><li>ProxySubjectQ代理类除了实现抽象主题定义的接口外Q还必须持有所代理对象的引?/li><li>RealSubjectQ被代理的类Q是目标对象?/li></ul> <p> <strong>Spring 中如何实C理模?/strong> </p> <p>Spring Aop ?Jdk 动态代理就是利用代理模式技术实现的。在 Spring 中除了实现被代理对象的接口外Q还会有 org.springframework.aop.SpringProxy ? org.springframework.aop.framework.Advised 两个接口。Spring 中用代理模式的l构囑֦下:</p> <br /><a name="fig21"><strong>?22. Spring 中用代理模式的l构?/strong></a><br /> <img alt="?22. Spring 中用代理模式的l构? src="http://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/image021.gif" height="260" width="441" /> <br /> <p>$Proxy 是创徏的代理对象,?Subject 是抽象主题,代理对象是通过 InvocationHandler 来持有对目标对象的引用的?/p> <p>Spring 中一个真实的代理对象l构如下Q?/p> <br /><a name="listing10"><strong>清单 10 代理对象 $Proxy4</strong></a><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><pre> public class $Proxy4 extends java.lang.reflect.Proxy implements org.springframework.aop.framework.PrototypeTargetTests$TestBean org.springframework.aop.SpringProxy org.springframework.aop.framework.Advised { java.lang.reflect.Method m16; java.lang.reflect.Method m9; java.lang.reflect.Method m25; java.lang.reflect.Method m5; java.lang.reflect.Method m2; java.lang.reflect.Method m23; java.lang.reflect.Method m18; java.lang.reflect.Method m26; java.lang.reflect.Method m6; java.lang.reflect.Method m28; java.lang.reflect.Method m14; java.lang.reflect.Method m12; java.lang.reflect.Method m27; java.lang.reflect.Method m11; java.lang.reflect.Method m22; java.lang.reflect.Method m3; java.lang.reflect.Method m8; java.lang.reflect.Method m4; java.lang.reflect.Method m19; java.lang.reflect.Method m7; java.lang.reflect.Method m15; java.lang.reflect.Method m20; java.lang.reflect.Method m10; java.lang.reflect.Method m1; java.lang.reflect.Method m17; java.lang.reflect.Method m21; java.lang.reflect.Method m0; java.lang.reflect.Method m13; java.lang.reflect.Method m24; int hashCode(); int indexOf(org.springframework.aop.Advisor); int indexOf(org.aopalliance.aop.Advice); boolean equals(java.lang.Object); java.lang.String toString(); void sayhello(); void doSomething(); void doSomething2(); java.lang.Class getProxiedInterfaces(); java.lang.Class getTargetClass(); boolean isProxyTargetClass(); org.springframework.aop.Advisor; getAdvisors(); void addAdvisor(int, org.springframework.aop.Advisor) throws org.springframework.aop.framework.AopConfigException; void addAdvisor(org.springframework.aop.Advisor) throws org.springframework.aop.framework.AopConfigException; void setTargetSource(org.springframework.aop.TargetSource); org.springframework.aop.TargetSource getTargetSource(); void setPreFiltered(boolean); boolean isPreFiltered(); boolean isInterfaceProxied(java.lang.Class); boolean removeAdvisor(org.springframework.aop.Advisor); void removeAdvisor(int)throws org.springframework.aop.framework.AopConfigException; boolean replaceAdvisor(org.springframework.aop.Advisor, org.springframework.aop.Advisor) throws org.springframework.aop.framework.AopConfigException; void addAdvice(org.aopalliance.aop.Advice) throws org.springframework.aop.framework.AopConfigException; void addAdvice(int, org.aopalliance.aop.Advice) throws org.springframework.aop.framework.AopConfigException; boolean removeAdvice(org.aopalliance.aop.Advice); java.lang.String toProxyConfigString(); boolean isFrozen(); void setExposeProxy(boolean); boolean isExposeProxy(); } </pre></td></tr></tbody></table><br /> <p><a name="minor3.2">{略模式</a></p> <p> <strong>{略模式原理</strong> </p> <p>{略模式֐思义是做某事的{略Q这在编E上通常是指完成某个操作可能有多U方法,q些Ҏ各有千秋Q可能有不同的适应的场合,然而这些操作方法都有可能用到。各一个操作方法都当作一个实现策略,使用者可能根据需要选择合适的{略?/p> <p>下面是策略模式的l构Q?/p> <br /><a name="fig22"><strong>?23. {略模式的结?/strong></a><br /> <img alt="?23. {略模式的结? src="http://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/image022.png" height="223" width="458" /> <br /> <ul><li>ContextQ用不同策略的环境Q它可以Ҏ自n的条仉择不同的策略实现类来完成所要的操作。它持有一个策略实例的引用。创建具体策略对象的Ҏ也可以由他完成?/li><li>StrategyQ抽象策略,定义每个{略都要实现的策略方?/li><li>ConcreteStrategyQ具体策略实现类Q实现抽象策略中定义的策略方?/li></ul> <p> <strong>Spring 中策略模式的实现</strong> </p> <p>Spring 中策略模式用有多个地方Q如 Bean 定义对象的创Z及代理对象的创徏{。这里主要看一下代理对象创建的{略模式的实现?/p> <p>前面已经了解 Spring 的代理方式有两个 Jdk 动态代理和 CGLIB 代理。这两个代理方式的用正是用了{略模式。它的结构图如下所C:</p> <br /><a name="fig23"><strong>?24. Spring 中策略模式结构图</strong></a><br /> <img alt="?24. Spring 中策略模式结构图" src="http://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/image023.png" height="345" width="572" /> <br /> <p>在上面结构图中与标准的策略模式结构稍微有点不同,q里抽象{略?AopProxy 接口QCglib2AopProxy ? JdkDynamicAopProxy 分别代表两种{略的实现方式,ProxyFactoryBean 是代表 Context 角色Q它Ҏ条g选择使用 Jdk 代理方式q是 CGLIB 方式Q而另外三个类主要是来负责创徏具体{略对象QProxyFactoryBean 是通过依赖的方法来兌具体{略对象的,它是通过调用{略对象?getProxy(ClassLoader classLoader) Ҏ来完成操作?/p> <p ibm-back-to-top"=""><a >回页?/a></p><p><a name="major4">ȝ</a></p> <p>本文通过?Spring 的几个核心组件入手,试图扑և构徏 Spring 框架的骨骼架构,q而分?Spring 在设计的一些设计理念,是否从中扑և一些好的设计思想Q对我们以后E序设计能提供一些思\。接着再详l分析了 Spring 中是如何实现q些理念的,以及在设计模式上是如何用的?/p> <p>通过分析 Spring l我一个很大的启示是其这套设计理念其实对我们有很强的借鉴意义Q它通过抽象复杂多变的对象,q一步做规范Q然后根据它定义的这套规范设计出一个容器,容器中构建它们的复杂关系Q其实现在有很多情况都可以用q种cM的处理方法?/p> <p>虽然我很x我对 Spring 的想法完全阐q清楚,但是所?#8220;书不言Q言不尽意?#8221;Q有什么不Ҏ者不清楚的地方大家还是看看其源码吧?/p> <br /> <p><a name="resources">参考资?</a></p><p><strong>学习</strong></p><ul><li>“<a >Spring pd: Spring 框架?/a>”QdeveloperWorksQ?005 q?8 月)Q在q由三部分组成的介绍 Spring 框架的系列文章的W一期中Q将开始学习如何用 Spring 技术构量的、强壮的 J2EE 应用E序?br /><br /></li><li>“<a >AOP@Work: ?AspectJ ?Spring q行依赖Ҏ?/a>”QdeveloperWorksQ?006 q?1 月)Q依赖项插入和面向方面编E是互补的技术,所以想把它们结合在一起用是很自然的。本文探索两者之间的关系Qƈ了解怎样才能把它们组合在一P来促q高U的依赖Ҏ入场景?br /><br /></li><li>“<a >Spring 2 ?JPA ?/a>”QdeveloperWorksQ?006 q?8 月)Q您学习如何用 Spring 2 框架从头开始创建服务器应用E序?br /><br /></li><li>查看本文作者的其它文章Q?#8220;<a >Tomcat pȝ原理分析</a>”?#8220;<a >Tomcat 设计模式分析</a>”?br /><br /></li><li> <a >技术书?/a>Q浏览关于这些和其他技术主题的图书?br /><br /></li><li> <a >developerWorks Java 技术专?/a>Q数癄关于 Java ~程各个斚w的文章?br /><br /></li></ul><p><strong>获得产品和技?/strong></p><ul><li> <a >Springframework |站</a>Q下?Spring 框架?br /><br /></li></ul><p><strong>讨论</strong></p><ul><li>加入 <a >developerWorks C֌</a>?br /><br /></li><li>查看 <a >developerWorks 博客</a> 的最C息?br /></li></ul></div><br /><img src ="http://www.tkk7.com/zhb8015/aggbug/379375.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/zhb8015/" target="_blank">zhb8015</a> 2012-05-28 17:53 <a href="http://www.tkk7.com/zhb8015/articles/379375.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 动态代理机制分析及扩展Q第 1 部分(?http://www.tkk7.com/zhb8015/articles/379372.htmlzhb8015zhb8015Mon, 28 May 2012 09:05:00 GMThttp://www.tkk7.com/zhb8015/articles/379372.htmlhttp://www.tkk7.com/zhb8015/comments/379372.htmlhttp://www.tkk7.com/zhb8015/articles/379372.html#Feedback0http://www.tkk7.com/zhb8015/comments/commentRss/379372.htmlhttp://www.tkk7.com/zhb8015/services/trackbacks/379372.htmlhttps://www.ibm.com/developerworks/cn/java/j-lo-proxy1/

zhb8015 2012-05-28 17:05 发表评论
]]>
վ֩ģ壺 99re6ƵƷ| ޵Ӱѹۿ| ƷƵվ| aƬ߹ۿ| Ůվѿվ | ŮŮվѿ| ɫŮһ| ëƬѹۿַ| AVɫ߹ۿ| 91þþþþþ| Ʒ| ˵va| ɫַ߹ۿ| þ޾ƷƷ| 91㽶߹ۿѸ| žžƵ| ĻӰԺַ| ĻӰӾþþ| һ߹ۿƷ | ޾Ʒþ| ˬָ߳Ƶ| ŮһëƬѹۿ| ݺۺɫ| ƷѴƬ| avۺ߹ۿ| ѹۿɫƬ| ɫѹۿ| þۺɫһ| ĻmvƵ7| һƵ߲| պ޴߶ȸ| þþžѾƷ6| ӾƷ| ҹδʮվ2| 91۲ѹ| va޵Ӱ| ŷ޵һa߹ۿ| ƵƬaaëƬ| վ߹ۿ| AVӰԺ | ޼ƵͼƬ|