aop常见注解和原理

AOP简介
AOP入门
AOP配置(XML)
AOP配置(注解)
AOP 案例
事务管理(底层也是aop)

AOP简介
1.AOP概念
2.AOP作用
3.AOP优势

AOP概念:
AOP(Aspect Oriented Programing)面向切面编程,一种编程范式,隶属于软工范畴,指导开发者如何组织程序结构
AOP弥补了OOP的不足,基于OOP基础之上进行横向开发
OOP规定程序开发以类为主体模型,一切围绕对象进行,完成某个任务先构建模型
AOP程序开发主要关注基于OOP开发中的共性功能,一切围绕共性功能进行,完成某个任务先构建可能遇到的所有共性功能(当所有功能都开发出来也就没有共性与非共性之分)
oop主要是继承关系,上下级关系
aop围绕共性功能,新增两个模块的共有的功能
aop底层就是动态代理
aop不会重组原来的代码,而是在原来的代码上进行增强

AOP作用
伴随着AOP时代的降临,可以从各个行业的标准化、规范化开始入手,一步一步将所有共性功能逐一开发完毕,最终以功能组合来完成个别业务模块乃至整体业务系统的开发
目标:将软件开发由手工制作走向半自动化/全自动化阶段,实现“插拔式组件体系结构”搭建

AOP优势
提高代码的可重用性
业务代码编码更简洁
业务代码维护更高效
业务功能扩展更便捷

AOP相关概念
Joinpoint(连接点):就是目标类中的所有方法(要增强的类)
Pointcut(切入点):就是挖掉共性功能的方法(真正增强的方法)
Advice(通知):扩展出来的功能方法
Aspect(切面):通知和切入点方法整合到一起
Target(目标对象):就是要增强的方法的某一个类
Weaving(织入):把原有功能和扩展的功能整合到一起,产生代理对象的过程
Proxy(代理):目标对象无法直接完成工作,需要对其进行功能回填,通过创建原始对象的代理对象实现

AOP入门案例
入门案例制作分析
1. 导入依赖
2. 定义UserService接口和实现类
3. 定义扩展功能类MyAdvice,里面定义一个方法
4. 把这两个类都交给spring管理
5. 配置AOP, 把MyAdvice的方法增强到UserServiceImpl的方法上
6. 执行单元测试

AOP配置
先加依赖
<dependency>
  <groupId>org.aspectj</groupId>
 <artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>

在applicationContext.xml
<!--原始的功能要配置成spring控制的资源-->
   <bean id="userService" class="com.itheima.service.impl.UserServiceImpl"/>
   <!--抽取的功能要配置成spring控制的资源-->
<bean id="myAdvice" class="com.itheima.aop.AopAdvice"/>

<!--aop配置-->
<aop:config>
  <!--配置切入点-->
  <aop:pointcut id="pt" expression="execution(* *..*())"/>

    <!--配置切面-->
    <aop:aspect ref="myAdvice">

       <!—通知与切入点之间的关系-->
     <aop:before method="logAdvice" pointcut-ref="pt"/> 
   </aop:aspect>
</aop:config>


切入点
切入点描述的是某个方法
切入点表达式是一个快速匹配方法描述的通配格式,类似于正则表达式

切入点表达式的组成
关键字(访问修饰符 返回值 包名.类名方法名 (参数) 异常名)

关键字:描述表达式的匹配模式
访问修饰符:方法的访问控制权限修饰符 一般省略它不写
类名:方法所在的类(此处可以配置接口名称)
异常:方法定义中指定抛出的异常

切入点表达式——通配符
* :单个独立的任意符号,可以独立出现,也可以作为前缀或者后缀的匹配符出现(1个)
.. :多个连续的任意符号,可以独立出现,常用于简化包名与参数的书写(0或多个)

AOP的通知类型共5种
1.前置通知:原始方法执行前执行,如果通知中抛出异常,阻止原始方法运行
   应用:数据校验 Before 

2.后置通知【最终通知】:原始方法执行后执行,无论原始方法中是否出现异常,都将执行通知
   应用:现场清理 After

3.返回后通知:原始方法正常执行完毕并返回结果后执行,如果原始方法中抛出异常,无法执行
   应用:返回值相关数据处理 AfterReturning

4.抛出异常后通知:原始方法抛出异常后执行,如果原始方法没有抛出异常,无法执行
   应用:对原始方法中出现的异常信息进行处理  AfterThrowing

5.环绕通知:在原始方法执行前后均有对应执行执行,还可以阻止原始方法的执行
   应用:十分强大,可以做任何事情    Around

  环绕增强比较特殊:需要我们在这个增强的方法里面手动调用目标方法(就是要增强的方法)
                   这样就可以在调用的前后再写其他的代码,形参环绕的效果了
     具体步骤:
          1.方法参数要声明一个ProceedingJoinPoint的参数
          2.在环绕方法里面,使用参数来调用目标方法
          3.环绕增强,不仅可以调用目标方法(joinPoint.proceed)、操控目标方法的参数(joinPoint.getArgs())、还得到目标方法执行结束的返回值(也要目标方法有返回值才行)


总结:
在spring中使用@Service等注解,需要在xml中开启ioc和DI开关<context:component-scan base-package="com.itheima"/>
在spring中使用aop的注解需要在xml中开启aop开关:<aop:aspectj-autoproxy/>
面向切面编程,在不改变源码的前提下,完成原有功能的升级扩展

 AOP配置(注解)

快速入门操作:
导入坐标(伴随spring-context坐标导入已经依赖导入完成)
开启AOP注解支持
配置切面@Aspect
定义专用的切入点方法,并配置切入点@Pointcut
为通知方法配置通知类型及对应切入点@Before

@Aspect:类上定义,设置当前类为切面类
@Before:方法上定义,标注当前方法作为前置通知(增强的方法)
@Pointcut:方法上定义,使用当前方法名作为切入点引用名称(要增强的方法)
@After:
@AfterReturning:
@AfterThrowing:
@Around:切入点,增强的方法
@EnableAspectJAutoProxy:用在配置类上,设置当前类开启AOP注解驱动的支持,加载AOP注解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值