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();
}
策略模式
策略模式原理
策略模式顧名思義就是做某事的策略,這在編程上通常是指完成某個(gè)操作可能有多種方法,這些方法各有千秋,可能有不同的適應(yīng)的場(chǎng)合,然而這些操作方法都有可能用到。各一個(gè)操作方法都當(dāng)作一 個(gè)實(shí)現(xiàn)策略,使用者可能根據(jù)需要選擇合適的策略。
下面是策略模式的結(jié)構(gòu):

圖23.策略模式的結(jié)構(gòu)
Context:使用不同策略的環(huán)境,它可以根據(jù)自身的條件選擇不同的策略實(shí)現(xiàn)類來完成所要的操作。它持有一個(gè)策略實(shí)例的引用。創(chuàng)建具體策略對(duì)象的方法也可以由他完成。
◆Strategy:抽象策略,定義每個(gè)策略都要實(shí)現(xiàn)的策略方法
◆ConcreteStrategy:具體策略實(shí)現(xiàn)類,實(shí)現(xiàn)抽象策略中定義的策略方法
◆Spring中策略模式的實(shí)現(xiàn)
◆Spring中策略模式使用有多個(gè)地方,如Bean定義對(duì)象的創(chuàng)建以及代理對(duì)象的創(chuàng)建等。這里主要看一下代理對(duì)象創(chuàng)建的策略模式的實(shí)現(xiàn)。
前面已經(jīng)了解Spring的代理方式有兩個(gè)Jdk動(dòng)態(tài)代理和CGLIB代理。這兩個(gè)代理方式的使用正是使用了策略模式。它的結(jié)構(gòu)圖如下所示:

圖24.Spring中策略模式結(jié)構(gòu)圖
在上面結(jié)構(gòu)圖中與標(biāo)準(zhǔn)的策略模式結(jié)構(gòu)稍微有點(diǎn)不同,這里抽象策略是AopProxy接口,Cglib2AopProxy和JdkDynamicAopProxy分別代表兩種策略的實(shí)現(xiàn)方式,ProxyFactoryBean就是代表Context角色 ,它根據(jù)條件選擇使用Jdk代理方式還是CGLIB方式,而另外三個(gè)類主要是來負(fù)責(zé)創(chuàng)建具體策略對(duì)象,ProxyFactoryBean是通過依賴的方法來關(guān)聯(lián)具體策略對(duì)象的,它是通過調(diào)用策略對(duì)象的getProxy (ClassLoaderclassLoader)方法來完成操作。