相关概念:
- Joinpoint (连接点):就是方法
- Pointcut(切入点):就是那些被拿去共有功能代码的方法
- Advice(通知):就是那些被拿走的共有功能的代码,最后会以方法的形式呈现
- Aspect(切面):就是通知和切入点的结合关系
- Target(目标对象):就是挖掉功能的方法对应的类产生的对象,这种对象无法完成最终的功能的
- Weaving(织入):把通知与切入点结合的过程
- Proxy(代理):目标对象无法直接完成工作,需要对其进行功能回填,通过创建原始对象的代理对象实现
- Introduction(引入/引介) :就是对原始对象无中生有的添加成员变量或成员方法
AOP开发过程:
开发阶段
- 正常的制作程序
- 将非共有功能开发到对应的目标对象类中,并制作成切入点方法
- 将共有功能独立开发出来,制作成通知
- 在配置文件中,声明切入点
- 在配置文件中,声明切入点与通知间的关系(含通知类型),即切面
运行阶段:
- Spring容器加载配置文件,监控所有配置的切入点方法的执行
- 当监控到切入点方法被运行,使用代理机制,动态创建目标对象的代理对象,根据通知类别,在代理对象的对应位置将通知对应的功能织入,完成完整的代码逻辑并运行
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>
切入点表达式:
- 关键字:
- execution :匹配执行指定方法
- args :匹配带有指定参数类型的方法
- …以上两个为常用
- 通配符
- *:代表单个独立的任意符号,可以独立出现,也可以作为前缀或者后缀的匹配符出现
- …:多个连续的任意符号,可以独立出现,常用于简化包名与参数的书写
- +:专用于匹配子类类型
- 逻辑运算符
- && :连接两个切入点表达式,表示两个切入点表达式同时成立的匹配
- || :连接两个切入点表达式,表示两个切入点表达式成立任意一个的匹配
- :连接单个切入点表达式,表示该切入点表达式不成立的匹配
通知类型:
- 前置通知:原始方法执行前执行,如果通知中抛出异常,阻止原始方法运行
- 后置通知:原始方法执行后执行,无论原始方法中是否出现异常,都将执行通知
- 返回后通知:原始方法正常执行完毕并返回结果后执行,如果原始方法中抛出异常,无法执行
- 抛出异常后通知:原始方法抛出异常后执行,如果原始方法没有抛出异常,无法执行
- 环绕通知:在原始方法执行前后均有对应执行执行,还可以阻止原始方法的执行
AOP注解配置:
- 要导入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
- @Aspect:写在通知类的定义上面,作用是设置当前类为切面类
- @Pointcut😦@Pointcut(“execution(* *(…))”)写在方法定义上面,作用是把当前方法的方法名作为切点引入名称.被修饰的方法忽略其业务功能,格式设定为无参无返回值的方法,方法体内空实现(非抽象)
以下为通知注解
- @Before,写在方法定义上面,表示当前方法为前置通知,后面括号要引入楼 @Pointcut所标注的方法名,举个栗子rg:
@Before("pt()") public void before(){ }
.后面的通知也一样都要引入切入点 - @After:后置通知
- @Around:环绕通知
- @AfterReturning:返回后通知,这个比上面的多了特殊参数,🙂 returning :设定使用通知方法参数接收返回值的变量名
eg:@AfterReturning(value="pt()",returning = "ret") public void afterReturning(Object ret) { }
- @AfterThrowing:异常后通知,它也有特殊参数:throwing :设定使用通知方法参数接收原始方法中抛出的异常对象名
eg:@AfterThrowing(value="pt()",throwing = "t") public void afterThrowing(Throwable t){ }
java小白的笔记_有错的地方的话请大佬指正.感谢.