初识Spring-AOP

初识Spring-AOP

什么是AOP

Spring-AOP是一种动态编译期增强性AOP的实现, 与IOC进行整合,不是全面的切面框架 与动态代理相辅相成

  • AOP(Aspect-oriented programming)是面向切面的编程。
  • Spring框架中一个重要内容可与提高代码的灵活性和可拓展性
  • 函数式编程的一种衍生范型,利用AOP可以对业务逻辑的各个部分进行隔离

目标类 + 额外功能 = 代理类

  1. 通过spring AOP的代理功能,给代码增加额外的通用功能

  2. 业务逻辑就专心的处理实际需求,通用的增强功能独立出来

  3. 代理的专业术语

    额外功能叫 增强

    目标类叫 切入点 或 切面

    将增强 加入到 切入点,叫编织

主要功能:
  • 日志记录,性能统计,安全控制,事务处理,异常处理等等。
切面:
  • 切面(Aspect) :通知和切入点共同组成了切面,时间、地点和要发生的"故事"。
切入点:
  • 通知定义了切面要发生的"故事"和时间,那么切入点就定义了“故事”发生的地点,例如某个类或方法的名称。
目标对象:

即被通知的对象。

编织:
<!--AOP配置  编织-->
		<aop:config>
			<!--指定切入点  面 (* com.gxy.service.ProductService.*(..)) -->
			<!--编织 -->
			<!--前置增强 -->
			<aop:advisor advice-ref="myBeforeAdvice" pointcut-ref="myPoinCut"/> -->
			<!--后置增强 -->
			<aop:advisor advice-ref="myAfterAdvice" pointcut-ref="myPoinCut"/> -->
			<!--异常增强 -->
			<aop:advisor advice-ref="myThrowsAdvice" pointcut-ref="myPoinCut"/> -->
			<!--环绕增强 -->
			<aop:advisor advice-ref="myInterceptor" pointcut-ref="myPoinCut"/>
		</aop:config>
额外功能:

增强

  • 前值增强:
    表示在目标方法执行前实施增强。
public class MyBeforeAdvice implements MethodBeforeAdvice{
	//前置增强
	@Override
	public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {
		System.out.println("this is 前置增强") ;
		//获取目标方法名称
		String method = arg0.getName();
		System.out . println("the method:"+method);
		//获取目标方法参数的实参列表
		for(int i=0; i<arg1. length;i++) {
			System.out.println("the arg1:"+arg1[i]);
		}
		//获取目标实现类的类路径
		System.out.println("the arg2:"+arg2. getClass());
	}

}

  • 后置增强:
    表示目标方法在执行后实施增强
public class MyAfterAdvice implements AfterReturningAdvice{
	
	@Override
	public void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3) throws Throwable {
		System.out.println("this is 后置增强");
		//获取反参参数的类型
		System.out.println("the arg0:"+arg0.getClass());
		System.out.println("the arg1:"+arg1.getName());
		//获取目标方法参数的实参列表
		for(int i=0;i<arg2. length;i++) {
			System.out.println("the arg2:"+arg2[i]);
		}
		//获取目标实现类的类路径
		System.out.println("the arg3:"+arg3.getClass());
		}

}
  • 环绕增强:
    表示目标方法执行前后实施增强
public class MyInterceptor implements MethodInterceptor{

	@Override
	public Object invoke(MethodInvocation arg0) throws Throwable {
		System. out. println("this is 环绕增强");
		//获取目标实现类对象
		System.out.println("arg0.getThis()"+arg0.getThis().getClass().toString());
		//获取目标方法名
		System.out.println("arg0.getMethod():"+arg0.getMethod().getName());
		//获取目标方法参数的实参列表
		Object[] arguments = arg0.getArguments();
		for(int i=0; i<arguments .length;i++) {
			System.out . println("arg0.getArguments():"+arguments[i]);
		}
		//由于启动了环绕增强,目标类的方法将不会被执行,而被. proceed职代,并返回目标类的反参
		//执行目标方法
		Object object = arg0.proceed();
		return object;
	}
  • 异常增强:
    表示目标方法抛出异常后实施增强
public class MyThrowsAdvice implements ThrowsAdvice{
	//异常增强
	public void afterThrowing(Method method, Object[] args, Object target,Exception ex){
		System.out.println(target+"里面的"+method.getName()+"产生了"+ ex.getMessage());
		
	}
}

总结:

AOP是spring框架的重要组成部分。AOP是以另一个角度来考虑程序结构,通过分析程序结构的关注点来完善面向对象编程(OOP)。OOP将应用程序分解成各个层次的对象,而AOP将程序分解成多个切面。spring AOP 只实现了方法级别的连接点,在J2EE应用中,AOP拦截到方法级别的操作就已经足够。在spring中,未来使IOC方便地使用健壮、灵活的企业服务,需要利用spring AOP实现为IOC和企业服务之间建立联系。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页