設(shè)計模式之jdk的動態(tài)代理
jdk的動態(tài)代理對象和目標對象要實現(xiàn)同一個接口。public class Classes implements Serializable{
private Long cid;
public Long getCid() {
return cid;
}
public void setCid(Long cid) {
this.cid = cid;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
private String cname;
private String description;
}
public interface ClassesDao {
public void saveClasses(Classes classes);
}
public class ClassesDaoImpl implements ClassesDao{
@Override
public void saveClasses(Classes classes) {
System.out.println("保存");
}
}
public class MyTransaction {
public void beginTransaction(){
System.out.println("開始事務(wù)");
}
public void commit(){
System.out.println("提交事務(wù)");
}
}
public class ClassesDaoInterceptor implements InvocationHandler{
private Object target;
private MyTransaction myTransaction;
public ClassesDaoInterceptor(Object target,MyTransaction myTransaction){
this.target = target;
this.myTransaction = myTransaction;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println(proxy.getClass().getName());
if(method.getName().equals("saveClasses")||
method.getName().equals("updateClasses")){
this.myTransaction.beginTransaction();//??
method.invoke(this.target, args);//?????
this.myTransaction.commit();
}else{
method.invoke(this.target, args);
}
return null;
}
}
public class ClassesDaoTest {
public static void testSaveClasses(){
Object target = new ClassesDaoImpl();
MyTransaction myTransaction = new MyTransaction();
ClassesDaoInterceptor interceptor = new ClassesDaoInterceptor(target, myTransaction);
ClassesDao proxyDao = (ClassesDao) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), interceptor);
Classes classes = new Classes();
classes.setCname("aaaa");
proxyDao.saveClasses(classes);
}
public static void main(String[] args) {
testSaveClasses();
}
}
spring的事務(wù)也是動態(tài)代理實現(xiàn)的,當一個服務(wù)類里的一個實現(xiàn)了服務(wù)接口的方法中調(diào)用另一個服務(wù)方法,第二個服務(wù)方法不會加入到事務(wù)中,因為這種調(diào)用方式不是被代理對象調(diào)用,而是實際目標對象調(diào)用,不會產(chǎn)生代理對象,所以第二個服務(wù)方法不會加入到事務(wù)中,如果想實現(xiàn)這種操作,需要先得到aop的代理對象,AopContext.currentProxy();,得到服務(wù)接口,進行調(diào)用服務(wù)方法。spring的事務(wù)代理是cglib實現(xiàn)的,只能代理訪問接口中的方法。
spring的事務(wù)也是動態(tài)代理實現(xiàn)的,當一個服務(wù)類里的一個實現(xiàn)了服務(wù)接口的方法中調(diào)用另一個服務(wù)方法,第二個服務(wù)方法不會加入到事務(wù)中,因為這種調(diào)用方式不是被代理對象調(diào)用,而是實際目標對象調(diào)用,不會產(chǎn)生代理對象,所以第二個服務(wù)方法不會加入到事務(wù)中,如果想實現(xiàn)這種操作,需要先得到aop的代理對象,AopContext.currentProxy();,得到服務(wù)接口,進行調(diào)用服務(wù)方法。spring的事務(wù)代理是cglib實現(xiàn)的,只能代理訪問接口中的方法。