musiclover

          Spring AOP 學習筆記

          AOP  Aspect Oriented Programing  面向方面編程
          AOP 術語
          連接點:(Joinpoint)    程序執行的特定位置(類開始初始化前、類初始化后、調用前后、異常拋出后)
          切點:   (PointCut)     程序類中客觀存在的事物(類中的方法)
          增強 :  (Advice)        置入到目標類Joinpint的一段代碼
          目標對象:(Target)   引介(Introduction)  織入(Weaving)  代理(Proxy) 切面(Aspect):切點和增強的組成 
           
          基礎知識: Spring Aop :使用動態代理技術在運行期間織入增強代碼
          ProxyFactory 代理工廠采用JDK代理或CGLib代理技術
          JDK 動態代理:
          1.定義UserService接口函數:
          public interface UserService {
          public void addUser(int id);
           }

          2.UserServiceImpl
          public class UserServiceImpl implements UserService{
           
          public void addUser(int id){
               System.out.println(
          "添加一個用戶中 :"+id);
           }

          }

          3.ProxyHandler
          import java.lang.reflect.InvocationHandler;
          import java.lang.reflect.Method;


          public class ProxyHandler implements InvocationHandler{
             
          private Object target;
             
          public  ProxyHandler(Object target){
                 
          this.target=target;
             }

             
          public Object invoke(Object proxy, Method method, Object[] args)
                  
          throws Throwable {
                 System.out.println(
          "添加用戶前");
                 Object obj
          =method.invoke(target,args);
                 System.out.println(
          "添加用戶后");
                 
          return obj;
          }

          }

          TestProxyHandler
          import java.lang.reflect.Proxy;

          public class ProxyHandlerTest {
            
          public static void main(String args[]){
                UserService target
          =new UserServiceImpl();
                ProxyHandler handler
          =new ProxyHandler(target);
                UserService proxy
          =(UserService)Proxy.newProxyInstance(
                  target.getClass().getClassLoader(),
                  target.getClass().getInterfaces(),
                  handler);
                proxy.addUser(
          100);
            }

          }

          CGLib 代理:
          AddUserService接口:
          package CGlib.Text.Service;

          public interface AddUserService {
           
          public void addUser(int id);
          }

          AddUserServiceImpl 實現類:
          package CGlib.Text.Service;

          public class AddUserServiceImpl implements AddUserService {

              
          public void addUser(int id) {
                  System.out.println(
          "添加用戶ID中:"+id);
              }
          }
          CglibProxy 代理類:
          package CGlib.Text.Service;



          import java.lang.reflect.Method;

          import net.sf.cglib.proxy.Enhancer;
          import net.sf.cglib.proxy.MethodInterceptor;
          import net.sf.cglib.proxy.MethodProxy;

          public class CglibProxy implements MethodInterceptor{
              
          private Enhancer enhancer=new Enhancer();
              @SuppressWarnings(
          "unchecked")
              
          public Object getProxy(Class clazz){
                  enhancer.setSuperclass(clazz);
                  enhancer.setCallback(
          this);
                  
          return enhancer.create();        
              }


              
          public Object intercept(Object obj, Method method, Object[] args,
                      MethodProxy proxy) 
          throws Throwable {
                  System.out.println(
          "添加用戶之前");
                  System.out.print(method.getName());
                  System.out.print(obj.getClass().getName()
          +"外加");
                  System.out.print(args.getClass().getName());
                  Object result
          =proxy.invokeSuper(obj, args);
                  System.out.println(
          "外加的參數"+args.toString());
                  System.out.println(
          "添加用戶之后");
                  
          // TODO Auto-generated method stub
                  return result;
              }

              

          }


          CglibProxyTest:測試類
          package CGlib.Text.Service;

          public class CglibProxyTest {
              
          public static void main(String[] args){
                  CglibProxy proxy
          =new CglibProxy();
                  AddUserServiceImpl userService
          =
                      (AddUserServiceImpl)proxy.getProxy(AddUserServiceImpl.
          class);
                userService.addUser(
          100);        
              }


          }


          對JDK動態代理和Cglib動態代理的理解:
          JDK   代理時性能高,但生成代理對象時運行性能較低
          Cglib 代理時性能低,但生成代理對象時運行性能較高
          所以:單例Singleton 時采用CGLib代理。

          posted on 2009-08-23 22:52 Jxi 閱讀(137) 評論(0)  編輯  收藏 所屬分類: Spring FrameWork


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          My Links

          Blog Stats

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 土默特左旗| 通辽市| 罗田县| 安多县| 平南县| 乌兰察布市| 花莲县| 平邑县| 盐山县| 启东市| 凯里市| 水富县| 长宁县| 徐州市| 磴口县| 沂南县| 沈丘县| 孟连| 湟中县| 曲周县| 板桥市| 华宁县| 余干县| 武乡县| 平果县| 徐州市| 麻江县| 嫩江县| 香河县| 清新县| 高尔夫| 宁海县| 高碑店市| 通城县| 房山区| 六安市| 改则县| 库伦旗| 盘山县| 镇江市| 林口县|