AOP与代理模式【1】

85 阅读3分钟

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

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

什么是Aop?

AOP为Aspect Oriented Programming的缩写,意思为面向切面编程,是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。 AOP的作用:不修改源码的情况下,程序运行期间对方法进行功能增强 好处:1、减少代码的重复,提高开发效率,便于维护。 2、专注核心业务的开发。 核心业务和服务性代码混合在一起 开发中:各自做自己擅长的事情,运行的时候将服务性代码织入到核心业务中。 通过spring工厂自动实现将服务性代码以切面的方式加入到核心业务代码中。

AOP的实现机制——动态代理

什么是代理模式

代理:自己不做,找人帮你做。 代理模式:在一个原有功能的基础上添加新的功能。分类:静态代理和动态代理。

静态代理

1) 可以做到在不修改目标对象的功能前提下,对目标对象功能扩展。 2) 缺点:因为代理对象,需要与目标对象实现一样的接口。所以会有很多代理类,类太多。 一旦接口增加方法,目标对象与代理对象都要维护。

原有方式:核心业务和服务方法都编写在一起
 package com.jinhuan.service;
 ​
 /**
  * @Author jinhuan
  * @Date 2022/7/3 20:38
  * Description:
  */
 public class TeamService {
     /**
      * 传统的代码逻辑【不合理】
      * 因为耦合度高,当服务型代码发生改变的时候,不易操作,不易维护
      * 核心层应该专注核心代码的开发
      * */
     public void add(){
         try {
             System.out.println("开始事务!");
             System.out.println("TeamService核心业务--------add()-----");
             System.out.println("提交事务!");
         } catch(Exception e) {
             System.out.println("回滚事务!");
         }
     }
     public void update(){
         try {
             System.out.println("开始事务!");
             System.out.println("TeamService核心业务--------update()-----");
             System.out.println("提交事务!");
         } catch(Exception e) {
             System.out.println("回滚事务!");
         }
     }
 }
基于类的静态代理

将服务性代码分离出来,核心业务--保存业务中只有保存功能

TeamService

 package com.jinhuan.service;
 ​
 /**
  * @Author jinhuan
  * @Date 2022/7/3 20:38
  * Description:
  */
 public class TeamService {
     /**
      * 传统的代码逻辑【不合理】
      * 因为耦合度高,当服务型代码发生改变的时候,不易操作,不易维护
      * 核心层应该专注核心代码的开发
      * */
     public void add(){
         try {
             System.out.println("开始事务!");
             System.out.println("TeamService核心业务--------add()-----");
             System.out.println("提交事务!");
         } catch(Exception e) {
             System.out.println("回滚事务!");
         }
     }
     public void update(){
         try {
             System.out.println("开始事务!");
             System.out.println("TeamService核心业务--------update()-----");
             System.out.println("提交事务!");
         } catch(Exception e) {
             System.out.println("回滚事务!");
         }
     }
 }

静态代理类ProxyTeamService

 package com.jinhuan.service.staticProxy;
 ​
 import com.jinhuan.service.TeamService;
 ​
 /**
  * @Author jinhuan
  * @Date 2022/7/3 20:45
  * Description:TeamService的静态代理类
  *          要去继承被代理的类
  * 核心功能由被代理对象来完成,其他的服务型业务由代理类来完成
  * 【弊端】一个代理类只能代理一个类,当类多的时候,代理类也多,不易维护
  *
  */
 public class ProxyTeamService extends TeamService {
     @Override
     public void add(){
         try {
             System.out.println("开始事务!");
             super.add();//核心功能由被代理对象来完成,其他的服务型业务由代理类来完成
             System.out.println("提交事务!");
         } catch(Exception e) {
             System.out.println("回滚事务!");
         }
     }
     @Override
     public void update(){
         try {
             System.out.println("开始事务!");
             super.update();
             System.out.println("提交事务!");
         } catch(Exception e) {
             System.out.println("回滚事务!");
         }
     }
 }

测试类

 package com.jinhuan.test;
 ​
 import com.jinhuan.service.TeamService;
 import com.jinhuan.service.staticProxy.ProxyTeamService;
 import org.junit.Test;
 ​
 /**
  * @Author jinhuan
  * @Date 2022/7/3 23:24
  * Description:测试基于类的静态代理
  */
 public class Test01 {
     @Test
     public void test(){
         TeamService teamService = new ProxyTeamService();
         teamService.add();
     }
 }

image-20220703232946227