动态代理:(前提是要有接口)
CGLIB实现的动态代理:不需要有接口
业务层的动态代理实例:
package 动态代理设计模式;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ServiceProxy implements InvocationHandler{
private Object target ;//真实对象
public Object bind(Object target){//返回代理对象
this.target=target;//绑定真实对象
return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(), this);
}
/**
* 代理类代理真实主题的操作方法
* @param proxy:代理类的对象
* 需要真实主题对象来执行真实的主题任务
*/
public void ready(){
System.out.println("关闭自动提交事务");
}
public void commit(){
System.out.println("提交事务");
}
public void rollback(){
System.out.println("回滚事务");
}
public void close(){
System.out.println("关闭数据库连接");
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result=null;
if(method.getName().startsWith("do")){
this.ready();
try{
result=method.invoke(this.target, args);
this.commit();
}catch(Exception e){
this.rollback();
}finally{
this.close();
}
}else{
result=method.invoke(this.target, args);
}
return result;//返回真实对象操作的结果
}
}