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接口:
AddUserServiceImpl 實現類:
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代理。
AOP 術語
連接點:(Joinpoint) 程序執行的特定位置(類開始初始化前、類初始化后、調用前后、異常拋出后)
切點: (PointCut) 程序類中客觀存在的事物(類中的方法)
增強 : (Advice) 置入到目標類Joinpint的一段代碼
目標對象:(Target) 引介(Introduction) 織入(Weaving) 代理(Proxy) 切面(Aspect):切點和增強的組成
基礎知識: Spring Aop :使用動態代理技術在運行期間織入增強代碼
ProxyFactory 代理工廠采用JDK代理或CGLib代理技術
JDK 動態代理:
1.定義UserService接口函數:











































AddUserService接口:
package CGlib.Text.Service;
public interface AddUserService {
public void addUser(int id);
}
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 代理類:public class AddUserServiceImpl implements AddUserService {
public void addUser(int id) {
System.out.println("添加用戶ID中:"+id);
}
}



































CglibProxyTest:測試類












對JDK動態代理和Cglib動態代理的理解:
JDK 代理時性能高,但生成代理對象時運行性能較低
Cglib 代理時性能低,但生成代理對象時運行性能較高
所以:單例Singleton 時采用CGLib代理。
posted on 2009-08-23 22:52 Jxi 閱讀(137) 評論(0) 編輯 收藏 所屬分類: Spring FrameWork