代理建立的兩種方式

來源:互聯網
上載者:User
Spring有兩種建立代理的方式1、如果目標對象實現一個或多個介面暴露的方法,spring將使用JDK的java.lang.reflect.Proxy類建立代理。此類動態產生一個新類,該類實現了所需的介面,織入通知並代理對目標對象的所有請求2、若目標對象未實現任何介面,spring使用CGLIB庫產生目標對象的子類;在建立該子類時,織入通知並將目標對象的調用委託給該子類。此種代理方式需注意:1)對介面建立代理優於對類建立代理2)標記為final的方法不能被通知兩種建立代理方式的案例1、使用JDK建立首先建立一個抽象的主題角色---------公用的介面public interface personService {//找房子public void findHouse();//找好房子public void findHouse(String address,String name);}建立一個真實的主題角色--------實體類public class PersonServiceBean implements personService{@Overridepublic void findHouse() {// TODO Auto-generated method stubSystem.out.println("------------------方法執行啦------------------------");}@Overridepublic void findHouse(String address, String name) {// TODO Auto-generated method stubSystem.out.println("========================找好房子的方法===============");}}建立一個代理主題角色-----第二個實體類public class ProxyPersonServiceBean implements personService{//真實主題引入的操作private PersonServiceBean personServiceBean=new PersonServiceBean();@Overridepublic void findHouse() {System.out.println("處理一些操作");personServiceBean.findHouse();System.out.println("處理一些操作");}@Overridepublic void findHouse(String address, String name) {// TODO Auto-generated method stub}}注意:使用JDK方式建立代理對象一定要記得讓兩個實體類繼承統一介面建立代理----------實現了InvocationHandler介面的實體類public class JDKProxy implements InvocationHandler{//代理的目標對象    真實主題角色private Object targetObject;//根據目標對象建立代理對象public Object createProxyInstrance(PersonServiceBean personServiceBean){this.targetObject=personServiceBean;//返回目標代理對象//第一個參數設定代碼使用的類載入器,一般採用跟目標相同的類載入器return Proxy.newProxyInstance(personServiceBean.getClass().getClassLoader(), personServiceBean.getClass().getInterfaces(),this);}/* * proxy:代理對象 * method:代理方法 * args:代理方法的參數 * (non-Javadoc) * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[]) */@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {System.out.println("代理類的名稱"+proxy.getClass().getName());System.out.println("方法的名稱"+method.getName());if(args!=null && args.length>0 ){System.out.println("第一個參數是"+args[0].toString());}//執行目標方法//第一個參數代表目標類Object result=method.invoke(this.targetObject, args);return result;}}測試方法:@Testpublic void test() {//處理操作        真實主題    角色PersonServiceBean personServiceBean=new PersonServiceBean();//代理JDKProxy jdkProxy=new JDKProxy();//建立代理對象Object proxyObject=jdkProxy.createProxyInstrance(personServiceBean);//返回的是一個介面對象personService p=(personService) proxyObject;p.findHouse();p.findHouse("aaaaaaaaaaaaa", "ccccc");}2、使用CGLIB建立PersonServiceBean類public class PersonServiceBean {public void findHouse() {// TODO Auto-generated method stubSystem.out.println("------------------方法執行啦------------------------");}public void findHouse(String address, String name) {// TODO Auto-generated method stubSystem.out.println("========================找好房子的方法===============");}}CglibPersonServiceBean類public class CglibPersonServiceBean implements MethodInterceptor{//代理目標對象    真實主題    角色private Object targetObject;//根據目標對象建立代理對象public Object createProxyInstrance(Object targetObject){this.targetObject=targetObject;Enhancer enhancer=new Enhancer();enhancer.setSuperclass(this.targetObject.getClass());enhancer.setCallback(this);return enhancer.create();//建立代理對象}@Overridepublic Object intercept(Object object, Method method, Object[] args,MethodProxy arg3) throws Throwable {System.out.println("代理類的名稱"+object.getClass().getName());System.out.println("方法的名稱"+method.getName());if(args!=null && args.length>0 ){System.out.println("第一個參數是"+args[0].toString());}//執行目標對象的方法Object result=arg3.invoke(this.targetObject, args);return result;}}測試:public static void main(String[] args) {//處理操作        真實主題    角色PersonServiceBean personServiceBean=new PersonServiceBean();//cglib代理CglibPersonServiceBean cProxy = new CglibPersonServiceBean();//建立代理對象Object proxyObject=cProxy.createProxyInstrance(personServiceBean);//賦值給真的主題   類的對象personService p=(personService) proxyObject;p.findHouse();p.findHouse("aaaaaaaaaaaaa", "ccccc");}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.