Spring AOP 学习笔记

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代理。

你可能感兴趣的:(Spring AOP 学习笔记)