Spring框架基于AspectJ的AOP开发规范和步骤

AOP和动态代理的关系:

Spring框架基于AspectJ的AOP开发规范和步骤_第1张图片

AOP术语:

  1. 横向关注点:
    需要新增的到业务代码中的功能(在目标对象那里叫横切关注点,在切面类中叫通知)
  2. 切面类:
    封装了增强方法(横向关注点)的类
  3. 通知:
    切面类中的每一个增强的方法叫做通知,通知通过切入点表达式作用于连接点上
  4. 目标:
    所抽取出来的代码要作用的对象
  5. 连接点:
    切面要作用到目标对象的具体位置,只能是四个位置,方法执行前,方法执行后,异常捕获后,finilly后.
  6. 切入点(pointcut):
    AOP的切面类通过切入点找到对应的连接点

大白话就是把所有需要增强的方法放在一个类里,该类就是切面类.切面类包含了通知,通知就是需要增强的方法,aop通过切入点表达式让通知作用于指定目标方法的连接点上,可能是方法之前连接点,方法之后连接点.
一个切面中应该包含@Aspect,通知,切入点表达式,才能够作用在连接点上
Spring框架基于AspectJ的AOP开发规范和步骤_第2张图片
切入点表达式的写法:

//第一个 * 代表权限修饰符,返回值
//第二个 * 代表该包下的所有的类
//第三个 * 代表该包下的所有的类的所有方法
//…代表任意的参数列表
//切入到com.sms.spring.aop包下的所有类的所有方法的前面

@Before(value = "execution(* com.sms.spring.aop.*.*(..)")

/*
	@Before:前置通知,作用于方法执行之前 
	@After:后置通知,作用于finally里面
	@AfterReturning返回通知,作用于方法执行之后,搭配切入点表达式returning
	获取方法返回值的变量名,其中方法的形参必须和切入点的参数名一致,形参的类
	型为Object,类型写错则该后置通知不会执行
	 			@AfterReturning(value = "execution(*com.sms.spring.aop.*.*(..)",returning="result")
	@AfterThrowing:异常通知,作用于方法有异常时,搭配切入点表达式throwing获取异常,其中方法的形参必须和切入点的参数名一致
				@AfterThrowing(value="execution(*com.sms.spring.aop.*.*(..)",throwing = "e")  

*/

spring在解析这个切入点表达式之后,执行前置|后置|返回通知时,会将方法的信息封装在JointPoint这个类中:

 public void before(JoinPoint joinpoint) {
		//joinPoint.getArgs():获取方法的参数
		Object[] args = joinpoint.getArgs();
		String methodName = joinpoint.getSignature().getName();
	}

公共切入点写法:@Pointcut

	@Pointcut(value="execution(* com.sms.spring.aop.*.*(..))")
	public void test(){
	}

公共切入点的使用:

	@Before(value="test()")

定义切面作用的优先级:@Order(数字),值越小优先级越高

开发步骤:

①导入jar包,或者直接使用maven导入

需要spring的四个核心jar(core,bean,context,expression)+aopalliance+spring-aop+cglib+spring-aspects+aspectjweaver

②创建spring核心xml文件,并引入aop和context的命名空间

③打开spring的组件扫描和AspectJ动态代理

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:context="http://www.springframework.org/schema/context"   
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
	 	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
	
	<!-- 开启组件扫描 -->
	<context:component-scan base-package="com.sms.spring.aop"></context:component-scan>
	
	<!-- 开启Asceptj的动态代理功能 -->
	<aop:aspectj-autoproxy />
</beans>

④把目标类交给spring管理

给目标类添加@Component注解

⑤把包含增强方法的切面类交给Spring管理并标识 这是个切面类

给切面类添加@Component注解和@Aspect注解

⑥在切面类中写增强方法,并给方法加上前置|后置|返回|异常 通知,编写切入点表达式,将该通知(增强方法)作用到连接点

@Before(value = "execution(* com.sms.spring.aop.*.*(..)")
 public void before(JoinPoint joinpoint) {
		//joinPoint.getArgs():获取方法的参数
}

⑦使用Spring创建代理对象

其中必须得到接口对象,而非实现类对象,因为代理对象和实现类对象实现共同的接口.

ApplicationContext ac= new ClassPathXmlApplicationContext("aop.xml");
MathI mathI = context.getBean("mathImpl", MathI.class);

⑧使用该代理对象调用方法:方法被增强

ApplicationContext ac= new ClassPathXmlApplicationContext("aop.xml");
MathI mathI = context.getBean("mathImpl", MathI.class);
mathI.method();

你可能感兴趣的:(Spring框架总结)