当前位置: 首页 > news >正文

广告设计公司开的版面费快手seo

广告设计公司开的版面费,快手seo,装修公司大全,重庆网站建设公司销售博主简介#xff1a;想进大厂的打工人博主主页#xff1a;xyk:所属专栏: JavaEE进阶 目录 文章目录 一、初识AOP 1.1 什么是AOP#xff1f; 1.2 AOP的组成 1.2.1 切面#xff08;Aspect#xff09; 1.2.2 切点#xff08;Pointcut#xff09; 1.2.3 连接点… 博主简介想进大厂的打工人博主主页xyk:所属专栏: JavaEE进阶  目录 文章目录 一、初识AOP 1.1 什么是AOP 1.2 AOP的组成 1.2.1 切面Aspect 1.2.2 切点Pointcut 1.2.3 连接点Join Point 1.2.4 通知Advice 1.3 AOP的使用场景 二、Srping AOP 实现 2.1 添加Spring AOP 依赖 2.2 定义切面和切点 2.3 定义通知 三、Spring AOP 实现原理 3.1 什么是动态代理 3.2 JDK 动态代理实现 3.3 CGLIB 动态代理实现 3.4 JDK 和 CGLIB 实现的区别 一、初识AOP 1.1 什么是AOP AOPAspect Oriented Programming面向切面编程它是⼀种思想它是对某⼀类事情的集中处理。在我们想要对某一件事情进行集中处理就可以使用到AOP它提供一种将程序中的横切关注点模块化的方式。在 AOP 中我们将这些横切关注点称为“切面”它们独立于业务逻辑模块但是可以在程序运行的不同阶段被织入到业务逻辑中。 简单来说AOP 就是对某一件事进行集中处理的思想方式~ 1.2 AOP的组成 1.2.1 切面Aspect 切⾯Aspect由切点Pointcut和通知Advice组成它既包含了横切逻辑的定义也包 括了连接点的定义。相当于处理某方面具体问题的一个类包含多个方法而这些方法就是切点和通知。 1.2.2 切点Pointcut Pointcut 的作⽤就是提供⼀组规则来匹配连接点Join Point给满足规则的连接点添加通知Advice可以理解为用来进行主动拦截的规则配置 1.2.3 连接点Join Point 应⽤执⾏过程中能够插⼊切⾯的⼀个点连接点可以理解为可能会触发AOP规则的所有点。所有请求 1.2.4 通知Advice 在AOP术语中切面的工作被称之为通知。通知是切面在连接点上执行的动作。它定义了在何时例如在方法调用之前或之后以及如何例如打印日志或进行性能监控应用切面的行为。即程序中被拦截请求触发的具体动作。 Spring 切⾯类中可以在方法上使⽤以下注解会设置⽅法为通知方法在满⾜条件后会通知本 ⽅法进⾏调⽤ 前置通知使⽤ Before通知⽅法会在⽬标⽅法调⽤之前执行。后置通知使⽤ After通知⽅法会在⽬标⽅法返回或者抛出异常后调⽤。返回之后通知使⽤ AfterReturning通知⽅法会在⽬标⽅法返回后调⽤。抛异常后通知使⽤ AfterThrowing通知⽅法会在⽬标⽅法抛出异常后调⽤。环绕通知使⽤ Around通知包裹了被通知的⽅法在被通知的⽅法通知之前和调⽤之后执行⾃定义的行为。 1.3 AOP的使用场景 在做任何一个系统都需要登录功能那么几乎想要使用这个系统都需要我们进行验证用户登录状态我们之前的处理⽅式是每个 Controller 都要写⼀遍⽤户登录验证然⽽当你的功能越来越多那么你要写的登录验证也越来越多⽽这些⽅法⼜是相同的这么多的⽅法就会代码修改和维护的成本。对于这种功能统⼀且使⽤的地⽅较多的功能就可以考虑 AOP来统⼀处理了。 除了统一登录判断外使用AOP还可以实现 用户登录验证统⼀⽇志记录统⼀⽅法执⾏时间统计统⼀的返回格式设置统⼀的异常处理事务的开启和提交等 二、Srping AOP 实现 Spring AOP 的实现步骤如下 添加 Spring AOP 框架⽀持定义切⾯和切点1创建切面类2配置拦截规则定义通知 2.1 添加Spring AOP 依赖 !-- https://mvnrepository.com/artifact/org.springframework.boot/spring-bo ot-starter-aop --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-aop/artifactId/dependency 2.2 定义切面和切点 使用 Aspect 注解表明当前类为一个切面而在切点中我们要定义拦截的规则具体实现如下 Component // 随着框架的启动而启动 Aspect // 告诉框架我是一个切面类 public class UserAspect {// 定义切点(配置拦截规则)Pointcut(execution(* com.example.demo.controller.UserController.*(..)))public void pointcut(){} } 在上述实现代码中pointcut 为一个空方法只是起到一个“标识”的作用标识下面的通知方法具体指的是哪个切点切点可以有多个。 切点表达式由切点函数组成其中 execution() 是最常⽤的切点函数⽤来匹配⽅法语法为 execution(修饰符返回类型包.类.⽅法(参数)异常) 修饰符和异常可以省略 常见的切点表达式的示例 匹配特定类的所有方法execution(* com.example.MyClass.*(..))匹配 com.example.MyClass 类中的所有方法。匹配特定包下的所有方法execution(* com.example.*.*(..))匹配 com.example 包及其子包下的所有方法。匹配特定方法名的方法execution(* com.example.MyClass.myMethod(..))匹配 com.example.MyClass 类中名为 myMethod 的方法。匹配特定方法参数类型的方法execution(* com.example.MyClass.myMethod(String, int))匹配 com.example.MyClass 类中具有一个 String 参数和一个 int 参数的 myMethod 方法。匹配特定返回类型的方法execution(String com.example.MyClass.myMethod(..))匹配 com.example.MyClass 类中返回类型为 String 的 myMethod 方法。 package com.example.demo.controller;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;RestController RequestMapping(/user) public class UserController {RequestMapping(/hi)public String sayHi(String name){System.out.println(执行了Hi);return Hi, name;}RequestMapping(/hello)public String sayHello(){System.out.println(执行了Hello);return Hello,world;} }2.3 定义通知 通知定义的是被拦截方法具体要执行的业务。我们上面列出了可以使用哪些通知~这里举出例子 package com.example.demo.aop;import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.stereotype.Component;Component // 随着框架的启动而启动 Aspect // 告诉框架我是一个切面类 public class UserAspect {// 定义切点(配置拦截规则)Pointcut(execution(* com.example.demo.controller.UserController.*(..)))public void pointcut(){}Before(pointcut())public void beforeAdvice(){System.out.println(执行了前置通知~);}After(pointcut())public void AfterAdvice(){System.out.println(执行了后置通知~);}/*** 环绕通知* param joinPoint* return*/Around(pointcut())public Object aroundAdvice(ProceedingJoinPoint joinPoint){System.out.println(进入了环绕通知~);Object obj null;try {// 执⾏拦截⽅法obj joinPoint.proceed();} catch (Throwable e) {e.printStackTrace();}System.out.println(退出了环绕通知~);return obj;}}环绕通知是在前置通知之前和后置通知之后运行的~ 三、Spring AOP 实现原理 Spring AOP 是通过动态代理的⽅式在运⾏期将 AOP 代码织⼊到程序中的它的实现⽅式有两种JDK Proxy 和 CGLIB。因此Spring 对 AOP 的支持局限于方法级别的拦截。 默认情况下实现了接⼝的类使⽤ AOP 会基于 JDK ⽣成代理类没有实现接⼝的类会基于 CGLIB ⽣成代理类   3.1 什么是动态代理 动态代理Dynamic Proxy是一种设计模式它允许 在运行时创建代理对象并将方法调用转发给实际的对象。 动态代理可以用于实现横切关注点如日志记录、性能监控、事务管理等的功能而无需修改原始对象的代码。 在Java中动态代理通常使用 java.lang.reflect.Proxy 类和 java.lang.reflect.InvocationHandler 接口来实现。 调用者在调用方法时会先转发给代理类创建的代理对象随后再由代理对象转发给目标对象。 以下是使用动态代理的一般步骤 创建一个实现InvocationHandler接口的类该类将作为代理对象的调用处理程序。在InvocationHandler接口的invoke方法中可以定义在方法调用前后执行的逻辑。使用Proxy类的newProxyInstance方法创建代理对象。该方法接受三个参数类加载器、代理接口数组和调用处理程序。它将返回一个实现指定接口的代理对象。使用代理对象调用方法。当调用代理对象的方法时实际上会调用调用处理程序的invoke方法并将方法调用转发给实际的对象。   3.2 JDK 动态代理实现 先通过实现 InvocationHandler 接⼝创建⽅法调⽤处理器再通过 Proxy 来创建代理类。 import org.example.demo.service.AliPayService; import org.example.demo.service.PayService; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; //动态代理使⽤JDK提供的apiInvocationHandler、Proxy实现此种⽅式实现要求被代理类必须实现接⼝ public class PayServiceJDKInvocationHandler implements InvocationHandler {//⽬标对象即就是被代理对象private Object target;public PayServiceJDKInvocationHandler( Object target) {this.target target;}//proxy代理对象Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//1.安全检查System.out.println(安全检查);//2.记录⽇志System.out.println(记录⽇志);//3.时间统计开始System.out.println(记录开始时间);//通过反射调⽤被代理类的⽅法Object retVal method.invoke(target, args);//4.时间统计结束System.out.println(记录结束时间);return retVal;}public static void main(String[] args) {PayService target new AliPayService();//⽅法调⽤处理器InvocationHandler handler new PayServiceJDKInvocationHandler(target);//创建⼀个代理类通过被代理类、被代理实现的接⼝、⽅法调⽤处理器来创建PayService proxy (PayService) Proxy.newProxyInstance(target.getClass().getClassLoader(),new Class[]{PayService.class},handler);proxy.pay();} } 3.3 CGLIB 动态代理实现 import org.springframework.cglib.proxy.Enhancer; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy; import org.example.demo.service.AliPayService; import org.example.demo.service.PayService; import java.lang.reflect.Method;public class PayServiceCGLIBInterceptor implements MethodInterceptor {//被代理对象private Object target;public PayServiceCGLIBInterceptor(Object target){this.target target;}Overridepublic Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { //1.安全检查System.out.println(安全检查); //2.记录⽇志System.out.println(记录⽇志); //3.时间统计开始System.out.println(记录开始时间); //通过cglib的代理⽅法调⽤Object retVal methodProxy.invoke(target, args); //4.时间统计结束System.out.println(记录结束时间);return retVal;}public static void main(String[] args) {PayService target new AliPayService();PayService proxy (PayService) Enhancer.create(target.getClass(),new PayServiceCGLIBInterceptor(target));proxy.pay();} } 3.4 JDK 和 CGLIB 实现的区别 JDK 实现要求被代理类必须实现接口 之后是通过 InvocationHandler 及 Proxy在运⾏时动态的在内存中⽣成了代理类对象该代理对象是通过实现同样的接⼝实现类似静态代理接⼝实现的⽅式只是该代理类是在运⾏期时动态的织⼊统⼀的业务逻辑字节码来完成。CGLIB 实现被代理类可以不实现接口 是通过继承被代理类在运⾏时动态的⽣成代理类对象。
http://www.hkea.cn/news/14463954/

相关文章:

  • 哈尔滨哪里做网站好个人网站注册平台钱
  • 济南高新网站制作安亭网站建设
  • 做的好的旅游网站全国招标网官网
  • Python做网站 性能企业信息化系统包括哪些内容
  • gis网站开发教程邢台专业网站建设费用
  • 温州哪里有做网站的公司4000-262-医疗器械展会2021列表
  • 海珠企业网站建设百度服务商平台
  • 新网域名网站寮步做网站
  • h5响应式网站源码下载对比插件 wordpress
  • 网站原型图设计软件广东手机网站建设报价表
  • 做交易网站需要用到的软件有哪些安装wordpress插件目录
  • 厦门网站建设厦门电子书网站用dz还是wordpress
  • php网站在线打包源码域名价格排行
  • 小公司如何做网站wordpress上传rar
  • 高端网站建设百度手机怎么做3d短视频网站
  • 企业vi设计需求seo是哪里
  • 怎么做网站海外运营推广培训型网站建设方案
  • 哈尔滨免费做网站网站建设中需求分析报告
  • 网站开发与rest前端开发包括哪些内容
  • 北京企业网站推广wordpress后台不显示
  • 广州建设h5网站网站建设推广策划
  • 网站改版原则photoshop制作网站海报
  • 来个网站产品设计培训中心
  • 网站设计运行费用小程序头条小游戏
  • 南昌网站seo技术厂家盱眙在仕德伟做网站的有几家
  • php主做哪种类型网站十堰seo源头厂家
  • 西安网站建设l西安搜推宝网络公众号怎么创建
  • 百度不收入我的网站了淘宝做店招的网站
  • 网站建设有哪几种形式利为汇wordpress教程
  • 个人做网站郊游的英网页设计作品田田田田田田田田田田田田田田