给小孩做辅食的网站品牌策划师

张小明 2026/1/15 13:22:30
给小孩做辅食的网站,品牌策划师,无线网站制作,关于网站开发的销售一、AOP与代理模式的核心关联 AOP#xff08;面向切面编程#xff09;的核心作用是对业务逻辑进行横向扩展#xff0c;其底层实现依赖于代理模式。简单来说#xff0c;AOP可以看作是代理模式的简化与升级#xff0c;通过自动为目标接口或类生成代理对象#xff0c;无需开…一、AOP与代理模式的核心关联AOP面向切面编程的核心作用是对业务逻辑进行横向扩展其底层实现依赖于代理模式。简单来说AOP可以看作是代理模式的简化与升级通过自动为目标接口或类生成代理对象无需开发者手动编写大量代理代码即可实现对目标方法的增强如日志记录、权限校验等。二、代理设计模式详解代理模式的核心是为目标对象提供一个代理对象由代理对象控制对目标对象的访问并在访问前后执行额外的增强逻辑。根据代理类创建时机的不同分为静态代理和动态代理两类。2.1 静态代理静态代理由开发者手动创建代理类代理类与目标类通常实现同一个接口。在程序编译阶段代理类就已经存在其缺点是代码冗余——每增加一个目标类就需要对应编写一个代理类维护成本高。核心特点编译期确定代理类手动编码代理逻辑一对一对应目标类。2.2 动态代理动态代理无需开发者手动编写代理类而是在程序运行时由框架如JDK、CGLIB动态生成代理类字节码并加载到内存中。动态代理可以批量为多个目标类生成代理极大减少了代码冗余是AOP的核心实现方式。2.2.1 动态代理的两种实现方案JDK动态代理JDK自带无需额外导包核心依赖java.lang.reflect.InvocationHandler接口和java.lang.reflect.Proxy类。限制只能代理实现了接口的类无法直接代理无接口的普通类。核心代码示例// 实现InvocationHandler接口定义增强逻辑public class MyInvocationHandler implements InvocationHandler {// 目标对象被代理的对象private Object target;public MyInvocationHandler(Object target) {this.target target;}// 代理对象调用方法时会触发该方法执行Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 方法执行前增强如权限校验System.out.println(“JDK代理目标方法执行前增强”);// 调用目标对象的原始方法Object result method.invoke(target, args);// 方法执行后增强如日志记录System.out.println(“JDK代理目标方法执行后增强”);return result;}// 获取代理对象public Object getProxy() {return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);}}CGLIB动态代理第三方技术需导入依赖核心原理基于ASM字节码框架动态生成目标类的子类作为代理类通过重写目标方法实现增强。优势无需目标类实现接口既可以代理接口也可以代理普通类。依赖说明Spring已集成CGLIB导入Spring相关依赖后即可使用如下文AOP依赖。三、AOP核心知识重点3.1 AOP的定义与核心思想AOPAspect-Oriented Programming面向切面编程是一种“横向”编程思想与传统“纵向”的OOP面向对象编程互补。OOP通过类的继承和多态封装业务逻辑而AOP将分散在各个业务逻辑中的公共功能如事务、日志抽取为“切面”在不修改业务代码的前提下通过“织入”机制将切面与业务逻辑结合实现公共功能的统一管理。3.2 AOP核心原理AOP底层通过动态代理实现开发者指定需要增强的目标类和增强逻辑切面后Spring容器会在运行时为目标类生成代理对象。当程序调用目标方法时实际执行的是代理对象的方法代理对象会先执行切面中的增强逻辑再调用目标对象的原始方法从而完成“增强”。3.3 AOP的核心优势减少重复代码将公共功能如日志、权限集中在切面中避免在多个业务类中重复编写。降低耦合度业务逻辑与公共功能分离业务类只关注核心业务切面只关注增强逻辑。便于维护公共功能的修改只需修改切面代码无需改动所有业务类。3.4 AOP的典型应用场景事务管理目标方法执行前开启事务执行后提交/回滚事务。权限校验目标方法执行前校验用户权限无权限则拦截。日志记录记录目标方法的调用参数、返回值、执行耗时等。性能检测统计目标方法的执行时间分析系统性能瓶颈。异常处理捕获目标方法抛出的异常执行统一的异常处理逻辑。3.5 AOP开发必备依赖使用Spring AOP需导入以下Maven依赖以Spring 5.1.6.RELEASE为例!-- Spring核心容器依赖提供IOC功能 --dependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion5.1.6.RELEASE/version/dependency!-- Spring AOP依赖提供AOP相关注解和工具类 --dependencygroupIdorg.springframework/groupIdartifactIdspring-aspects/artifactIdversion5.1.6.RELEASE/version/dependency四、AOP的核心组件与通知类型4.1 AOP核心组件切面Aspect封装公共增强逻辑的类如包含日志、事务逻辑的类。通知Advice切面中具体的增强逻辑方法如前置通知、环绕通知。连接点JoinPoint目标类中可以被增强的方法如业务类的查询、修改方法。切入点Pointcut通过表达式筛选出的、需要被增强的连接点如“所有ServiceImpl类的方法”。织入Weaving将切面的通知与目标类的连接点结合的过程Spring在运行时自动完成。4.2 五种通知类型及应用场景通知类型执行时机核心作用关键API环绕通知Around目标方法执行前执行后事务管理开启/提交、性能检测计时ProceedingJoinPoint可控制目标方法是否执行前置通知Before目标方法执行前权限校验、参数校验JoinPoint获取目标对象、方法名等信息后置通知After目标方法执行后无论是否异常释放资源、基础日志记录无特殊依赖执行时机稳定后置返回通知AfterReturning目标方法正常执行完毕后获取目标方法返回值、结果校验通过参数绑定返回值异常通知AfterThrowing目标方法抛出异常时异常日志记录、异常恢复通过参数绑定异常对象五、AOP使用实现重点Spring AOP的使用分为两种方式XML配置开发和注解开发。注解开发更简洁高效是实际开发中的主流方式XML配置则更适合需要统一管理切面的场景。5.1 XML配置方式开发AOPXML配置通过aop:config等标签定义切面、通知和切入点核心步骤为配置目标类、配置切面类、织入通知将通知与目标方法绑定。5.1.1 环绕通知最灵活的通知类型环绕通知可以完全控制目标方法的执行过程包括是否执行、执行前后增强是事务管理的首选。步骤1创建切面类含环绕通知方法import org.aspectj.lang.ProceedingJoinPoint;// 切面类封装增强逻辑public class MyAspect {/** 环绕通知方法* ProceedingJoinPoint连接点对象可获取目标方法信息并控制其执行*/public Object myAround(ProceedingJoinPoint joinPoint) throws Throwable {// 1. 目标方法执行前增强如开启事务System.out.println(“环绕通知开启事务”);// 2. 执行目标方法必须调用否则目标方法不会执行 Object result joinPoint.proceed(); // 接收目标方法的返回值 // 3. 目标方法执行后增强如提交事务 System.out.println(环绕通知提交事务); return result; // 将目标方法的返回值返回给调用者 }}步骤2编写Spring XML配置文件?xml version1.0 encodingUTF-8?aop:config proxy-target-class“true”aop:aspect ref“myAspect”aop:aroundmethod“myAround”pointcut“execution(* com.luo.service.impl.UserServiceImpl.findUserInfoById(…))” //aop:aspect/aop:config5.1.2 前置通知前置通知在目标方法执行前执行常用于权限校验、参数校验等场景。通过JoinPoint对象可获取目标对象、方法名等信息。切面类添加前置通知方法import org.aspectj.lang.JoinPoint;public class MyAspect {/* 前置通知方法JoinPoint用于获取目标方法相关信息 */public void myBefore(JoinPoint joinPoint) {// 获取目标对象被代理的业务对象Object target joinPoint.getTarget();// 获取目标方法签名包含方法名、参数等信息Signature signature joinPoint.getSignature();System.out.println(前置通知目标对象 target); System.out.println(前置通知目标方法 signature.getName()); System.out.println(前置通知执行权限校验逻辑); }}XML中配置前置通知aop:config proxy-target-classtrue aop:aspect refmyAspect!-- 前置通知配置 -- aop:before methodmyBefore pointcutexecution(* com.luo.service.impl.HouseServiceImpl.*(..)) / !-- 切入点表达式含义匹配HouseServiceImpl类的所有方法任意返回值、任意参数 -- /aop:aspect /aop:config5.1.3 后置通知后置通知在目标方法执行后执行无论目标方法是否抛出异常常用于释放资源、基础日志记录。切面类添加后置通知方法public class MyAspect { /* 后置通知方法无特殊参数执行时机稳定 */ public void myAfter() { System.out.println(后置通知执行日志记录逻辑); System.out.println(后置通知释放数据库连接等资源); } }XML中配置后置通知aop:after methodmyAfter pointcutexecution(* com.luo.service.impl.HouseServiceImpl.*(..)) /5.1.4 后置返回通知后置返回通知在目标方法正常执行完毕后执行可通过参数绑定获取目标方法的返回值常用于结果校验、返回值加工。切面类添加后置返回通知方法public class MyAspect {/*后置返回通知方法ret绑定目标方法的返回值变量名需与XML中returning属性一致*/public void myAfterRet(Object ret) {System.out.println(“后置返回通知目标方法返回值” ret);// 可对返回值进行加工如脱敏、格式转换}}XML中配置后置返回通知aop:after-returning methodmyAfterRet pointcutexecution(* com.luo.service.impl.HouseServiceImpl.houseAllInfo(..)) returningret / !-- returning指定绑定返回值的参数名 --5.1.5 异常通知异常通知在目标方法抛出异常时执行可通过参数绑定获取异常对象常用于异常日志记录、异常恢复。切面类添加异常通知方法public class MyAspect {/*异常通知方法e绑定目标方法抛出的异常对象变量名需与XML中throwing属性一致*/public void myAfterThrow(Exception e) {System.out.println(“异常通知目标方法抛出异常” e.getMessage());System.out.println(“异常通知执行异常日志记录”);}}XML中配置异常通知aop:after-throwing methodmyAfterThrow pointcutexecution(* com.luo.service.impl.HouseServiceImpl.*(..)) throwinge / !-- throwing指定绑定异常对象的参数名 --5.1.6 抽取公共切入点表达式当多个通知需要使用相同的切入点表达式时可通过aop:pointcut标签抽取公共表达式减少重复配置。aop:configproxy-target-classtrue!-- 抽取公共切入点id为表达式唯一标识expression为切入点表达式 --aop:pointcutidhouseServicePointcutexpressionexecution(* com.luo.service.impl.HouseServiceImpl.*(..))/aop:aspectrefmyAspect!-- 引用公共切入点通过pointcut-ref指向切入点ID --aop:beforemethodmyBeforepointcut-refhouseServicePointcut/aop:aftermethodmyAfterpointcut-refhouseServicePointcut//aop:aspect/aop:config5.2 注解方式开发AOP主流注解开发通过在类和方法上添加AOP相关注解替代XML配置更加简洁高效。核心步骤为开启组件扫描和AOP注解支持、定义切面类、配置通知和切入点。5.2.1 核心注解说明注解作用Component将切面类交给Spring IOC容器管理生成Bean实例Aspect标识当前类为切面类Spring会自动识别并处理Around标识方法为环绕通知参数为切入点表达式Before标识方法为前置通知参数为切入点表达式After标识方法为后置通知参数为切入点表达式AfterReturning标识方法为后置返回通知可通过returning绑定返回值AfterThrowing标识方法为异常通知可通过throwing绑定异常对象Pointcut抽取公共切入点表达式供其他通知引用5.2.2 完整实现示例步骤1编写Spring XML配置文件开启注解支持?xml version1.0 encodingUTF-8?context:component-scan base-package“com.luo.service,com.luo.aspect” /步骤2编写切面类使用注解配置通知import org.aspectj.lang.JoinPoint;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.*;import org.springframework.stereotype.Component;// 1. Component将切面类交给IOC容器管理// 2. Aspect标识当前类为切面类ComponentAspectpublic class AspectTest {// 抽取公共切入点表达式Pointcut注解定义方法体为空仅作标识Pointcut(“execution(* com.luo.service.impl.UserServiceImpl.*(…))”)public void userServicePointcut() {} // 方法名作为切入点标识/* 1. 环绕通知引用公共切入点通过方法名引用 */ Around(userServicePointcut()) public Object myAround(ProceedingJoinPoint joinPoint) throws Throwable { System.out.println(环绕通知目标方法执行前增强); Object result joinPoint.proceed(); // 执行目标方法 System.out.println(环绕通知目标方法执行后增强); return result; // 注意返回目标方法的返回值而非joinPoint } /* 2. 前置通知直接编写切入点表达式 */ Before(execution(* com.luo.service.impl.UserServiceImpl.findUserInfoById(..))) public void myBefore(JoinPoint joinPoint) { String methodName joinPoint.getSignature().getName(); System.out.println(前置通知目标方法 methodName 执行权限校验); } /* 3. 后置返回通知通过returning绑定返回值 */ AfterReturning( value userServicePointcut(), // 引用公共切入点 returning obj // 绑定返回值的参数名需与方法参数一致 ) public void myAfterRet(Object obj) { System.out.println(后置返回通知目标方法返回值 obj); } /* 4. 异常通知通过throwing绑定异常对象 */ AfterThrowing( value userServicePointcut(), throwing e // 绑定异常的参数名需与方法参数一致 ) public void myException(Exception e) { System.out.println(异常通知捕获异常 e.getMessage()); } /* 5. 后置通知无论是否异常都会执行 */ After(userServicePointcut()) public void myAfter() { System.out.println(后置通知执行资源释放逻辑); }}步骤3目标业务类需添加Service注解被组件扫描识别import org.springframework.stereotype.Service;import com.luo.service.UserService;// Service标识为业务层组件被Spring扫描并创建BeanServicepublic class UserServiceImpl implements UserService {Overridepublic String findUserInfoById(Integer id) {if (id null) {throw new IllegalArgumentException(“用户ID不能为空”);}return “用户ID” id “用户名张三”;}}六、AOP关键注意事项代理模式选择proxy-target-classtrue时Spring强制使用CGLIB代理为false时优先使用JDK代理目标类实现接口无接口则自动使用CGLIB。环绕通知必须调用ProceedingJoinPoint.proceed()方法否则目标方法不会执行且需返回目标方法的返回值否则调用者无法获取结果。切入点表达式语法execution(* com.luo.service.impl.*ServiceImpl.*(..))表示“匹配com.luo.service.impl包下所有以ServiceImpl结尾的类的所有方法”其中*表示任意返回值(..)表示任意参数。注解开发时切面类和目标类必须都交给Spring IOC管理添加Component、Service等注解否则AOP无法生效。异常通知仅在目标方法抛出的异常与方法参数声明的异常类型匹配时才会执行如声明Exception则匹配所有异常。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

wordpress主题 推荐宁波seo外包服务商

三个月前,我还在一家传统软件公司,重复着日复一日的业务逻辑开发。薪资天花板触手可及,职业焦虑与日俱增。看着AI浪潮席卷而来,我下定决心:必须转型,而且要在最短时间内完成。 今天,我已经成功加…

张小明 2026/1/9 19:45:10 网站建设

工商营业执照咨询电话24小时常德seo公司

并不是的!Tailwind CSS 本身不会自动实现自适应,它只是提供了响应式工具类(如 sm:/md:/lg: 前缀),自适应效果需要你主动配置/编写响应式类名才能实现——核心逻辑是:Tailwind 是「原子化工具库」&#xff0…

张小明 2025/12/29 7:09:32 网站建设

php服装网站模板wordpress 手机维修

Flowblade 视频编辑器完整使用指南:从入门到精通 【免费下载链接】flowblade Video Editor for Linux 项目地址: https://gitcode.com/gh_mirrors/fl/flowblade 快速上手指南 Flowblade 是一款专为 Linux 平台设计的开源视频编辑器,以其高效的剪…

张小明 2026/1/4 2:10:43 网站建设

app产品网站模板免费下载网站做301有什么用

你是否正在为GB28181视频监控平台的复杂部署而头疼?想要在30分钟内完成一个生产级的国标视频平台搭建吗?本文将为你分享wvp-GB28181-pro项目的高效部署方法,从零开始带你完成这个支持多厂商设备接入、平台级联、云录像管理的完整解决方案。 【…

张小明 2026/1/13 2:40:19 网站建设

做的网站没给我备案网站和数字界面设计师

5分钟搞定Sandboxie启动异常:小白也能懂的修复方法 【免费下载链接】Sandboxie Sandboxie Plus & Classic 项目地址: https://gitcode.com/gh_mirrors/sa/Sandboxie Sandboxie是一款专业的沙盒安全工具,能够将应用程序隔离运行,保…

张小明 2026/1/8 2:24:04 网站建设

jsp网站开发技巧网站未备案或已封禁

保障网络安全与解决计算机问题的实用指南 1. 防范网络钓鱼诈骗 网络钓鱼是指创建现有网页的复制品,诱骗你提交个人信息、财务数据或密码。诈骗者通常会复制大型网站(如 AOL 或 eBay)的网页代码,创建看似是该公司网站一部分的仿冒页面。他们会发送带有该页面链接的虚假电子…

张小明 2025/12/29 19:05:57 网站建设