AOP_小白笔记

相关概念:

  1. Joinpoint (连接点):就是方法
  2. Pointcut(切入点):就是那些被拿去共有功能代码的方法
  3. Advice(通知):就是那些被拿走的共有功能的代码,最后会以方法的形式呈现
  4. Aspect(切面):就是通知和切入点的结合关系
  5. Target(目标对象):就是挖掉功能的方法对应的类产生的对象,这种对象无法完成最终的功能的
  6. Weaving(织入):把通知与切入点结合的过程
  7. Proxy(代理):目标对象无法直接完成工作,需要对其进行功能回填,通过创建原始对象的代理对象实现
  8. Introduction(引入/引介) :就是对原始对象无中生有的添加成员变量或成员方法

AOP开发过程:

开发阶段

  1. 正常的制作程序
  2. 将非共有功能开发到对应的目标对象类中,并制作成切入点方法
  3. 将共有功能独立开发出来,制作成通知
  4. 在配置文件中,声明切入点
  5. 在配置文件中,声明切入点与通知间的关系(含通知类型),即切面

运行阶段:

  1. Spring容器加载配置文件,监控所有配置的切入点方法的执行
  2. 当监控到切入点方法被运行,使用代理机制,动态创建目标对象的代理对象,根据通知类别,在代理对象的对应位置将通知对应的功能织入,完成完整的代码逻辑并运行

Maven工程中需引入的依赖:

<dependency>
	<groupId>org.aspectj</groupId>
	<!--AOP所需依赖-->
	<artifactId>aspectjweaver</artifactId>
	<version>1.9.4</version>
</dependency>

eg栗子:

<!--aop配置:aop:config标签,作用是设置AOP--> 
<aop:config>
	<!--配置切入点:aop:pointcu作用是配置切入点,就是被拿走共有功能代码的方法--> 
	<aop:pointcut id="pt" expression="execution(* *..*())"/>
		<!--配置切面:aop:aspect作用是设置具体的AOP通知对应的切入点,ref引用的是通知的bean--> 
		<aop:aspect ref="myAdvice">
			<!—通知与切入点之间的关系:关系有五种,前置,后置,环绕,返回后通知,抛出异常后通知:aop:before标签就是配置的前置通知,method就是通知,即增强的方法--> 
			<aop:before method="logAdvice" pointcut-ref="pt"/>
		</aop:aspect>
</aop:config>

切入点表达式:

  1. 关键字:
    1. execution :匹配执行指定方法
    2. args :匹配带有指定参数类型的方法
    3. …以上两个为常用
  2. 通配符
    1. *:代表单个独立的任意符号,可以独立出现,也可以作为前缀或者后缀的匹配符出现
    2. …:多个连续的任意符号,可以独立出现,常用于简化包名与参数的书写
    3. +:专用于匹配子类类型
  3. 逻辑运算符
    1. && :连接两个切入点表达式,表示两个切入点表达式同时成立的匹配
    2. || :连接两个切入点表达式,表示两个切入点表达式成立任意一个的匹配
    3. :连接单个切入点表达式,表示该切入点表达式不成立的匹配

通知类型:

  1. 前置通知:原始方法执行前执行,如果通知中抛出异常,阻止原始方法运行
  2. 后置通知:原始方法执行后执行,无论原始方法中是否出现异常,都将执行通知
  3. 返回后通知:原始方法正常执行完毕并返回结果后执行,如果原始方法中抛出异常,无法执行
  4. 抛出异常后通知:原始方法抛出异常后执行,如果原始方法没有抛出异常,无法执行
  5. 环绕通知:在原始方法执行前后均有对应执行执行,还可以阻止原始方法的执行

AOP注解配置:

  1. 要导入spring-contex坐标
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.1.13.BUILD-SNAPSHOT</version>
    </dependency>

开启AOP注解支持

<aop:aspectj-autoproxy/>

或者在spring配置类定义上面,写上注解:@EnableAspectJAutoProxy

  1. @Aspect:写在通知类的定义上面,作用是设置当前类为切面类
  2. @Pointcut😦@Pointcut(“execution(* *(…))”)写在方法定义上面,作用是把当前方法的方法名作为切点引入名称.被修饰的方法忽略其业务功能,格式设定为无参无返回值的方法,方法体内空实现(非抽象)

以下为通知注解

  1. @Before,写在方法定义上面,表示当前方法为前置通知,后面括号要引入楼 @Pointcut所标注的方法名,举个栗子rg:@Before("pt()") public void before(){ }.后面的通知也一样都要引入切入点
  2. @After:后置通知
  3. @Around:环绕通知
  4. @AfterReturning:返回后通知,这个比上面的多了特殊参数,🙂 returning :设定使用通知方法参数接收返回值的变量名
    eg:@AfterReturning(value="pt()",returning = "ret") public void afterReturning(Object ret) { }
  5. @AfterThrowing:异常后通知,它也有特殊参数:throwing :设定使用通知方法参数接收原始方法中抛出的异常对象名
    eg:@AfterThrowing(value="pt()",throwing = "t") public void afterThrowing(Throwable t){ }

java小白的笔记_有错的地方的话请大佬指正.感谢.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值