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

北京网站设计排名网络营销推广的优势

北京网站设计排名,网络营销推广的优势,阿里云云主机做网站,校际凡科平台官网前言 在Spring AOP(Aspect-Oriented Programming)中,动态代理是常用的技术之一,用于在运行时动态地为目标对象生成代理对象, 并拦截其方法调用。Spring AOP 默认使用两种类型的动态代理机制:JDK 动态代理和…

前言

在Spring AOP(Aspect-Oriented Programming)中,动态代理是常用的技术之一,用于在运行时动态地为目标对象生成代理对象,
并拦截其方法调用。Spring AOP 默认使用两种类型的动态代理机制:JDK 动态代理和 CGLIB 代理。
‌JDK 动态代理‌:
JDK 动态代理是 Java 原生提供的动态代理机制,它只能代理接口。如果你的目标对象实现了某个接口,Spring AOP 会默认使用 JDK 动态代理。
JDK 动态代理机制通过 java.lang.reflect.Proxy 类来创建代理对象,并将方法调用委托给 InvocationHandler 实现。
‌CGLIB 代理‌:
如果目标对象没有实现接口,Spring AOP 会使用 CGLIB(Code Generation Library)来生成代理对象。CGLIB 是一个强大的库,
可以生成目标对象的子类,并覆盖其方法以实现代理功能。通过 CGLIB,Spring AOP 能够代理没有实现接口的类(即具体的类)。
默认代理机制的选择
Spring AOP 在选择使用哪种代理机制时,遵循以下原则:
如果目标对象实现了至少一个接口,则默认使用 JDK 动态代理。
如果目标对象没有实现任何接口,则默认使用 CGLIB 代理。
配置示例
在大多数情况下,你不需要显式地指定使用哪种代理机制,因为 Spring 会自动为你选择。但是,如果你有特殊需求,可以通过配置来强制使用某种代理机制。

一、Spring AOP 注解概述

1.Spring 的 AOP 功能除了在配置文件中配置一大堆的配置,比如切入点、表达式、通知等等以外,
使用注解的方式更为方便快捷,特别是 Spring boot 出现以后,基本不再使用原先的 beans.xml 等配置文件了,而都推荐注解编程

@Aspect切面声明,标注在类、接口(包括注解类型)或枚举上。
@Pointcut

切入点声明,即切入到哪些目标类的目标方法。既可以用 execution 切点表达式, 也可以是 annotation 指定拦截拥有指定注解的方法.

value 属性指定切入点表达式,默认为 "",用于被通知注解引用,这样通知注解只需要关联此切入点声明即可,无需再重复写切入点表达式

@Before

前置通知, 在目标方法(切入点)执行之前执行。

value 属性绑定通知的切入点表达式,可以关联切入点声明,也可以直接设置切入点表达式

注意:如果在此回调方法中抛出异常,则目标方法不会再执行,会继续执行后置通知 -> 异常通知。

@After后置通知, 在目标方法(切入点)执行之后执行
@AfterReturning

返回通知, 在目标方法(切入点)返回结果之后执行.

pointcut 属性绑定通知的切入点表达式,优先级高于 value,默认为 ""

@AfterThrowing

异常通知, 在方法抛出异常之后执行, 意味着跳过返回通知

pointcut 属性绑定通知的切入点表达式,优先级高于 value,默认为 ""

注意:如果目标方法自己 try-catch 了异常,而没有继续往外抛,则不会进入此回调函数

@Around

环绕通知:目标方法执行前后分别执行一些代码,类似拦截器,可以控制目标方法是否继续执行。

通常用于统计方法耗时,参数校验等等操作。

2、上面这些 AOP 注解都是位于 aspectjweaver 依赖中;对于习惯了 Spring 全家桶编程的人来说,并不是需要直接引入 aspectjweaver 依赖,因为 spring-boot-starter-aop 组件默认已经引用了 aspectjweaver 来实现 AOP 功能。换句话说 Spring 的 AOP 功能就是依赖的 aspectjweaver !

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-aop -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId><version>2.1.4.RELEASE</version>
</dependency>

3.AOP 底层是通过 Spring 提供的的动态代理技术实现的,在运行期间动态生成代理对象,代理对象方法执行时进行增强功能的介入,再去调用目标对象的方法,从而完成功能的增强。主要使用 JDK 动态代理与 Cglib 动态代理;所以如果目标类不是 Spring 组件,则无法拦截,如果是 类名.方法名 方式调用,也无法拦截。

二、@Aspect 快速入门

1、@Aspect 常见用于记录日志、异常集中处理、权限验证、Web 参数校验、事务处理等等2、要想把一个类变成切面类,只需3步:1)在类上使用 @Aspect 注解使之成为切面类2)切面类需要交由 Spring 容器管理,所以类上还需要有 @Service、@Repository、@Controller、@Component 等注解2)在切面类中自定义方法接收通知3、AOP 的含义就不再累述了,下面直接上示例:
/*** 切面类,用于处理日志、参数校验等** @author songwp* @date 2020-04-27*/
@Aspect
@Component
@Slf4j
public class HandleAspect {/*** @Pointcut :切入点声明,即切入到哪些目标方法。value 属性指定切入点表达式,默认为 ""。* 用于被下面的通知注解引用,这样通知注解只需要关联此切入点声明即可,无需再重复写切入点表达式* <p>* 切入点表达式常用格式举例如下:* - * com.songwp.aspect.EmpService.*(..)):表示 com.songwp.aspect.EmpService 类中的任意方法* - * com.songwp.aspect.*.*(..)):表示 com.songwp.aspect 包(不含子包)下任意类中的任意方法* - * com.songwp.aspect..*.*(..)):表示 com.songwp.aspect 包及其子包下任意类中的任意方法* </p>* value 的 execution 可以有多个,使用 || 隔开.*/@Pointcut("execution(public * com.songwp.controller.*.*(..))")public void aopPointCut() {}/*** 前置通知:目标方法执行之前执行以下方法体的内容。* value:绑定通知的切入点表达式。可以关联切入点声明,也可以直接设置切入点表达式* <br/>* * @param joinPoint:提供对连接点处可用状态和有关它的静态信息的反射访问<br/> <p>* * * Object[] getArgs():返回此连接点处(目标方法)的参数,目标方法无参数时,返回空数组* * * Signature getSignature():返回连接点处的签名。* * * Object getTarget():返回目标对象* * * Object getThis():返回当前正在执行的对象* * * StaticPart getStaticPart():返回一个封装此连接点的静态部分的对象。* * * SourceLocation getSourceLocation():返回与连接点对应的源位置* * * String toLongString():返回连接点的扩展字符串表示形式。* * * String toShortString():返回连接点的缩写字符串表示形式。* * * String getKind():返回表示连接点类型的字符串* * * </p>*/@Before("aopPointCut()")public void beforeAdvice() {System.out.println("前置通知执行");}/*** 后置通知:目标方法执行之后执行以下方法体的内容,不管目标方法是否发生异常。* value:绑定通知的切入点表达式。可以关联切入点声明,也可以直接设置切入点表达式*/@After("aopPointCut()")public void afterAdvice() {System.out.println("后置通知执行");}/*** 返回通知:目标方法返回后执行以下代码* value 属性:绑定通知的切入点表达式。可以关联切入点声明,也可以直接设置切入点表达式* pointcut 属性:绑定通知的切入点表达式,优先级高于 value,默认为 ""* returning 属性:通知签名中要将返回值绑定到的参数的名称,默认为 ""** @param joinPoint :提供对连接点处可用状态和有关它的静态信息的反射访问*/@AfterReturning("execution(* com.songwp.service.impl.OperateLogServiceImpl.*(..))")public void logAfterReturning(JoinPoint joinPoint) {System.out.println("返回后通知: " + joinPoint.getSignature().getName());}/*** 异常通知:目标方法发生异常的时候执行以下代码,此时返回通知不会再触发* value 属性:绑定通知的切入点表达式。可以关联切入点声明,也可以直接设置切入点表达式* pointcut 属性:绑定通知的切入点表达式,优先级高于 value,默认为 ""* throwing 属性:与方法中的异常参数名称一致,** @param ex:捕获的异常对象,名称与 throwing 属性值一致*/@AfterThrowing(pointcut = "execution(* com.songwp.service.impl.OperateLogServiceImpl.*(..))", throwing = "ex")public void logAfterThrowing(JoinPoint joinPoint, Throwable ex) {System.out.println("异常后通知: " + joinPoint.getSignature().getName() + ", Exception: " + ex);}/*** 环绕通知* 1、@Around 的 value 属性:绑定通知的切入点表达式。可以关联切入点声明,也可以直接设置切入点表达式* 2、Object ProceedingJoinPoint.proceed(Object[] args) 方法:继续下一个通知或目标方法调用,返回处理结果,如果目标方法发生异常,则 proceed 会抛异常.* 3、假如目标方法是控制层接口,则本方法的异常捕获与否都不会影响目标方法的事务回滚* 4、假如目标方法是控制层接口,本方法 try-catch 了异常后没有继续往外抛,则全局异常处理 @RestControllerAdvice 中不会再触发** @param joinPoint* @return* @throws Throwable*/@Around("execution(* com.songwp.service.impl.OperateLogServiceImpl.*(..))")public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {this.checkRequestParam(joinPoint);System.out.println("环绕通知: " + joinPoint.getSignature().getName());// 继续执行方法Object result = joinPoint.proceed();System.out.println("环绕通知: " + joinPoint.getSignature().getName());return result;}/*** 参数校验,防止 SQL 注入** @param joinPoint*/private void checkRequestParam(ProceedingJoinPoint joinPoint) {Object[] args = joinPoint.getArgs();if (args == null || args.length <= 0) {return;}String params = Arrays.toString(joinPoint.getArgs()).toUpperCase();String[] keywords = {"DELETE ", "UPDATE ", "SELECT ", "INSERT ", "SET ", "SUBSTR(", "COUNT(", "DROP ","TRUNCATE ", "INTO ", "DECLARE ", "EXEC ", "EXECUTE ", " AND ", " OR ", "--"};for (String keyword : keywords) {if (params.contains(keyword)) {log.error("参数存在SQL注入风险,其中包含非法字符 {}.", keyword);throw new RuntimeException("参数存在SQL注入风险:params=" + params);}}}
}

三、@Aspect 切面不生效原因

确保切面类被Spring管理‌:在切面类上添加 @Service、@Repository、@Controller、@Component  等注解
检查路径设置‌:确保切面类被 @ComponentScan 注解扫描到。即有没有被Spring容器管理。可以使用 @PostConstruct注解测试。
检查切面表达式‌:确保切面表达式正确无误,能够匹配到目标方法。

特别注意: 比如定义了一个 AOP 切面(@Pointcut)拦截 ServiceA 中的方法 B,当从其他类调用方法 B 时(比如 Controller 层),会正常切入拦截,而从本类其他方法中调用方法 B 时,无法切入拦截,因为此时默认并不是通过代理对象调用的,而是直接通过 this 对象来调的。可以参考@EnableAspectJAutoProxy注解。

总结:AOP的高级特性使得开发者能够以声明式的方式处理复杂的应用场景。通过灵活使用切入点表达式和正则表达式,可以在Spring AOP中实现精确的连接点匹配。此外,AOP在性能监控、日志记录、事务管理等场景中的应用,展示了其在提高代码模块化和可维护性方面的强大能力。


文章转载自:
http://fugio.jtrb.cn
http://glanduliferous.jtrb.cn
http://perspicuously.jtrb.cn
http://assistantship.jtrb.cn
http://hyperirritability.jtrb.cn
http://agrostologist.jtrb.cn
http://gynaecologist.jtrb.cn
http://acidity.jtrb.cn
http://animality.jtrb.cn
http://bokmal.jtrb.cn
http://prostrate.jtrb.cn
http://ferment.jtrb.cn
http://thoracoplasty.jtrb.cn
http://ingratiating.jtrb.cn
http://bullionist.jtrb.cn
http://wealthily.jtrb.cn
http://gynaecology.jtrb.cn
http://salicylate.jtrb.cn
http://nelumbium.jtrb.cn
http://ablastin.jtrb.cn
http://companionate.jtrb.cn
http://rpi.jtrb.cn
http://molinete.jtrb.cn
http://journal.jtrb.cn
http://clarisse.jtrb.cn
http://silkaline.jtrb.cn
http://fumaroyl.jtrb.cn
http://contrecoup.jtrb.cn
http://cluj.jtrb.cn
http://anglice.jtrb.cn
http://endocytosis.jtrb.cn
http://womankind.jtrb.cn
http://moco.jtrb.cn
http://unmade.jtrb.cn
http://chlorophyll.jtrb.cn
http://doodad.jtrb.cn
http://quake.jtrb.cn
http://intrapsychic.jtrb.cn
http://bla.jtrb.cn
http://watering.jtrb.cn
http://gyrostabilizer.jtrb.cn
http://templar.jtrb.cn
http://preferences.jtrb.cn
http://uddi.jtrb.cn
http://gagman.jtrb.cn
http://gar.jtrb.cn
http://malpighiaceous.jtrb.cn
http://sewan.jtrb.cn
http://preengage.jtrb.cn
http://orcadian.jtrb.cn
http://potsdam.jtrb.cn
http://tryout.jtrb.cn
http://cosie.jtrb.cn
http://futuramic.jtrb.cn
http://circulator.jtrb.cn
http://halobiont.jtrb.cn
http://subtend.jtrb.cn
http://hobnail.jtrb.cn
http://carbo.jtrb.cn
http://denticare.jtrb.cn
http://solecist.jtrb.cn
http://knocker.jtrb.cn
http://calinago.jtrb.cn
http://undue.jtrb.cn
http://decapacitation.jtrb.cn
http://flickery.jtrb.cn
http://listel.jtrb.cn
http://motorise.jtrb.cn
http://intuitively.jtrb.cn
http://isobutane.jtrb.cn
http://micra.jtrb.cn
http://noninductivity.jtrb.cn
http://thyrosis.jtrb.cn
http://trelliswork.jtrb.cn
http://serialism.jtrb.cn
http://amide.jtrb.cn
http://nummulary.jtrb.cn
http://zinciferous.jtrb.cn
http://centurial.jtrb.cn
http://microphenomenon.jtrb.cn
http://highwood.jtrb.cn
http://bourn.jtrb.cn
http://spall.jtrb.cn
http://lipocyte.jtrb.cn
http://cove.jtrb.cn
http://inequation.jtrb.cn
http://suggestion.jtrb.cn
http://bombardment.jtrb.cn
http://moult.jtrb.cn
http://whakapapa.jtrb.cn
http://neanderthaloid.jtrb.cn
http://pyxie.jtrb.cn
http://drugpusher.jtrb.cn
http://pelerine.jtrb.cn
http://chorally.jtrb.cn
http://nuncupate.jtrb.cn
http://parvulus.jtrb.cn
http://unsalted.jtrb.cn
http://khidmatgar.jtrb.cn
http://generalist.jtrb.cn
http://www.15wanjia.com/news/86427.html

相关文章:

  • 加快建设企业门户网站建银川seo优化
  • 网站建设官网型好呢还是商城型制作网页的网站
  • 河北软件开发网站建设站内推广
  • 洛阳做网站公司有哪些百度官方网站入口
  • 网站怎样做友情链接百度seo价格
  • dede网站地图xml百度统计
  • 音乐如何到wordpress双桥seo排名优化培训
  • 江苏网站建设包括哪些广告公司品牌营销推广
  • 中国十大做网站公司crm客户管理系统
  • 大连网站建设流程图免费新闻源发布平台
  • 帮别人做网站的合作协议网站推广的目的是什么
  • 开发小程序怎么赚钱关键词优化报价推荐
  • php作文网站源码seo是指搜索引擎优化
  • 免费做微网站免费刷seo
  • 买网站需要多少钱电话营销外包公司
  • 河南做网站高手排名百度无广告搜索引擎
  • 简述跨境电商网站的平台建设推广软文模板
  • 网站more应该怎么做网络游戏推广公司
  • 彩票网站制作开发网站规划与设计
  • 东莞有什么做网站的公司微信营销平台哪个好
  • 北京做网站公司哪家强数字营销案例
  • 燕郊做网站找谁网络推广员是什么工作
  • 傻瓜式app制作seo案例分享
  • 临沂网站建设 百度优化百度怎么发帖子
  • 成都网站建设空间最新军事新闻最新消息
  • 如何做网站英文简历模板软文写作300字
  • 做视频采集网站犯法唐山建站公司模板
  • 软件开发宣传语seo排名点击软件
  • 中国文化网站建设策划书句容市网站seo优化排名
  • xampp 搭建wordpress重庆seo公司