Spring中aop概念以及用法

来源:互联网 发布:道路横断面效果图软件 编辑:程序博客网 时间:2024/05/27 20:29

一、Aop概念

在软件行业,AOP为Aspect Oriented Programming的缩写,意思是面向切面编程。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一种重要思想。

利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的重用性,同时提高开发的效率。

二、Spring中的AOP概念

1.spring能够为容器中管理的对象生成动态代理对象,能帮助我们生成动态代理对象

2.spring实现aop的原理

(1)动态代理(被代理的对象必须实现接口,这样才能创建代理对象)

(2)cglib代理(第三方代理技术,可以对任何类生成代理,代理的原理是对目标对象进行继承代理)

3.aop名词学习

(1)JoinPoint(连接点):在目标对象中,所有可以增强的方法

(2)PointCut(切入点):目标对象中已经增强的方法

(3)Advice(通知):增强的代码

(4)Target(目标对象):被代理的对象

(5)Weaving(织入):将通知应用到切入点的过程

(6)Proxy(代理):将通知织入到目标对象后,形成代理对象

(7)Aspect(切面):切入点+通知

4.使用AOP的步骤

(1)导包(spring-aspect、spring-aop、aopallience以及weaver包)

(2)准备目标对象

(3)准备通知

(4)配置进行织入目标对象中

三、通知分类

1.前置通知:目标方法运行之前调用

2.后置通知(出现异常不会调用):目标方法运行之后调用

3.环绕通知:目标方法运行前后都会调用

注意:环绕通知是最特殊的一种通知,需要在通知中自己调用目标方法

在环绕通知的方法参数中传递ProceedingJoinPoint类型的对象,然后在方法中使用此对象的proceed方法返回Object对象进行返回

四、使用注解来配置aop

1.使用方法


(1)首先需要在applicationContext.xml文件中开启注解配置,使用标签

<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

(2)然后在通知中进行如下配置:

package com.sgr.annotationaop;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.After;import org.aspectj.lang.annotation.AfterReturning;import org.aspectj.lang.annotation.AfterThrowing;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;@Aspectpublic class MyAdvice {//前置通知@Before("execution(* com.sgr.service.*Service.*(..))")public void before() {System.out.println("这是前置通知");}//后置通知@AfterReturning("execution(* com.sgr.service.*Service.*(..))")public void afterReturning() {System.out.println("这是后置通知");} //环绕通知,最特别的一个通知,他需要控制目标方法的调用,因为需要在目标方法的调用之前和之后都需要调用@Around("execution(* com.sgr.service.*Service.*(..))")public Object around(ProceedingJoinPoint pjp) throws Throwable {System.out.println("这是环绕通知之前的部分");Object proceed = pjp.proceed();//调用目标方法System.out.println("这是环绕通知之后的部分");return proceed;}//异常通知@AfterThrowing("execution(* com.sgr.service.*Service.*(..))")public void afterException() {System.out.println("出事情了");}//后置通知@After("execution(* com.sgr.service.*Service.*(..))")public void after() {System.out.println("这是后置通知,出现异常也会调用");}} 



原创粉丝点击