网站制作工具推荐,国内人做韩国网站一般都卖什么手续,网站制作建设案例,少儿编程scratch一.aop简介 AOP#xff08;Aspect-Oriented Programming#xff09;是Spring框架的一个重要特性#xff0c;它通过将横切关注点#xff08;cross-cutting concerns#xff09;从核心业务逻辑中分离出来#xff0c;以模块化的方式在整个应用程序中重复使用。以下是关于AOP…一.aop简介 AOPAspect-Oriented Programming是Spring框架的一个重要特性它通过将横切关注点cross-cutting concerns从核心业务逻辑中分离出来以模块化的方式在整个应用程序中重复使用。以下是关于AOP的简介及其特点 简介 AOP是一种编程范式它通过将横切关注点切割出来将其模块化并将其应用于多个类和模块以提高代码的重用性和可维护性。横切关注点是指与核心业务逻辑无关但存在于多个类或模块中的非功能性需求例如日志记录、性能监控、事务管理等。 特点 模块化AOP允许将横切关注点从核心业务逻辑中提取出来形成独立的切面Aspect使得关注点的逻辑可以独立于各个模块。解耦AOP通过解耦横切关注点与核心业务逻辑使得它们可以独立演化和变化提高了模块之间的松耦合程度。重用性AOP允许将切面应用于多个类和模块从而实现了关注点的重用避免了代码的重复编写。可维护性将横切关注点抽象为切面后使得代码结构更清晰易于理解和维护。动态性AOP可以在运行时动态地将切面应用到目标对象上而不需要修改目标对象的源代码增强了系统的灵活性和可扩展性。多样性Spring框架支持不同类型的切面编程包括基于代理的AOP和基于字节码增强的AOP。这样可以选择最适合应用程序需求的AOP实现方式。 在Spring框架中AOP的实现采用了代理模式和动态代理技术。Spring提供了多种AOP的实现方式包括基于XML配置的AOP、基于注解的AOP和基于纯Java配置的AOPJavaConfig等开发者可以根据具体需求选择适合的方式来配置和使用AOP。 二.aop中的专业术语 切面Aspect切面是一个模块化单元用于解耦和封装横切关注点的逻辑。切面由切点和通知组成它定义了何时在何处应用通知。 切点Pointcut切点定义了在应用程序中哪些位置应该应用通知。它通过表达式或模式匹配规则来指定需要被拦截的连接点Join Point。 连接点Join Point连接点是在应用程序执行过程中可以插入切面的特定点。例如方法执行、异常抛出、字段访问等都可以是连接点。 通知Advice通知是在切面的特定连接点上执行的动作。在Spring AOP中有以下几种通知类型 前置通知Before Advice在连接点之前执行的通知。后置通知After Advice在连接点之后执行的通知。返回通知After Returning Advice在连接点成功完成后执行的通知。异常通知After Throwing Advice在连接点发生异常时执行的通知。环绕通知Around Advice在连接点前后都执行的通知可以控制方法的执行。 引入Introduction引入是一种给现有类添加新方法或属性的方式。它允许在不修改原始类代码的情况下向类添加新功能。 织入Weaving织入是将切面应用到目标对象上以创建新的代理对象的过程。在Spring AOP中织入可以在编译时、类加载时或运行时进行。 目标对象Target Object目标对象是被切面通知的真实对象。它是应用程序中具体业务逻辑的实现。 异常处理Exception Handling异常处理是在连接点发生异常时切面执行的特定动作。它可以捕获和处理异常提供错误处理或回滚事务等功能。 三.案例演示
1.前置通知 1.1 先准备接口 package com.YU.aop.biz;public interface IBookBiz {// 购书public boolean buy(String userName, String bookName, Double price);// 发表书评public void comment(String userName, String comments);
}1.2然后再准备好实现类 package com.YU.aop.biz.impl;import com.YU.aop.biz.IBookBiz;
import com.YU.aop.exception.PriceException;public class BookBizImpl implements IBookBiz {public BookBizImpl() {super();}public boolean buy(String userName, String bookName, Double price) {// 通过控制台的输出方式模拟购书if (null price || price 0) {throw new PriceException(book price exception);}System.out.println(userName buy bookName , spend price);return true;}public void comment(String userName, String comments) {// 通过控制台的输出方式模拟发表书评System.out.println(userName say: comments);}}1.3对我们的目标对象进行JavaBean配置 !--目标对象--bean classcom.YU.aop.biz.impl.BookBizImpl idbookBiz/bean 1.4 编写前置系统日志通知 package com.YU.aop.advice;import java.lang.reflect.Method;
import java.util.Arrays;import org.springframework.aop.MethodBeforeAdvice;/*** 买书、评论前加系统日志* author YU**/
public class MyMethodBeforeAdvice implements MethodBeforeAdvice {Overridepublic void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {
// 在这里可以获取到目标类的全路径及方法及方法参数然后就可以将他们写到日志表里去String target arg2.getClass().getName();String methodName arg0.getName();String args Arrays.toString(arg1);System.out.println(【前置通知系统日志】target.methodName(args)被调用了);}}1.5配置系统通知XML中的JavaBean !--通知--bean classcom.YU.aop.advice.MyMethodBeforeAdvice idmyMethodBeforeAdvice/bean 1.6 配置代理XML中的JavaBean !-- 代理--bean classorg.springframework.aop.framework.ProxyFactoryBean idbookProxy!-- 配置目标对象 --property nametarget refbookBiz/property!-- 配置代理接口目标对象的接口 --property nameproxyInterfacesvaluecom.YU.aop.biz.IBookBiz/value/propertyproperty nameinterceptorNameslistvaluemyMethodBeforeAdvice/value/list/property/bean 1.7 测试代码开始测试 package com.YU.aop.test;import com.YU.aop.biz.IBookBiz;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** author YU* create 2023-08-17 15:14*/
public class Test1 {public static void main(String[] args) {//建模ClassPathXmlApplicationContext context new ClassPathXmlApplicationContext(spring-context.xml);
// IBookBiz bookBiz (IBookBiz) context.getBean(bookBiz);IBookBiz bookBiz (IBookBiz) context.getBean(bookProxy);bookBiz.buy(死仔,我的26岁女房客,18.8d);bookBiz.comment(死仔,真好看);}
}测试结果 由测试结果可得知不仅获取到了我们的参数同时根据方法获取到了我们的系统日志也就是前置通知 2. 后置通知 2.1 先准备好后置通知的系统日志 package com.zking.aop.advice;import java.lang.reflect.Method;
import java.util.Arrays;import org.springframework.aop.AfterReturningAdvice;/*** 买书返利* author Administrator**/
public class MyAfterReturningAdvice implements AfterReturningAdvice {Overridepublic void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3) throws Throwable {String target arg3.getClass().getName();String methodName arg1.getName();String args Arrays.toString(arg2);System.out.println(【后置通知买书返利】target.methodName(args)被调用了该方法被调用后的返回值为arg0);}}2.2 配置后置系统通知的XML的JavaBean !--后置通知--bean classcom.YU.aop.advice.MyAfterReturningAdvice idmyAfterReturningAdvice/bean 并在前面已经配置好的代理接口中添加一个value值 2.3 测试结果 由测试结果我们可以得知后置通知永远都在方法执行后才会显示通知与前置通知不同的是每次前面的方法调用后都会返回一个参数 3.环绕通知 3.1 环绕通知就是前置通知和后置通知的结合在实际应用开发中我们一般不会单独编写前置通知和后置通知单独使用前置通知或者后置通知时我们会使用环绕通知将里面前置后置通知的功能注释以达到单独使用的目的 3.2 环绕通知的系统日志 package com.YU.aop.advice;import java.util.Arrays;import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;/*** 环绕通知* 包含了前置和后置通知* * author Administrator**/
public class MyMethodInterceptor implements MethodInterceptor {Overridepublic Object invoke(MethodInvocation arg0) throws Throwable {String target arg0.getThis().getClass().getName();String methodName arg0.getMethod().getName();String args Arrays.toString(arg0.getArguments());System.out.println(【环绕通知调用前】target.methodName(args)被调用了);
// arg0.proceed()就是目标对象的方法Object proceed arg0.proceed();System.out.println(【环绕通知调用后】该方法被调用后的返回值为proceed);return proceed;}}3.3 配置环绕通知的XML的JavaBean与前置通知和后置通知一致 3.4 测试结果 由测试结果得知环绕通知就是前置通知和后置通知的结合优点就是不需要再多次去进行配置及编码所以就像我们前面所说在实际开发应用中我们一般都会选择使用环绕通知 4.异常通知 4.1 异常通知的系统日志和其他系统日志不同的是方法名为固定的afterThrowing不能修改 package com.YU.aop.advice;import org.springframework.aop.ThrowsAdvice;import com.YU.aop.exception.PriceException;/*** 出现异常执行系统提示然后进行处理。价格异常为例* author Administrator**/
public class MyThrowsAdvice implements ThrowsAdvice {public void afterThrowing(PriceException ex) {System.out.println(【异常通知】当价格发生异常那么执行此处代码块);}
}4.2 在我们正常程序出问题没有去配置异常通知时会出现报错并且不会执行后面的后置通知如以下情况 4.3 异常处理配置和前面的配置相同 4.4 当我们配置好异常通知模块时程序出现异常时会上报日志进行提示 5.过滤通知 5.1 直接在XML中配置JavaBean !--过滤通知--bean classorg.springframework.aop.support.RegexpMethodPointcutAdvisor idregexpMethodPointcutAdvisorproperty nameadvice refmyAfterReturningAdvice/propertyproperty namepattern value.*buy/property/bean 将图中指出部分替换成过滤通知 测试结果 对比框中内容在调用过buy方法后进行过滤第二次调用时不再buy方法而是comment方法 四.总结 aop是面向切面编程普通程序由上而下正常执行aop的程序执行是先执行到目标对象的目标方法中如果连接点上由前置通知则先执行前置通知再执行目标方法最后如果目标方法有后置通知则最后执行后置通知代码不管是前置通知后置通知环绕通知异常通知过滤通知代码都是非业务核心代码如日志、事务的管理开启、提交、回滚