网站开发用什么软件编程社交移动电子商务平台有哪些
2025/12/29 19:31:26 网站建设 项目流程
网站开发用什么软件编程,社交移动电子商务平台有哪些,品牌营销案例,wordpress如何上传主题Spring AOP是什么#xff1f;Spring AOP是面向切面编程#xff0c;他与OOP#xff08;面向对象编程#xff09;是相辅相成的。在 OOP 中#xff0c;以类作为程序的基本单元#xff0c;而 AOP 中的基本单元是 Aspect#xff08;切面#xff09;。在业务处理代码中#…Spring AOP是什么Spring AOP是面向切面编程他与OOP面向对象编程是相辅相成的。在 OOP 中以类作为程序的基本单元而 AOP 中的基本单元是 Aspect切面。在业务处理代码中通常都有日志记录、性能统计、安全控制、事务处理、异常处理等操作。尽管使用 OOP 可以通过封装或继承的方式达到代码的重用但仍然存在同样的代码分散到各个方法中。因此采用 OOP 处理日志记录等操作不仅增加了开发者的工作量而且提高了升级维护的困难。为了解决此类问题AOP 思想应运而生。AOP 采取横向抽取机制即将分散在各个方法中的重复代码提取出来然后在程序编译或运行阶段再将这些抽取出来的代码应用到需要执行的地方。这种横向抽取机制采用传统的 OOP 是无法办到的因为 OOP 实现的是父子关系的纵向重用。但是AOP 不是 OOP 的替代品而是 OOP 的补充它们是相辅相成的。Spring通知类型①环绕通知环绕通知是在目标方法执行前和执行后实施增强可以应用于日志记录、事务处理等。②前置通知前置通知是在目标方法执行前实施增强可应用于权限管理等。③后置返回通知后置返回通知是在目标方法成功执行后实施增强可应用于关闭流、删除临时文件等。④后置最终通知后置通知是在目标方法执行后实施增强与后置返回通知不同的是不管是否发生异常都要执行该通知可应用于释放资源。⑤异常通知异常通知是在方法抛出异常后实施增强可以应用于异常处理、日志记录等。⑥引入通知引入通知是在目标类中添加一些新的方法和属性可以应用于修改目标类增强类。举例使用 Eclipse 创建一个名为 Myaspect 的 Dynamic Web Project必要的 jar 已经复制到 WEB-INF/lib 目录中。在 src 目录中创建一个名为 aspectj.dao 的包并在该包中创建接口 catDao 和接口实现类 catDaoImpl。该实现类作为目标类在切面类中对其所有方法进行增强处理。package aspectj.dao; public interface catDao { public void eat(); public void sleep(); public void play(); } package aspectj.dao; import org.springframework.stereotype.Repository; Repository(catDao) public class catDaoImp implements catDao { Override public void eat() { System.out.println(小猫吃饭); } Override public void sleep() { System.out.println(小猫睡觉); } Override public void play() { System.out.println(小猫玩); } }在 src 目录中创建一个名为 aspectj.annotation 的包并在该包中创建切面类 MyAspect。在该类中用 Aspect 注解定义一个切面类并通过定义方法表示切入点名称。在目标类每一个方法上做切面成消息和目标方法名称输出完成方式和消息为前置通知主人召唤小猫后置通知小猫自主活动环绕开始执行目标方法前开启摄像头环绕结束执行目标方法后关闭摄像头/** * 切面类在此类中编写各种类型通知 */ Aspect //Aspect 声明一个切面 Component //Component 让此切面成为 Spring 容器管理的 Bean public class MyAspect { /** * 定义切入点通知增强哪些方法。 * execution(* aspectj.dao.*.*(..)) 是定义切入点表达式 * 该切入点表达式的意思是匹配aspectj.dao包中任意的任意方法的执行。 * 其中execution()是表达式的主体第一个*表示返回类型*代表所有类型 * aspectj.dao表示需要匹配的包名后面第二个*表示类名使用*代表匹配包中所有的类 * 第三个*表示方法名使用*表示所有方法后面(..)表示方法的参数其中“..”表示任意参数。 * 另外注意第一个*与包名之间有一个空格。 */ Pointcut(execution(* aspectj.dao.*.*(..))) private void myPointCut() { } /** * 前置通知使用 Joinpoint 接口作为参数获得目标对象信息 */ Before(myPointCut()) //myPointCut()是切入点的定义方法 public void before(JoinPoint jp) { System.out.print(前置通知主人召唤小猫); System.out.println(目标类对象 jp.getTarget() 被增强处理的方法 jp.getSignature().getName()); } /** * 后置返回通知 */ AfterReturning(myPointCut()) public void afterReturning(JoinPoint jp) { System.out.print(后置返回通知 小猫自主活动); System.out.println(被增强处理的方法 jp.getSignature().getName()); } /** * 环绕通知 * ProceedingJoinPoint 是 JoinPoint 子接口代表可以执行的目标方法 * 返回值类型必须是 Object * 必须有一个参数是 ProceedingJoinPoint 类型 * 必须是 throws Throwable */ Around(myPointCut()) public Object around(ProceedingJoinPoint pjp) throws Throwable { //开始 System.out.println(环绕开始执行目标方法前开启摄像头); //执行当前目标方法 Object obj pjp.proceed(); //结束 System.out.println(环绕结束执行目标方法后关闭摄像头); return obj; } /** * 异常通知 */ AfterThrowing(value myPointCut(), throwing e) public void except(Throwable e) { System.out.println(异常通知 程序执行异常 e.getMessage()); } /** * 后置最终通知 */ After(myPointCut()) public void after() { System.out.println(最终通知模拟释放资源); } }此处要着重会使用Joinpoint接口作为参数获取目标对象信息

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询