AOP:aspect Object programming(面向切面編程)
連接點:是在程序執行過程中某個特定的點,比如某個方法調用的時候或者處理異常的時候
通知(Advice):在切面某個特定的連接點上執行的動作
切入點:通知一個與切入點表達式關聯,並在滿足這個切入點的連接點上運行
Aop代理:可以是jdk動態代理或cglib代理
JDK動態代理:在jdk1.3以後在其java.lang.reflect裏面提供了一個InvocationHandler 和一個Proxy類, 它是基於接口編程的,必須要有一個接口.編寫Handler類,繼承InvocationHandler接口代碼如下:
public interface IUserDao {
public void save();
public void update();
public void delete();
}
public class UserDaoIm{
public void save() {
System.out.println("保存用戶信息");
}
public void update() {
System.out.println("更新用戶信息");
}
public void delete() {
System.out.println("刪除用戶信息");
}
}
public class Handler implements InvocationHandler{
private Object target;
public Handler(Object target){
this.target=target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("開始事務提交了.....");
method.invoke(target, args);
System.out.println("事務提交成功....");
return target;
}
}
public class Test8 { public static void main(String[] args) { //目標類 IUserDao userDao=new UserDaoIm(); //處理類 Handler handler=new Handler(userDao); //代理 IUserDao proxy=(IUserDao)Proxy.newProxyInstance(userDao.getClass().getClassLoader(), userDao.getClass().getInterfaces(), handler); proxy.save(); } }
cglib代理類:不需要接口
public class UserDaoIm{
public void save() {
System.out.println("保存用戶信息");
}
public void update() {
System.out.println("更新用戶信息");
}
public void delete() {
System.out.println("刪除用戶信息");
}
}
public class UserHandler implements MethodInterceptor {
private Enhancer enhancer= new Enhancer();
public Object getProxyObject(Class clz){
enhancer.setSuperclass(clz);
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
System.out.println("開始提交事務了.....");
Object object=proxy.invokeSuper(obj, args);
return object;
}
}
public static void main(String[] args) { UserHandler userHandler=new UserHandler(); UserDaoIm userDaoIm=(UserDaoIm)userHandler.getProxyObject(UserDaoIm.class); userDaoIm.save(); }