基于接口的静态代理

66 阅读3分钟


携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情

哈喽,大家好!我是Why,一名在读学生,目前刚刚开始进入自己的编程学习生涯。虽然学习起步较晚,但我坚信做了才有0或1的可能。学了一段时间以后也是选择在掘金上分享自己的日常笔记,也希望能够在众多道友的大家庭中打成一片。 本文主要讲解基于接口的静态代理,如果大家读后觉得有用的话,还请大家多多支持博主:欢迎 ❤️点赞👍、收藏⭐、留言💬 ✨✨✨个人主页:JinHuan

基于接口的静态代理

为核心业务(例如add)创建一个接口,通过接口暴露被代理的方法要求:代理类和被代理类都实现了同一个接口

IService

 package com.jinhuan.service;
 ​
 /**
  * @Author jinhuan
  * @Date 2022/7/3 20:56
  * Description:
  */
 public interface IService {
     void add();
 }

BookService

 package com.jinhuan.service;
 ​
 /**
  * @Author jinhuan
  * @Date 2022/7/3 20:55
  * Description: 基于类的静态代理
  */
 public class BookService implements IService {
 ​
     public void add(){
         System.out.println("BookService------add()-----");
     }
 }

事务服务

 package com.jinhuan.service.staticProxy;
 ​
 import com.jinhuan.service.IService;
 ​
 /**
  * @Author jinhuan
  * @Date 2022/7/3 20:57
  * Description:
  * 基于接口的静态代理
  *      【代理事务类】
  *          代理类和被代理类要去实现同一个接口
  */
 public class ProxyTranService implements IService {
     //被代理的对象
     private IService service;
 ​
     //可以要求在创建代理类的时候必须把被代理对象加进去
     public ProxyTranService(IService service) {
         this.service = service;
     }
 ​
     public void add(){
         try {
             System.out.println("开始事务!");
             service.add();//核心功能由被代理对象来完成,其他的服务型业务由代理类来完成
             System.out.println("提交事务!");
         } catch(Exception e) {
             System.out.println("回滚事务!");
         }
     }
 }

日志服务

 package com.jinhuan.service.staticProxy;
 ​
 import com.jinhuan.service.IService;
 ​
 /**
  * @Author jinhuan
  * @Date 2022/7/3 21:20
  * Description:
  */
 public class ProxyLogService {
     //被代理的对象
     private IService service;
 ​
     //可以要求在创建代理类的时候必须把被代理对象加进去
     public ProxyLogService(IService service) {
         this.service = service;
     }
 ​
     public void add(){
         try {
             System.out.println("开始日志!");
             service.add();//核心功能由被代理对象来完成,其他的服务型业务由代理类来完成
             System.out.println("结束日志!");
         } catch(Exception e) {
             System.out.println("异常日志!");
         }
     }
 }

测试类

 package com.jinhuan.test;
 ​
 import com.jinhuan.service.BookService;
 import com.jinhuan.service.UserService;
 import com.jinhuan.service.staticProxy.ProxyLogService;
 import com.jinhuan.service.staticProxy.ProxyTranService;
 import org.junit.Test;
 ​
 /**
  * @Author jinhuan
  * @Date 2022/7/3 21:01
  * Description: 使用基于接口实现的代理类,可以使用一个代理类区代理该接口的所有实现类
  */
 public class Test02 {
     @Test
     public void test(){
         BookService bookService = new BookService();
         UserService userService = new UserService();
 ​
 ​
         //一个代理类可以代理该接口的所有实现类
         //ProxyTranService tranService = new ProxyTranService(bookService);
         ProxyTranService tranService = new ProxyTranService(userService);
         //tranService.add();
 ​
         //实现二级代理,即在事务的基础上加上日志,此时的被代理类就是已经代理的一级代理类
         //二级代理服务一级代理
         ProxyLogService logService = new ProxyLogService(tranService);
         logService.add();
 ​
     }
 }

image-20220703233345888

基于切面的AOP接口

提取出切面代码,作为AOP接口。共有4个位置可以将切面代码编织进入核心业务代码中。

Aop接口

 package com.jinhuan.aop;
 ​
 /**
  * @Author jinhuan
  * @Date 2022/7/3 22:50
  * Description:四个切入位置
  */
 public interface Aop {
     void before();
     void after();
     void exception();
     void myFinally();
 }

LogAop

 package com.jinhuan.aop;
 ​
 /**
  * @Author jinhuan
  * @Date 2022/7/3 22:51
  * Description:
  */
 public class LogAop implements Aop{
     public void before() {
         System.out.println("日志----before()--------");
     }
 ​
     public void after() {
         System.out.println("日志----after()--------");
     }
 ​
     public void exception() {
         System.out.println("日志----exception()--------");
     }
 ​
     public void myFinally() {
         System.out.println("日志----myFinally()--------");
     }
 }

TranAop

 package com.jinhuan.aop;
 ​
 /**
  * @Author jinhuan
  * @Date 2022/7/3 22:51
  * Description:
  */
 public class TranAop implements Aop {
     public void before() {
         System.out.println("事务----before()--------");
     }
 ​
     public void after() {
         System.out.println("事务----after()--------");
     }
 ​
     public void exception() {
         System.out.println("事务----exception()--------");
     }
 ​
     public void myFinally() {
         System.out.println("事务----myFinally()--------");
     }
 }

AopTestService

 package com.jinhuan.service;
 ​
 /**
  * @Author jinhuan
  * @Date 2022/7/3 23:05
  * Description:
  */
 public class AopTestService implements IService{
     public void add() {
         System.out.println("AopTestService---------add()------");
     }
 }

TestAop

 package com.jinhuan.test;
 ​
 import com.jinhuan.aop.Aop;
 import com.jinhuan.aop.LogAop;
 import com.jinhuan.aop.TranAop;
 import com.jinhuan.service.AopTestService;
 import com.jinhuan.service.IService;
 import com.jinhuan.service.staticProxy.ProxyAopService;
 import org.junit.Test;
 ​
 /**
  * @Author jinhuan
  * @Date 2022/7/3 23:06
  * Description:测试切面
  */
 public class TestAop {
     @Test
     public void test(){
         //被代理对象
         IService aopTestService = new AopTestService();
         //两个服务型切面
         Aop tranAop = new TranAop();
         Aop logAop = new LogAop();
 ​
         IService tranService = new ProxyAopService(aopTestService, tranAop);
         //tranService.add();
 ​
         IService logService = new ProxyAopService(tranService, logAop);
         logService.add();
     }
 }

image-20220703233749475