java學習

          java學習

           

          設(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)的,只能代理訪問接口中的方法。

          posted on 2017-09-14 15:49 楊軍威 閱讀(137) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
          博客園   IT新聞   Chat2DB   C++博客   博問  
           

          導航

          統(tǒng)計

          常用鏈接

          留言簿

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 康乐县| 汝阳县| 金塔县| 宜兴市| 大宁县| 青龙| 明水县| 炎陵县| 宜城市| 敦煌市| 宜良县| 安岳县| 华亭县| 巴青县| 金塔县| 泸溪县| 大田县| 调兵山市| 澜沧| 通江县| 长海县| 朔州市| 凤凰县| 宣化县| 石渠县| 武乡县| 南乐县| 南投市| 湖北省| 凤翔县| 木里| 宁安市| 南城县| 会理县| 镇巴县| 顺义区| 丰原市| 大厂| 安宁市| 罗甸县| 花垣县|