spring aop 切点和切面,spring的切面编程

  spring aop 切点和切面,spring的切面编程

  1.AOP概念是面向对象编程,指的是通过扩展功能,在不修改源代码的情况下,将功能代码与业务逻辑代码分离。

  主要功能:日志记录、性能统计、安全控制、事务处理、异常处理等。

  主要用途:分离日志记录、性能统计、安全控制、事务处理、异常处理等代码。来自业务逻辑代码。通过分离这些行为,我们希望它们可以独立于不引导业务逻辑的方法,这样改变这些行为就不会影响业务逻辑代码。

  AOP的特点:采用水平抽取机制代替传统垂直继承系统的重复代码。

  Aop代表面向方面编程,它是面向方面的。AOP的主要目的是提取业务处理中的刻面,面向处理过程中的某个步骤或阶段,以获得逻辑流程中各部分之间低耦合的隔离效果。类似于设计模式完成的任务,它提供了另一个角度来思考程序的结构,以弥补面向对象编程的不足。

  一般来说,它提供了一种将方面注入业务实现的机制。这样,在业务操作过程中,定义的刻面通过切入点绑定到业务上,从而实现一些特殊逻辑对业务的绑定。

  比如,如果你需要一个日志函数,你首先想到的就是通过log4j或者方法中的其他框架进行日志记录。然而,当你写下来的时候,你发现了一个问题。其实整个业务中核心业务代码并不多,都是日志或者其他辅助代码。而且,很多业务需要相同的功能,比如日志。这时,这些日志记录功能需要再次复制。即使它们被封装到一个框架中,也需要被调用。在这里使用复杂的设计模式是不值得的。所以你需要面对截面。

  2.aop的名称。首先介绍一些aop术语。其实这些术语对AOP的使用没有什么影响,但是最好了解一些,以便更好的理解。

  方面:可能跨越多个对象的关注点的模块化。事务管理是J2EE应用程序中横切关注点的一个好例子。在Spring AOP中,可以使用基于模式或@Aspect注释来实现方面。连接点:程序执行过程中的一个特定点,例如当调用一个方法或处理一个异常时。在Spring AOP中,连接点总是代表一个方法的执行。建议:在切面的特定连接点执行的动作。它包括不同类型的通知,如“周围”、“之前”和“之后”(通知的类型将在后面讨论)。许多AOP框架(包括Spring)使用拦截器作为通知模型,并维护以连接点为中心的拦截器链。切入点:匹配连接点的断言。通知与一个切入点表达式相关联,并在满足这个切入点的连接点上运行(例如,当一个具有特定名称的方法被执行时)。切入点表达式如何匹配切入点是AOP的核心:Spring默认使用AspectJ切入点语法。简介:它用于声明一个类型的附加方法或属性(也称为类型间声明)。Spring允许向任何被代理的对象引入新的接口(和相应的实现)。例如,您可以使用import使bean实现IsModified接口,从而简化缓存机制。目标对象:由一个或多个方面通知的对象。也称为建议对象。因为Spring AOP是通过运行时代理实现的,所以这个对象总是被代理的对象。AOP代理:由AOP框架创建的对象,用于实现正切契约(如通知方法的执行等。).在Spring中,AOP代理可以是JDK动态代理或CGLIB代理。编织:将切面连接到其他应用程序类型或对象,并创建一个通知对象。这些可以在编译时(例如,使用AspectJ编译器)、类加载时和运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成编织。其中,重要名词有:插队,插队

  3.AOP的底层由动态代理实现,包括两种方式:

  (1)使用JDK动态代理。

  (2)用cglib实现。

  JDK动态代理的实现;

  只能为实现接口的类生成代理,而不能为类生成代理,目标类型实现的所有接口都将被代理。原理是在运行时创建接口的实现类,完成目标对象的代理。步骤如下:

  定义实现接口的InnvocationHandler的类被注入到代理类中,通过构造函数实现invoke(Object proxy,Method method,Object[] args)方法。代理类的类加载器在main函数中获得。使用Proxy.newProxyInstance()生成代理对象,通过代理对象调用各种方法cglib。动态代理实现:

  对于类实现代理是否实现接口没有要求。原理是生成指定类的子类,覆盖其中的方法。因为是继承,所以最好不要将代理的类或方法声明为最终类型。

  定义一个实现MethodIntercepter接口的类来实现它的Intercepter()方法,其中调用proxy.invokeSuper()来选择代理模式:

  如果目标对象实现接口,默认使用JDK的动态代理实现AOP,也可以强制cgLib实现AOP。如果目标对象没有实现接口,就必须使用cglib库,Spring会自动在JDK动态代理和cglib之间转换静态代理和动态代理的区别:

  静态代理:自己编写创建代理类,然后编译。在程序运行之前,动态代理已经存在于。代理类的类文件:在实现阶段,你不需要关心代理是谁,但是在运行阶段(通过反射机制),你可以指定代理哪个对象。4.例1。pom引入Springboot来使用AOP相关的依赖。

  其中包括:

  Cglib包用于动态代理,基于类的代理;

  aspectjrt和aspectjweaver是与实现相关的包,用来支持切面编程的;

  aspectjrt包是实现的运行时间包;

  aspectjweaver是实现的织入包;

  2、实现一个简单的网请求入口(实现传入名字参数,返回"你好xxx”的功能)

  注意:在完成了引入面向切面编程依赖包后,一般来说并不需要去做其他配置。使用过春天注解配置方式的人会问是否需要在程序主类中增加@EnableAspectJAutoProxy来启用,实际并不需要。

  因为在面向切面编程的默认配置属性中,spring.aop.auto属性默认是开启的,也就是说只要引入了面向切面编程依赖后,默认已经增加了@EnableAspectJAutoProxy。

  3、定义切面类,实现网层的日志切面

  要想把一个类变成切面类,需要两步,

   在类上使用@组件注解把切面类加入到国际奥林匹克委员会容器中

   在类上使用@Aspect注解使之成为切面类

  包com。举例。AOP

  导入org。AspectJ。郎。连接点;

  导入org。AspectJ。郎。注释。回来后;

  导入org。AspectJ。郎。注释。方面;

  导入org。AspectJ。郎。注释。之前;

  导入org。AspectJ。郎。注释。切入点;

  导入org。slf4j。记录者;

  导入org。SLF 4j。伐木工厂;

  导入org。spring框架。刻板印象。组件;

  导入组织。spring框架。网络。语境。请求。requestcontextholder

  导入组织。spring框架。网络。语境。请求。servletrequestattributes

  导入javax。servlet。http。http servlet请求;

  导入Java。util。数组;

  @Aspect

  @组件

  公共类WebLogAcpect {

  私有记录器记录器=记录器工厂。获取日志记录器(weblogacpect。类);

  /**

  * 定义切入点,切入点为com.example.aop下的所有函数

  */

  @切入点(执行(public * com.example.aop.*.*(.)))

  公共空的日志(){}

  /**

  * 前置通知:在连接点之前执行的通知

  * @param连接点

  * @次投掷可投掷的

  */

  @Before(webLog())

  public void doBefore(连接点连接点)Throwable {

  //接收到请求,记录请求内容

  ServletRequestAttributes attributes=(ServletRequestAttributes)requestcontextholder。getrequestattributes();

  http servlet请求请求=属性。get request();

  //记录下请求内容

  伐木工。信息( URL:请求。getrequesturl().toString());

  伐木工。info( HTTP _ METHOD:请求。get方法());

  伐木工。信息( IP:请求。get remote addr());

  伐木工。info( CLASS _ METHOD:连接点。获取签名().getDeclaringTypeName()"。joinPoint.getSignature().getName());

  伐木工。info( ARGS:数组。tostring(连接点。get args()));

  }

  @AfterReturning(returning=ret ,pointcut=webLog())

  public void doAfterReturning(Object ret)throws Throwable {

  //处理完请求,返回内容

  logger.info(RESPONSE : ret ).

  }

  }以上的切面类通过@切入点定义的切入点为com.example.aop包下的所有函数做切人,通过@以前实现切入点的前置通知,通过@AfterReturning记录请求返回的对象。

  访问http://本地主机:8004/你好?name=lmb得到控制台输出如下:

  参考文章:社区云-社区文章详情

  【弹簧靴】春季面向切面编程(Aspect Oriented Programming的缩写)面向切面编程初接触-大招无限

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: