怎么做视频网站首页小学英语教师做应用相关网站
web/
2025/10/3 19:19:16/
文章来源:
怎么做视频网站首页,小学英语教师做应用相关网站,中国建筑网信息网,工信部网站备案系统登录本章概要
场景设定和问题复现解决技术代理模式面向切面编程思维#xff08;AOP#xff09;Spring AOP框架介绍和关系梳理
5.1 场景设定和问题复现
准备AOP项目 项目名#xff1a;spring-aop-annotation pom.xml dependencies!--spring context依赖--…本章概要
场景设定和问题复现解决技术代理模式面向切面编程思维AOPSpring AOP框架介绍和关系梳理
5.1 场景设定和问题复现
准备AOP项目 项目名spring-aop-annotation pom.xml dependencies!--spring context依赖--!--当你引入Spring Context依赖之后表示将Spring的基础依赖引入了--dependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion6.0.6/version/dependency!--junit5测试--dependencygroupIdorg.junit.jupiter/groupIdartifactIdjunit-jupiter-api/artifactIdversion5.3.1/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-test/artifactIdversion6.0.6/versionscopetest/scope/dependencydependencygroupIdjakarta.annotation/groupIdartifactIdjakarta.annotation-api/artifactIdversion2.1.1/version/dependency
/dependencies声明接口
/*** - * / 运算的标准接口!*/
public interface Calculator {int add(int i, int j);int sub(int i, int j);int mul(int i, int j);int div(int i, int j);}接口实现package com.atguigu.proxy;
/*** 实现计算接口,单纯添加 - * / 实现! 掺杂其他功能!*/
public class CalculatorPureImpl implements Calculator {Overridepublic int add(int i, int j) {int result i j;return result;}Overridepublic int sub(int i, int j) {int result i - j;return result;}Overridepublic int mul(int i, int j) {int result i * j;return result;}Overridepublic int div(int i, int j) {int result i / j;return result;}
}声明带日志接口 实现新需求 需要在每个方法中添加控制台输出输出参数和输出计算后的返回值 /*** 在每个方法中,输出传入的参数和计算后的返回结果!*/
public class CalculatorLogImpl implements Calculator {Overridepublic int add(int i, int j) {System.out.println(参数是 i , j);int result i j;System.out.println(方法内部 result result);return result;}Overridepublic int sub(int i, int j) {System.out.println(参数是 i , j);int result i - j;System.out.println(方法内部 result result);return result;}Overridepublic int mul(int i, int j) {System.out.println(参数是 i , j);int result i * j;System.out.println(方法内部 result result);return result;}Overridepublic int div(int i, int j) {System.out.println(参数是 i , j);int result i / j;System.out.println(方法内部 result result);return result;}
}代码问题分析
代码缺陷 对核心业务功能有干扰导致程序员在开发核心业务功能时分散了精力附加功能代码重复分散在各个业务功能方法中冗余且不方便统一维护 解决思路核心就是解耦。我们需要把附加功能从业务功能代码中抽取出来。将重复的代码统一提取并且[[动态插入]]到每个业务方法技术困难解决问题的困难提取重复附加功能代码到一个类中可以实现但是如何将代码插入到各个方法中我们不会我们需要引用新技术
5.2 解决技术代理模式
代理模式 二十三种设计模式中的一种属于结构型模式。 它的作用就是通过提供一个代理类让我们在调用目标方法的时候不再是直接对目标方法进行调用而是通过代理类间接调用。 让不属于目标方法核心逻辑的代码从目标方法中剥离出来——解耦。调用目标方法时先调用代理对象的方法减少对目标方法的调用和打扰同时让附加功能能够集中在一起也有利于统一维护。 无代理场景
有代理场景
生活中的代理
广告商找大明星拍广告需要经过经纪人合作伙伴找大老板谈合作要约见面时间需要经过秘书房产中介是买卖双方的代理太监是大臣和皇上之间的代理相关术语代理将非核心逻辑剥离出来以后封装这些非核心逻辑的类、对象、方法。(中介) 动词指做代理这个动作或这项工作名词扮演代理这个角色的类、对象、方法 目标被代理“套用”了核心逻辑代码的类、对象、方法。(房东)代理在开发中实现的方式具体有两种静态代理[动态代理技术]
静态代理 主动创建代理类 public class CalculatorStaticProxy implements Calculator {// 将被代理的目标对象声明为成员变量private Calculator target;public CalculatorStaticProxy(Calculator target) {this.target target;}Overridepublic int add(int i, int j) {// 附加功能由代理类中的代理方法来实现System.out.println(参数是 i , j);// 通过目标对象来实现核心业务逻辑int addResult target.add(i, j);System.out.println(方法内部 result addResult);return addResult;}
}静态代理确实实现了解耦但是由于代码都写死了完全不具备任何的灵活性。就拿日志功能来说将来其他地方也需要附加日志那还得再声明更多个静态代理类那就产生了大量重复的代码日志功能还是分散的没有统一管理。
提出进一步的需求将日志功能集中到一个代理类中将来有任何日志需求都通过这一个代理类来实现。这就需要使用动态代理技术了。
动态代理 动态代理技术分类 JDK动态代理JDK原生的实现方式需要被代理的目标类必须实现接口他会根据目标类的接口动态生成一个代理对象代理对象和目标对象有相同的接口拜把子cglib通过继承被代理的目标类实现代理所以不需要目标类实现接口认干爹 JDK动态代理技术实现了解 代理工程基于jdk代理技术生成代理对象 import org.springframework.cglib.proxy.InvocationHandler;
import org.springframework.cglib.proxy.Proxy;import java.lang.reflect.Method;
import java.util.Arrays;public class ProxyFactory {private Object target;public ProxyFactory(Object target) {this.target target;}public Object getProxy(){/*** newProxyInstance()创建一个代理实例* 其中有三个参数* 1、classLoader加载动态生成的代理类的类加载器* 2、interfaces目标对象实现的所有接口的class对象所组成的数组* 3、invocationHandler设置代理对象实现目标对象方法的过程即代理类中如何重写接口中的抽象方法*/ClassLoader classLoader target.getClass().getClassLoader();Class?[] interfaces target.getClass().getInterfaces();InvocationHandler invocationHandler new InvocationHandler() {Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {/*** proxy代理对象* method代理对象需要实现的方法即其中需要重写的方法* argsmethod所对应方法的参数*/Object result null;try {System.out.println([动态代理][日志] method.getName()参数 Arrays.toString(args));result method.invoke(target, args);System.out.println([动态代理][日志] method.getName()结果 result);} catch (Exception e) {e.printStackTrace();System.out.println([动态代理][日志] method.getName()异常e.getMessage());} finally {System.out.println([动态代理][日志] method.getName()方法执行完毕);}return result;}};return Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);}
}测试代码 Test
public void testDynamicProxy(){ProxyFactory factory new ProxyFactory(new CalculatorLogImpl());Calculator proxy (Calculator) factory.getProxy();proxy.div(1,0);//proxy.div(1,1);
}代理总结
代理方式可以解决附加功能代码干扰核心代码和不方便统一维护的问题
他主要是将附加功能代码提取到代理中执行不干扰目标核心代码但是我们也发现无论使用静态代理和动态代理(jdk,cglib)程序员的工作都比较繁琐需要自己编写代理工厂等但是我们在实际开发中不需要编写代理代码我们可以使用[Spring AOP]框架他会简化动态代理的实现
5.3 面向切面编程思维AOP
面向切面编程思想AOP AOPAspect Oriented Programming 面向切面编程 AOP 可以说是 OOPObject Oriented Programming面向对象编程的补充和完善。
OOP引入封装、继承、多态等概念来建立一种对象层次结构用于模拟公共行为的一个集合。
不过OOP允许开发者定义纵向的关系但并不适合定义横向的关系例如日志功能。
日志代码往往横向地散布在所有对象层次中而与它对应的对象的核心功能毫无关系对于其他类型的代码如安全性、异常处理和透明的持续性也都是如此这种散布在各处的无关的代码被称为横切cross cutting在OOP设计中它导致了大量代码的重复而不利于各个模块的重用。 AOP技术恰恰相反它利用一种称为横切的技术剖解开封装的对象内部并将那些影响了多个类的公共行为封装到一个可重用模块并将其命名为Aspect即切面。
所谓切面简单说就是那些与业务无关却为业务模块所共同调用的逻辑或责任封装起来便于减少系统的重复代码降低模块之间的耦合度并有利于未来的可操作性和可维护性。
使用AOP可以在不修改原来代码的基础上添加新功能。 AOP思想主要的应用场景 AOP面向切面编程是一种编程范式它通过将通用的横切关注点如日志、事务、权限控制等与业务逻辑分离使得代码更加清晰、简洁、易于维护。AOP可以应用于各种场景以下是一些常见的AOP应用场景 日志记录在系统中记录日志是非常重要的可以使用AOP来实现日志记录的功能可以在方法执行前、执行后或异常抛出时记录日志。事务处理在数据库操作中使用事务可以保证数据的一致性可以使用AOP来实现事务处理的功能可以在方法开始前开启事务在方法执行完毕后提交或回滚事务。安全控制在系统中包含某些需要安全控制的操作如登录、修改密码、授权等可以使用AOP来实现安全控制的功能。可以在方法执行前进行权限判断如果用户没有权限则抛出异常或转向到错误页面以防止未经授权的访问。性能监控在系统运行过程中有时需要对某些方法的性能进行监控以找到系统的瓶颈并进行优化。可以使用AOP来实现性能监控的功能可以在方法执行前记录时间戳在方法执行完毕后计算方法执行时间并输出到日志中。异常处理系统中可能出现各种异常情况如空指针异常、数据库连接异常等可以使用AOP来实现异常处理的功能在方法执行过程中如果出现异常则进行异常处理如记录日志、发送邮件等。缓存控制在系统中有些数据可以缓存起来以提高访问速度可以使用AOP来实现缓存控制的功能可以在方法执行前查询缓存中是否有数据如果有则返回否则执行方法并将方法返回值存入缓存中。动态代理AOP的实现方式之一是通过动态代理可以代理某个类的所有方法用于实现各种功能。综上所述AOP可以应用于各种场景它的作用是将通用的横切关注点与业务逻辑分离使得代码更加清晰、简洁、易于维护。
AOP术语名词介绍
1-横切关注点
从每个方法中抽取出来的同一类非核心业务。在同一个项目中我们可以使用多个横切关注点对相关方法进行多个不同方面的增强。
这个概念不是语法层面天然存在的而是根据附加功能的逻辑上的需要有十个附加功能就有十个横切关注点。
AOP把软件系统分为两个部分核心关注点和横切关注点。业务处理的主要流程是核心关注点与之关系不大的部分是横切关注点。横切关注点的一个特点是他们经常发生在核心关注点的多处而各处基本相似比如权限认证、日志、事务、异常等。
AOP的作用在于分离系统中的各种关注点将核心关注点和横切关注点分离开来。
2-通知(增强)
每一个横切关注点上要做的事情都需要写一个方法来实现这样的方法就叫通知方法。
前置通知在被代理的目标方法前执行返回通知在被代理的目标方法成功结束后执行寿终正寝异常通知在被代理的目标方法异常结束后执行死于非命后置通知在被代理的目标方法最终结束后执行盖棺定论环绕通知使用try…catch…finally结构围绕整个被代理的目标方法包括上面四种通知对应的所有位置 3-连接点 joinpoint
这也是一个纯逻辑概念不是语法定义的。指那些被拦截到的点。
在 Spring 中可以被动态代理拦截目标类的方法 4-切入点 pointcut
定位连接点的方式或者可以理解成被选中的连接点是一个表达式比如execution(* com.spring.service.impl…(…))。符合条件的每个方法都是一个具体的连接点。
5-切面 aspect
切入点和通知的结合。是一个类。
6-目标 target
被代理的目标对象。
7-代理 proxy
向目标对象应用通知之后创建的代理对象。
8-织入 weave
指把通知应用到目标上生成代理对象的过程。可以在编译期织入也可以在运行期织入Spring采用后者。
5.4 Spring AOP框架介绍和关系梳理
AOP一种区别于OOP的编程思维用来完善和解决OOP的非核心代码冗余和不方便统一维护问题代理技术动态代理|静态代理是实现AOP思维编程的具体技术但是自己使用动态代理实现代码比较繁琐Spring AOP框架基于AOP编程思维封装动态代理技术简化动态代理技术实现的框架SpringAOP内部帮助我们实现动态代理我们只需写少量的配置指定生效范围即可,即可完成面向切面思维编程的实现
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/86378.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!