黑馬程式員——高新技術

來源:互聯網
上載者:User

標籤:style   http   io   使用   java   ar   for   檔案   div   

 實作類別似spring的可配置的AOP架構
從源頭上說 aop總共有那麼幾種方法
1.用AspectJ,這需要引入該文法的編譯器,但是功能最強大,spring貌似有對其提供支援或者封裝,用spring可以不用引入AspectJ編譯器直接是用Annotation來是用aspectJ的aop功能。

2.是用asm或apache commons項目的BCEL包直接操作class檔案,如。spring中需要引入asm包,所以裡面肯定有引用該功能的地方。如Hibernate即是使用該包實現實體映射

工廠類BeanFactory負責建立目標類或代理類的執行個體對象,並通過設定檔實現切換。其getBean方法根據參數字串返回一個相應的執行個體對象,如果參數字串在設定檔中對應的類名不是ProxyFactoryBean,則直接返回該類的執行個體對象,否則,返回該類執行個體對象的getProxy方法返回的對象。


BeanFactory的構造方法接收代表設定檔的輸入資料流對象,設定檔格式如下:
#xxx=java.util.ArrayList
xxx=cn.itcast.ProxyFactoryBean
xxx.target=java.util.ArrayList
xxx.advice=cn.itcast.MyAdvice

ProxyFacotryBean充當封裝產生動態代理的工廠,需要為工廠類提供哪些配置參數資訊?
目標
通知


編寫用戶端應用:
編寫實現Advice介面的類和在設定檔中進行配置
調用BeanFactory擷取對象

 

樣本:

ProxyFactoryBean.java

package com.itheima.day3.aopframework;

 

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.Proxy;

 

import com.itheima.day3.Advice;

 

public class ProxyFactoryBean {

       private Advice advice ;

       private Object target ;

      

       public Advice getAdvice() {

             return advice ;

      }

 

       public void setAdvice(Advice advice) {

             this .advice = advice;

      }

 

       public Object getTarget() {

             return target ;

      }

 

       public void setTarget(Object target) {

             this .target = target;

      }

 

       public Object getProxy(){

            Object proxy = Proxy. newProxyInstance(

                target .getClass().getClassLoader(),

                target .getClass().getInterfaces(),

                new InvocationHandler() {

                      public Object invoke(Object proxy, Method method, Object[] args)

                                  throws Throwable {

                         advice .beforeAdvice(method);

                         Object retVal = method.invoke( target ,args);

                         advice .afterAdvice(method);

                         return retVal;

                     }

               }

         );

         return proxy;

   };

}

 

BeanFactory.java

package com.itheima.day3.aopframework;

 

import java.io.IOException;

import java.io.InputStream;

import java.util.Properties;

 

import com.itheima.day3.Advice;

 

publicclassBeanFactory {

 

      Propertiesprops=newProperties();

      

      publicBeanFactory(InputStream ips){

            try{

                  props.load(ips);

            }catch(IOException e) {

                  e.printStackTrace();

            }

      }

      

      publicObject getBean(String name) {

            String className =props.getProperty(name);

            Object bean =null;

            try{

                  Class clazz = Class.forName(className);

                  bean = clazz.newInstance();

            }catch(Exception e) {

                  e.printStackTrace();

            }

            if(beaninstanceofProxyFactoryBean){

                  ProxyFactoryBean proxyFactoryBean = (ProxyFactoryBean)bean;

                  Object proxy =null;

                  try{

                        Advice advice = (Advice) Class. forName(

                                    props.getProperty(name +".advice")).newInstance();

                        Object target = Class. forName(

                                    props.getProperty(name +".target")).newInstance();

                        proxyFactoryBean.setAdvice(advice);

                        proxyFactoryBean.setTarget(target);

                        proxy = proxyFactoryBean.getProxy();

                  }catch(Exception e) {

                        e.printStackTrace();

                  }

                  returnproxy;

            }

            returnbean;

      }

}

 

AopFrameworkTest.java

package com.itheima.day3.aopframework;

 

import java.io.InputStream;

 

publicclassAopFrameworkTest {

 

      publicstaticvoidmain(String[] args)throwsException{

            InputStream ips = AopFrameworkTest.class.getResourceAsStream("config.properties");

            Object bean =newBeanFactory(ips).getBean("xxx");

            System.out.println(bean.getClass().getName());

      }

}

  

詳情請查看:http://edu.csdn.net/heima

黑馬程式員——高新技術

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.