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框架中的面向切面编程模块,包括Spring AOP和AspectJ的集成。通过理解和熟练使用这些组件,开发者可以有效地解耦关注点,提高代码的可维护性和可扩展性。在实际项目中,结合...
默认情况下,Spring使用基于Java的代理,但对于需要在静态方法或非Spring管理对象上应用AOP的情况,可能需要使用CGLIB或AspectJ字节码代理。 5. **理解代理行为**:理解Spring AOP代理的工作方式很重要,因为这可能...
Spring AOP的实现主要有两种方式:一种是基于代理的AOP(Proxy-based AOP),另一种是基于AspectJ的AOP(AspectJ-based AOP)。基于代理的AOP是Spring默认的方式,它主要通过JDK动态代理或者CGLIB字节码生成技术来...
标题“spring-aop-aspectj-case”涉及到的是Spring框架中的AOP(面向切面编程)与AspectJ的集成使用案例。在Spring框架中,AOP用于处理系统中的横切关注点,如日志、事务管理等,而AspectJ则是一个强大的、独立的...
<aop:aspectj-autoproxy /> ``` ### XML方式 #### 1. 定义切面 在XML配置中,我们创建一个`<aop:config>`元素,并定义`<aop:aspect>`子元素来声明切面: ```xml <aop:config> <aop:aspect id="loggingAspect" ...
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配置方式的一个案例。Spring AOP是Spring框架的一部分,它允许我们在不修改源代码的情况下,通过"切面"来实现对...
本示例"spring-aspectj-ltw-xml-based-demo"聚焦于Spring框架如何与AspectJ集成,利用面向切面编程(AOP)来实现灵活的代码结构。AspectJ是一种强大的面向切面的编程语言扩展,它允许开发者在不改变原有业务逻辑的...
与AspectJ不同,Spring AOP默认使用代理模式(如JDK动态代理或CGLIB),但在配置后也能与AspectJ结合使用,利用AspectJ Weaver进行更强大的字节码织入。 最后,spring-aspects-4.3.6.RELEASE是Spring框架的另一个...
AspectJ是一种更强大的AOP实现,它不仅支持Spring的注解驱动的AOP,还可以进行编译时织入和加载时织入,提供了更灵活的切点表达式,可以精确地指定何时何地应用切面。Spring可以通过AspectJ的编译工具或 weaving ...
在Spring中,切面可以通过`@Aspect`注解的类来表示,如`org.springframework.aop.aspectj.annotation.AnnotationAspectAdapter`。 3. **通知(Advice)**:通知是切面中定义的行为,包括前置通知、后置通知、异常...
3. AOP与AspectJ:使用Spring的AOP特性,可以实现横切关注点的解耦,如日志记录、事务管理等。 4. Spring Data JPA与MyBatis:整合ORM框架,简化数据库访问,提高开发效率。 5. 自动化测试:利用Spring Test和...
1. **aspectjweaver-1.6.11.jar**:这是AspectJ的编织器,用于实现AOP(面向切面编程)。在Spring框架中,AOP主要用来处理日志、事务管理等横切关注点,它使得这些通用功能可以被模块化,而不需要侵入业务代码。 2....
这可以通过设置`<aop:aspectj-autoproxy>`或`<aop:config>`元素来完成。例如: ```xml <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ...
此外,还可以通过`@AspectJSupport`和`<aop:aspectj-autoproxy>`元素来启用XML配置方式。 在实际应用中,AspectJ的编译时织入(CTW)和类加载时织入(LTW)可以提高性能,因为它们减少了运行时的代理创建。CTW是在...
8. `spring-aspects`模块:包含了与AOP相关的库,例如与AspectJ的集成。 9. `spring-test`模块:提供测试支持,方便进行单元测试和集成测试。 除此之外,readme.txt文件可能包含有关此版本的Spring框架的重要信息,...
aspectj.jar的1.9.0版本,下载后粘贴到所属的lib文件下即可
在实际应用中,AspectJ通常与Spring框架结合使用,Spring AOP提供了基于代理的AOP实现,而AspectJ则提供了更强大的类型安全的AOP支持。通过配置Spring,可以将AspectJ织入到应用程序中,实现对业务代码的无侵入式...
- **`org.springframework.aop.aspectj.autoproxy.AspectJAutoProxyCreator`**:Spring AOP的关键类,负责创建代理对象。 - **`org.springframework.aop.config.AopConfigUtils`**:提供了一些工具方法,用于处理...
Spring AOP的一个常见问题是获取Pointcut到达类的内部方法调用。 在这个示例中,您可以在一个简单的Spring Boot示例中看到如何使用AspectJ处理节拍时间编织。 示例场景 在此示例中,将发生以下情况: 我们在上调用...