`

Spring--Aop-AspectJ

 
阅读更多

AspectJ:
AspectJ是一个基于Java语言的AOP框架

jar包:
 AOP联盟:com.springsource.org.aopalliance-1.0.0.jar
 spring aop实现:spring-aop-3.2.0.RELEASE.jar
 Aspectj规范:com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
 spring aspect实现:spring-aspects-3.2.0.RELEASE.jar

 切入点表达式:
1.execution()  用于描述方法(用法在spring--aop中有介绍)
2.within() 用于描述包的,匹配包或子包中的方法(了解)
3.this() 用于描述当前对象,匹配实现接口的代理对象中的方法(了解)
4.target() 用于描述目标对象,匹配实现接口的目标类中的方法(了解)
5.args() 用于描述参数,匹配参数格式符合标准的方法(了解)
6.bean() 用于描述指定bean

通知类型:
aspectj通知类型:前置通知、后置通知、环绕通知、异常抛出通知、最终通知
1)before:前置通知(应用:各种校验)
 在方法执行前执行,如果通知抛出异常,阻止目标方法运行
2)afterReturning:后置通知(应用:常规数据处理)
 方法正常返回后执行,如果目标方法中抛出异常,通知无法执行
 必须在方法执行后才执行,所以可以获得方法的返回值。
3)around:环绕通知(应用:十分强大,可以做任何事情)【必须是Object的,必须要有第一个参数,
它的参数是JoinPoint的子接口ProceedingJoinPoint joinPoint,对外必须要抛出异常,
手动执行目标方法joinPoint.proceed()】
 方法执行前后分别执行,可以阻止方法的执行
4)afterThrowing:抛出异常通知(应用:包装异常信息、记录日志(info、warn、error)等)
 方法抛出异常后执行,如果方法没有抛出异常,无法执行
5)after:最终通知(应用:清理现场)
 方法执行完毕后执行,无论方法中是否出现异常
环绕
try{
   //前置通知
   手动执行目标方法 Object obj = ...
   //后置通知
} catch{
   //抛出异常通知
} finally{
   //最终通知
}

通知演示XML配置:
public class MyAspect {
 
 public void myBefore(JoinPoint joinPoint){
  System.out.println("前置通知:" + joinPoint.getSignature().getName());
 }
 public void myAfterReturning(JoinPoint joinPoint,Object val){
  System.out.println("后置通知:" + joinPoint.getSignature().getName() + " @ " + val);
 }
 
 public Object myAround(ProceedingJoinPoint joinPoint) throws Throwable{
  System.out.println("环绕前");
  //手动执行目标方法
  Object obj = joinPoint.proceed();
  
  System.out.println("环绕后");
  return obj;
 }
 
 public void myAfterThrowing(JoinPoint joinPoint, Throwable e){
  System.out.println("抛出异常通知" + e.getMessage());
 }
 
 public void myAfter(JoinPoint joinPoint){
  System.out.println("最终通知");
 }
}
<!-- 1 创建service -->
 <bean id="userServiceId" class="cn.xxx.d_aspect.a_xml.UserServiceImpl"></bean>
 <!-- 2 切面类 -->
 <bean id="myAspectId" class="cn.xxx.d_aspect.a_xml.MyAspect"></bean>
 <!-- 3 aop aspectj编程
  <aop:aspect> 进行aspect配置,切面配置
   * ref 用于引用切面类,从而确定通知(方法名)
  <aop:pointcut> 声明切入点
 -->
 <aop:config>
  <aop:aspect ref="myAspectId">
   <aop:pointcut expression="execution(* cn.xxx.d_aspect.a_xml.*.*(..))" id="myPointcut"/>
   <!-- 3.1 前置通知
    * 配置:<aop:before method="myBefore" pointcut-ref="myPointcut"/>
    * 通知:public void myBefore(JoinPoint joinPoint){
     具有一个参数,可以获得当前连接点的描述信息。例如:方法名称 joinPoint.getSignature().getName()
     类型:org.aspectj.lang.JoinPoint
   <aop:before method="myBefore" pointcut-ref="myPointcut"/>
   -->
   <!-- 3.2 后置通知 ,在目标方法之后执行,所以可以获得目标方法返回值
    * 配置:<aop:after-returning method="myAfterReturning" pointcut-ref="myPointcut" returning="val"/>
    * 通知:public void myAfterReturning(JoinPoint joinPoint,Object val){
     参数1:当前连接点描述
     参数2:返回值,类型必须是Object,参数名称必须是 <aop:after-returning ...returning="
">设置的。
   <aop:after-returning method="myAfterReturning" pointcut-ref="myPointcut" returning="val"/>
   -->
   <!-- 3.3 环绕通知 ,必须手动执行目标方法
    * 配置:<aop:around method="myAround" pointcut-ref="myPointcut" />
    * 通知:public Object myAround(ProceedingJoinPoint joinPoint) throws Throwable{
     1)返回类型必须是Object
     2)方法参数必须是ProceedingJoinPoint
     3)必须抛出异常Throwable
     4)执行目标方法:Object obj = joinPoint.proceed();
   <aop:around method="myAround" pointcut-ref="myPointcut" />
   -->
   <!-- 3.4 抛出异常 ,只有发生异常时,才执行。通常不执行。
    * 配置:<aop:after-throwing method="myAfterThrowing" pointcut-ref="myPointcut" throwing="e"/>
    * 通知:public void myAfterThrowing(JoinPoint joinPoint, Throwable e){
     参数1:。。。
     参数2:异常的描述信息,类型必须Throwable,参数名称通过 throwing 配置确定
   <aop:after-throwing method="myAfterThrowing" pointcut-ref="myPointcut" throwing="e"/>
   -->
   <!-- 3.5 最终通知
    * 配置: <aop:after method="myAfter" pointcut-ref="myPointcut"/>
    * 通知:public void myAfter(JoinPoint joinPoint){
   -->
   <aop:after method="myAfter" pointcut-ref="myPointcut"/>
  </aop:aspect>
 </aop:config>

注解配置:
@service声明service层,加注在service的实现层上@service("userService")。
@Component声明不好归类的组件。例如:@Component("myAspectId")
service和component的生效要通过context的扫描才能够生效。

@Aspect 声明切面 @Before 前置 @AfterReturning 后置 @Around 环绕
@AfterThrowing 抛出异常 @After  最终
@Pointcut  声明切入点,修饰固定方法上  private void 自定义(){}
以上注解要生效,必须在xml配置
<aop:aspectj-autoproxy>

前置通知:@Before("execution(* cn.xxx.d_aspect.b_annotation.*.*(..))")
后置通知:@AfterReturning(value="myPointCut()" ,returning="val")
   声明切入点,达到表示共享。使用时相当于方法调用
    @Pointcut("execution(* cn.xxx.d_aspect.b_annotation.*.*(..))")
    private void myPointCut(){}【在切面类中进行声明】

环绕通知:@Around("execution(* cn.xxx.d_aspect.b_annotation.*.*(..))")
抛出异常通知:@AfterThrowing(value="myPointCut()" ,throwing="e")


 

分享到:
评论

相关推荐

    spring-aop-jar

    总结起来,"spring-aop-jar"涉及了Spring框架中的面向切面编程模块,包括Spring AOP和AspectJ的集成。通过理解和熟练使用这些组件,开发者可以有效地解耦关注点,提高代码的可维护性和可扩展性。在实际项目中,结合...

    spring-boot aop

    默认情况下,Spring使用基于Java的代理,但对于需要在静态方法或非Spring管理对象上应用AOP的情况,可能需要使用CGLIB或AspectJ字节码代理。 5. **理解代理行为**:理解Spring AOP代理的工作方式很重要,因为这可能...

    jar包---Spring Aop AspectJ新增包.rar

    Spring AOP的实现主要有两种方式:一种是基于代理的AOP(Proxy-based AOP),另一种是基于AspectJ的AOP(AspectJ-based AOP)。基于代理的AOP是Spring默认的方式,它主要通过JDK动态代理或者CGLIB字节码生成技术来...

    spring-aop-aspectj-case

    标题“spring-aop-aspectj-case”涉及到的是Spring框架中的AOP(面向切面编程)与AspectJ的集成使用案例。在Spring框架中,AOP用于处理系统中的横切关注点,如日志、事务管理等,而AspectJ则是一个强大的、独立的...

    spring aop注解方式、xml方式示例

    &lt;aop:aspectj-autoproxy /&gt; ``` ### XML方式 #### 1. 定义切面 在XML配置中,我们创建一个`&lt;aop:config&gt;`元素,并定义`&lt;aop:aspect&gt;`子元素来声明切面: ```xml &lt;aop:config&gt; &lt;aop:aspect id="loggingAspect" ...

    spring-aop-annotation-log-all

    spring-aop-4.0.4.RELEASE.jar com.springsource.net.sf.cglib-2.2.0.jar com.springsource.org.aopalliance-1.0.0.jar com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar spring-aspects-4.1.2.RELEASE.jar ...

    spring-aop-aspectj(Schema)-case

    标题 "spring-aop-aspectj(Schema)-case" 指涉的是Spring AOP(面向切面编程)中使用AspectJ的Schema配置方式的一个案例。Spring AOP是Spring框架的一部分,它允许我们在不修改源代码的情况下,通过"切面"来实现对...

    spring-aspectj-ltw-xml-based-demo

    本示例"spring-aspectj-ltw-xml-based-demo"聚焦于Spring框架如何与AspectJ集成,利用面向切面编程(AOP)来实现灵活的代码结构。AspectJ是一种强大的面向切面的编程语言扩展,它允许开发者在不改变原有业务逻辑的...

    aopalliance-1.0、aspectjweaver-1.8.10、spring-aop-4.3.6.RELEASE、spring-aspects-4.3

    与AspectJ不同,Spring AOP默认使用代理模式(如JDK动态代理或CGLIB),但在配置后也能与AspectJ结合使用,利用AspectJ Weaver进行更强大的字节码织入。 最后,spring-aspects-4.3.6.RELEASE是Spring框架的另一个...

    开源框架spring详解-----AOP的深刻理解

    AspectJ是一种更强大的AOP实现,它不仅支持Spring的注解驱动的AOP,还可以进行编译时织入和加载时织入,提供了更灵活的切点表达式,可以精确地指定何时何地应用切面。Spring可以通过AspectJ的编译工具或 weaving ...

    spring-aop.jar

    在Spring中,切面可以通过`@Aspect`注解的类来表示,如`org.springframework.aop.aspectj.annotation.AnnotationAspectAdapter`。 3. **通知(Advice)**:通知是切面中定义的行为,包括前置通知、后置通知、异常...

    spring-5.3.14-dist.zip(spring-framework-5.3.14)

    3. AOP与AspectJ:使用Spring的AOP特性,可以实现横切关注点的解耦,如日志记录、事务管理等。 4. Spring Data JPA与MyBatis:整合ORM框架,简化数据库访问,提高开发效率。 5. 自动化测试:利用Spring Test和...

    spring-mybatis整合jar包,spring-mybatis整合jar包

    1. **aspectjweaver-1.6.11.jar**:这是AspectJ的编织器,用于实现AOP(面向切面编程)。在Spring框架中,AOP主要用来处理日志、事务管理等横切关注点,它使得这些通用功能可以被模块化,而不需要侵入业务代码。 2....

    spring-aop实例demo

    这可以通过设置`&lt;aop:aspectj-autoproxy&gt;`或`&lt;aop:config&gt;`元素来完成。例如: ```xml &lt;beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ...

    Spring的AOP依赖包-AspectJ

    此外,还可以通过`@AspectJSupport`和`&lt;aop:aspectj-autoproxy&gt;`元素来启用XML配置方式。 在实际应用中,AspectJ的编译时织入(CTW)和类加载时织入(LTW)可以提高性能,因为它们减少了运行时的代理创建。CTW是在...

    spring-framework-4.2.4.RELEASE-dist Spring资源包

    8. `spring-aspects`模块:包含了与AOP相关的库,例如与AspectJ的集成。 9. `spring-test`模块:提供测试支持,方便进行单元测试和集成测试。 除此之外,readme.txt文件可能包含有关此版本的Spring框架的重要信息,...

    spring aspectj-1.9.0.jar包

    aspectj.jar的1.9.0版本,下载后粘贴到所属的lib文件下即可

    aspectj-aspectjweaver-aopalliance

    在实际应用中,AspectJ通常与Spring框架结合使用,Spring AOP提供了基于代理的AOP实现,而AspectJ则提供了更强大的类型安全的AOP支持。通过配置Spring,可以将AspectJ织入到应用程序中,实现对业务代码的无侵入式...

    AOP.rar-Spring-AOP源码Demo

    - **`org.springframework.aop.aspectj.autoproxy.AspectJAutoProxyCreator`**:Spring AOP的关键类,负责创建代理对象。 - **`org.springframework.aop.config.AopConfigUtils`**:提供了一些工具方法,用于处理...

    spring-aop-aspectj-ctw:用AspectJ编译Spring AOP

    Spring AOP的一个常见问题是获取Pointcut到达类的内部方法调用。 在这个示例中,您可以在一个简单的Spring Boot示例中看到如何使用AspectJ处理节拍时间编织。 示例场景 在此示例中,将发生以下情况: 我们在上调用...

Global site tag (gtag.js) - Google Analytics