Spring Framework --wenyu3

AOP

概念:在不修改原有代码的情况下增强跟主要业务没有关系的公共功能代码到之前写好的方法中的指定位置这种编程的方式叫AOP

AOP: Aspect Oriented Programming面向切面编程

OOP: Object Oriented Programming面向对象编程

AOP分为两种代理模式 动态代理 和 静态代理

动态代理:分为下面两个

面试常问:Aop是这么选择动态代理的两种方式的?
答:
//在没有使用aop的情况下:class cn. wenyu. service.impl.UserServiceImpl
//当使用了aop的情况下:
//class com. sun. proxy.$Proxy19    
//jdk代理所产生的一个动态代理类,当被代理的类实现了接口会默认使用jdk代理
//class cn.wemyu. service.impl.UserServiceImpl$$EnhancerBySpringCGLIB$$f281cf64
//cglib代理所所产生的一个动态代理类,当被代理的类没有实现接口就会使用cglib代理

jdk动态代理:必须保证被代理的类实现了接口

cglib动态代理:不需要接口

 

 

静态代理:在没有修改原有代码的情况下对代码进行增强,一般会有一个代理类。

弊端:需要为每一个需要代理的类创建一个代理类。例如我有10个类要被代理,就要写10个代理类,非常麻烦。

@Aspect:声明为切面

@Component:加入IOC容器,交给Spring管理

设置下面方法在什么时候运行

切入点表达式:例如:@Before("execution(* cn.wenyu. service...(..))“)

表达式解释:如下

 

@Before:声明你要切入的点,前置通知(切名表达式)

@After:在目标方法之后运行:后置通知

@AfterReturning:在目标方法正常返回之后:返回通知

@AfterThrowing:在目标方法抛出异常后开始运行:异常通知

@Around:环绕:环绕通知

AOP概念(来自官网解释)

  • 切面(Aspect): 指关注点模块化,这个关注点可能会横切多个对象。事务管理是企业级Java应用中有关横切关注点的例子。 在Spring AOP中,切面可以使用通用类基于模式的方式(schema-based approach)或者在普通类中以@Aspect注解(@AspectJ 注解方式)来实现。

  • 连接点(Join point): 在程序执行过程中某个特定的点,例如某个方法调用的时间点或者处理异常的时间点。在Spring AOP中,一个连接点总是代表一个方法的执行。

  • 通知(Advice): 在切面的某个特定的连接点上执行的动作。通知有多种类型,包括“around”, “before” and “after”等等。通知的类型将在后面的章节进行讨论。 许多AOP框架,包括Spring在内,都是以拦截器做通知模型的,并维护着一个以连接点为中心的拦截器链。

  • 切点(Pointcut): 匹配连接点的断言。通知和切点表达式相关联,并在满足这个切点的连接点上运行(例如,当执行某个特定名称的方法时)。切点表达式如何和连接点匹配是AOP的核心:Spring默认使用AspectJ切点语义。

  • 引入(Introduction): 声明额外的方法或者某个类型的字段。Spring允许引入新的接口(以及一个对应的实现)到任何被通知的对象上。例如,可以使用引入来使bean实现 IsModified接口, 以便简化缓存机制(在AspectJ社区,引入也被称为内部类型声明(inter))。

  • 目标对象(Target object): 被一个或者多个切面所通知的对象。也被称作被通知(advised)对象。既然Spring AOP是通过运行时代理实现的,那么这个对象永远是一个被代理(proxied)的对象。

  • AOP代理(AOP proxy):AOP框架创建的对象,用来实现切面契约(aspect contract)(包括通知方法执行等功能)。在Spring中,AOP代理可以是JDK动态代理或CGLIB代理。

  • 织入(Weaving): 把切面连接到其它的应用程序类型或者对象上,并创建一个被被通知的对象的过程。这个过程可以在编译时(例如使用AspectJ编译器)、类加载时或运行时中完成。 Spring和其他纯Java AOP框架一样,是在运行时完成织入的。

Spring AOP包含以下类型的通知:(来自官网解释)

  • 前置通知(Before advice): 在连接点之前运行但无法阻止执行流程进入连接点的通知(除非它引发异常)。

  • 后置返回通知(After returning advice):在连接点正常完成后执行的通知(例如,当方法没有抛出任何异常并正常返回时)。

  • 后置异常通知(After throwing advice): 在方法抛出异常退出时执行的通知。

  • 后置通知(总会执行)(After (finally) advice): 当连接点退出的时候执行的通知(无论是正常返回还是异常退出)。

  • 环绕通知(Around Advice):环绕连接点的通知,例如方法调用。这是最强大的一种通知类型, 环绕通知可以在方法调用前后完成自定义的行为。它可以选择是否继续执行连接点或直接返回自定义的返回值又或抛出异常将执行结束。

通知方法的执行顺序

正常执行:@Before--->@After--->@AfterReturning 前置-->方法---后置---返回 异常执行:@Before--->@After--->@AfterThrowing 前置-->方法---后置---异常

AOP切入点表达式支持切点标识符

execution:用于匹配方法执行连接点。这是使用Spring AOP时使用的主要切点标识符,细粒度。 within:只能匹配类这级,只能指定类,类下面的某个具体的方法无法指定,粗粒度。

合并切点表达式:可以使用&&,|和!等符号进行合并操作。也可以通过名字来指向切点表达式。

案例演示

后置通知案例演示:

 

环绕通知案例演示:

 

AOP的xml方式实现:配合注解@Component使用

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值