Spring学习杂记(AOP)

AOP介绍

AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能。日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性、异常处理和透明的持续性也都是如此,这种散布在各处的无关的代码被称为横切(cross cutting),在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。

AOP技术恰恰相反,它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。

在Spring中使用AOP

1、导入jar包

2、开启基于注解的AOP功能

<aop:aspectj-autoproxy />

3、声明一个切面类,并把这个切面类加入到IOC容器中

@Aspect  表示这是一个切面类@Component  加入IOC容器

4、在切面类中声明通知方法

[1]前置通知:@Before

[2]返回通知:@AfterReturning

[3]异常通知:@AfterThrowing

[4]后置通知:@After

[5]环绕通知:@Around :环绕通知是前面四个通知的集合体!

通知中需要加入切入点表达式

5、切入点表达式

execution([权限修饰符] [返回值类型] [简单类名/全类名] [方法名]([参数列表]))

表达式

execution(* com.atguigu.spring.ArithmeticCalculator.*(..))

含义

ArithmeticCalculator接口中声明的所有方法。

第一个“*”代表任意修饰符及任意返回值。

第二个“*”代表任意方法。

..”匹配任意数量、任意类型的参数。

若目标类、接口与该切面类在同一个包中可以省略包名

权限是不支持写通配符的 ,可以写一个*表示所有权限所有返回值6、统一声明切入点表达式
     @Pointcut(value= "execution(public int com.atguigu.aop.target.EazyImpl.add(int,int))")
     public void myPointCut(){}

后面在通知中value赋值为方法名()即

6、被代理的对象也需要加入IOC容器

7、通知方法的细节

①在通知中获取目标方法的方法名和参数列表

[1]在通知方法中声明一个JoinPoint类型的形参

[2]调用JoinPoint对象的getSignature()方法获取目标方法的签名

[3]调用JoinPoint对象的getArgs()方法获取目标方法的实际参数列表

②在返回通知中获取方法的返回值

[1]在@AfterReturning注解中添加returning属性

@AfterReturning (value="myPointCut()", returning= "result")

[2]在返回通知的通知方法中声明一个形参,形参名和returning属性的值一致

showReturnLog(JoinPoint joinPoint, Object result)

③在异常通知中获取异常对象

[1]在@ AfterThrowing注解中添加throwing属性

@AfterThrowing (value="myPointCut()",throwing= "throwable" )

[2]在异常通知的通知方法中声明一个形参,形参名和throwing属性值一致

showExceptinLog(JoinPoint joinPoint, Throwable throwable)

8、根据接口类型获取target对象时,实际上真正放在IOC容器中的对象是代理对象,而并不是目标对象本身

9、环绕通知:@Around

环绕通知需要在方法的参数中指定JoinPoint的子接口类型ProceedingJoinPoint为参数
②调用目标方法 result = joinPoint.proceed(args);

10、切面的优先级

在切面类上通过@Order (value=50)注解来进行设置,值越小优先级越高

11、XML配置AOP

<!-- 1.将需要加载到IOC容器中的bean配置好 -->
	<bean id="logAspect" class="com.neuedu.aop.proxy.LogAspect"></bean>
	<bean id="txAspect" class="com.neuedu.aop.target.TxAspect"></bean>
	<bean id="calculator" class="com.neuedu.aop.target.MathCalculatorImpl"></bean>
	
	<!-- 2.配置AOP,需要导入AOP名称空间 -->
	<aop:config>
	   <!-- 声明切入点表达式 -->
	   <aop:pointcut expression="execution(* com.neuedu.aop.target.MathCalculatorImpl.*(..))" id="myPointCut"/>
	   <!-- 配置日志切面类,引用前面的类 ,通过order属性控制优先级-->
	   <aop:aspect ref="logAspect" order="25">
	  	 	<!-- 通过method属性指定切面类的切面方法,通过pointcut-ref指定切入点表达式 -->
	   		<aop:before method="showBeginLog" pointcut-ref="myPointCut"/>
	   		<aop:after method="showAfterLog" pointcut-ref="myPointCut"/>
	   		<aop:after-throwing method="showExceptionLog" pointcut-ref="myPointCut" throwing="ex"/>
	   		<aop:after-returning method="showReturnLog" pointcut-ref="myPointCut" returning="result"/>
	   		<aop:around method="around" pointcut-ref="myPointCut"/>
	   </aop:aspect>
	   
	   	   <!-- 配置事务切面类,引用前面的类 -->
	   <aop:aspect ref="txAspect" order="20">
	   		<aop:around method="around" pointcut-ref="myPointCut"/>
	   </aop:aspect>
	</aop:config>






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值