AOP术语。
切面(Aspect)横切关注点(跨越应用程序多个模块的功能),被模块化的特殊对象
通知(Adivice)切面必须要完成的工作
代理(Proxy)向目标对象应用通知之后创建对象。
连接点(joinpoint):程序执行的某个特定位置:如类某个方法调用前,调用后,方法抛出异常后等。连接点有两个
信息确定:方法标识的程序执行点,相对点表示方位。例如ArithmethicCalculator#add()方法执行前的位置
切点(pointcut)每个类都拥有多个连接点:例如ArithmethicCalculator的所有方法实际上都是连接点,即连接点时成粗中客观的食物,
AOP通过切点定位到特定的连接点,即连接点时程序类中客观存在的食物,AOP通过切点定位到特定的连接点,类比:连接点相当于数据库中的记录
切点相当于查询条件,切点和连接点不是一对一关系,一个切点匹配多个连接点,切点通过org.springframework.aop.Pointcut接口尽心描述。它使用类和方法
作为连接点的查询条件。
在spring中启用AspectJ注解支持
要在Spring应用中使用AspectJ必须在classpath下包含Aspect类库:aopalliance.jar aspectj.weaver.jar和spring-aspects.jar
将AOPSchema添加到<beans>根元素中。
要在Spring ioc容器中启用AspectJ注解支持,只要在Bean配置文件中定义一个空的xml元素<aop:aspectj-autoproxy>
当Spring IOC 容器侦测到Bean配置文件中的<aop:aspectj-autoproxy>元素时,会自动为与AspectJ切面匹配的Bean创建代理。
使用步骤:
加入jar包
1)com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
spring-aop-4.0.0.RELEASE.jar
spring-aspects-4.0.0.RELASE.jar
commons-logging-1.1.3.jar
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
2)在配置文件中加入AOP命名空间
3)基于注解方式
①配置文件中加入如下配置
<!--使AsjectJ注释起作用:自动为 匹配的类生成代理对象-->
前提要有<context:component-scan base-package="com.spring.test.aop.impl"></context:component-scan>
然后加入如下配置<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
②把横切关注点的代码抽象到切面类中。
i.切面首先是一个IOC中的bean.即加入@Component注释
ii.切面还需要加入@Aspect注释
③.在类种声明各种通知
AspectJ支持5中类型的通知注释
@Before:前置通知
@After:后置通知
@AfterRunning:返回通知,在方法返回结果后执行
@AfterThrowing:异常通知,在方法抛出异常之后
@Around:环绕通知,围绕着方法执行。
具体步骤如下:
i.声明一个方法
ii.在方法前加入@Before注解。
例如:@Before("execution(public int com.spring.test.aop.impl.AtithmeticCalculator.*(int ,int ))")
也可以换成下边范围更广的类型@Before("execution(* com.spring.test.aop.impl.*.*(int ,int ))")
上边这句说明可以返回任意类型的任何方法操作。作用范围更为广泛
④可以让通知访问当前连接点的细节
可以在通知方法中声明一个类型为JoinPoint的参数。然后就能范文链接细节,如方法名称和参数值。如下代码:
@Before("execution(public int com.spring.test.aop.impl.AtithmeticCalculator.*(int ,int ))")
public void beforeMehtod(JoinPoint joint){
String methodName=joint.getSignature().getName();//方法名称
List<Object> args=Arrays.asList(joint.getArgs()); //传入方法中的参数
System.out.println("the methodName:"+methodName+" begin with"+args);
System.out.println("the method begins");
}
切面(Aspect)横切关注点(跨越应用程序多个模块的功能),被模块化的特殊对象
通知(Adivice)切面必须要完成的工作
代理(Proxy)向目标对象应用通知之后创建对象。
连接点(joinpoint):程序执行的某个特定位置:如类某个方法调用前,调用后,方法抛出异常后等。连接点有两个
信息确定:方法标识的程序执行点,相对点表示方位。例如ArithmethicCalculator#add()方法执行前的位置
切点(pointcut)每个类都拥有多个连接点:例如ArithmethicCalculator的所有方法实际上都是连接点,即连接点时成粗中客观的食物,
AOP通过切点定位到特定的连接点,即连接点时程序类中客观存在的食物,AOP通过切点定位到特定的连接点,类比:连接点相当于数据库中的记录
切点相当于查询条件,切点和连接点不是一对一关系,一个切点匹配多个连接点,切点通过org.springframework.aop.Pointcut接口尽心描述。它使用类和方法
作为连接点的查询条件。
在spring中启用AspectJ注解支持
要在Spring应用中使用AspectJ必须在classpath下包含Aspect类库:aopalliance.jar aspectj.weaver.jar和spring-aspects.jar
将AOPSchema添加到<beans>根元素中。
要在Spring ioc容器中启用AspectJ注解支持,只要在Bean配置文件中定义一个空的xml元素<aop:aspectj-autoproxy>
当Spring IOC 容器侦测到Bean配置文件中的<aop:aspectj-autoproxy>元素时,会自动为与AspectJ切面匹配的Bean创建代理。
使用步骤:
加入jar包
1)com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
spring-aop-4.0.0.RELEASE.jar
spring-aspects-4.0.0.RELASE.jar
commons-logging-1.1.3.jar
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
2)在配置文件中加入AOP命名空间
3)基于注解方式
①配置文件中加入如下配置
<!--使AsjectJ注释起作用:自动为 匹配的类生成代理对象-->
前提要有<context:component-scan base-package="com.spring.test.aop.impl"></context:component-scan>
然后加入如下配置<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
②把横切关注点的代码抽象到切面类中。
i.切面首先是一个IOC中的bean.即加入@Component注释
ii.切面还需要加入@Aspect注释
③.在类种声明各种通知
AspectJ支持5中类型的通知注释
@Before:前置通知
@After:后置通知
@AfterRunning:返回通知,在方法返回结果后执行
@AfterThrowing:异常通知,在方法抛出异常之后
@Around:环绕通知,围绕着方法执行。
具体步骤如下:
i.声明一个方法
ii.在方法前加入@Before注解。
例如:@Before("execution(public int com.spring.test.aop.impl.AtithmeticCalculator.*(int ,int ))")
也可以换成下边范围更广的类型@Before("execution(* com.spring.test.aop.impl.*.*(int ,int ))")
上边这句说明可以返回任意类型的任何方法操作。作用范围更为广泛
④可以让通知访问当前连接点的细节
可以在通知方法中声明一个类型为JoinPoint的参数。然后就能范文链接细节,如方法名称和参数值。如下代码:
@Before("execution(public int com.spring.test.aop.impl.AtithmeticCalculator.*(int ,int ))")
public void beforeMehtod(JoinPoint joint){
String methodName=joint.getSignature().getName();//方法名称
List<Object> args=Arrays.asList(joint.getArgs()); //传入方法中的参数
System.out.println("the methodName:"+methodName+" begin with"+args);
System.out.println("the method begins");
}