aspectJ实现aop操作,引入jar包和约束:
链接:https://pan.baidu.com/s/1dESiSVYNdx_H44B7koslkw
提取码:42tb
配置文件形式:
先创建两个方法Book(被增强类)和MyBook(增强类),aop就是不改变源码实现增强类应用到被增强类上,实现方法的增强。
(1)先创建Book和MyBook的bean对象
<bean id="book" class="aspectj.Book"></bean>
<bean id="mybook" class="aspectj.MyBook"></bean>
(2)前提要引入AOP的约束 然后下面写的是增强的操作:
全部要写在<aop:config></aop:config>里
<aop:config>
(3)一共有两部 第一步 配置切入点: 切入点:那个被增强类的对象 这里的Book是被增强
<aop:pointcut expression="execution(* aspectj.Book.*(..))" id="pointcut1"/>
这里的pointcut:意思是切入点的意思 point:点 cut:切入 expression:这里的意思是要写一个函数表达式的格式
后面的id 意思把切入点起一个名字
(4)第二步 配置切面 切面:就是把 增强 应用到方法上面去
<aop:aspect ref="mybook">
aspect:切面的意思 后面跟的ref:意思是 指定那个增强 写的是那个 增强类 的对象 这里的MyBook是增强类
<!--后面在配置增强的类型 是前置还是后置...-->
<aop:before method="before1" pointcut-ref="pointcut1"/>
before:前置的类型
method:方法的意思 这里的意思是 增强的方法是哪一个? 另一种理解 在增强类里面使用哪一个方法作为前置增强
pointcut-ref:意思是把哪一个增强应用到切入点上 如果不写 只是显示增强 并没有应用方法上
</aop:aspect>
</aop:config>
execution常用的表达式:
常用的表达式
execution(<访问修饰符>?<返回类型><方法名>(<参数>)<异常>)
*:任意的什么public private 后面加空格 后面写要增强 方法 的全路径 (..):的意思是里面有参数也包括
(1)execution(* cn.itcast.aop.Book.add(..))
(2)execution(* cn.itcast.aop.Book.*(..)) *(..):表示类中所有方法要增强
(3)execution(* *.*(..)) *。*(..)所有类中 所有方法要增强
(4)execution(* save*(..)) save*(..)方法是save开头的都增强 例如:saveadd()
写一个单词execution()
做法 例如:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 添加约束 -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- bean definitions here -->
<bean id="book" class="aspectj.Book"></bean>
<bean id="mybook" class="aspectj.MyBook"></bean>
<!-- 配置aop操作 -->
<aop:config>
<!-- 配置切入点 -->
<aop:pointcut expression="execution(* aspectj.Book.*(..))" id="pointcut1"/><!-- expression:表达式的意思 id:的意思是给切入点起个名字-->
<!-- 配置切面 :把增强应用到具体方法上面的过程为切面 把哪个增强用到切入点上-->
<aop:aspect ref="mybook"><!-- ref="里面写的是哪个增强 是增强的对象" -->
</aop:config>
</beans>
注解形式:
第一步:配置<bean>并创建增强和被增强的对象 也可以用注解的方式配置
第二步:配置aop的一个事务的管理 相当于开启注解扫描
<!-- 开启aop操作 这里也就是开启注解 autoproxy:自动代理 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy> 很好记因为是aop用到的是aspectj所以<aop:aspectj 直接找就可以
(1)然后配置增强类 因为被增强类的代码不能动
配置 之前要先写一个注解 @Aspect 就相当于开启了一个增强的配置
@Aspect
public class MyBook2 {
(2)随后是配置 那个 方法 上 的 那个 通知属性
@Before(value="execution(* aspectj.Book2.*(..))")
public void before1() {
System.out.println("前置增强");
}
例如:同理//@Before(value="execution(* aspectj.Book2.*(..))")
做法 例如:MyBook2是增强类
package aspectj;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class MyBook2 {
@Before(value="execution(* aspectj.Book2.*(..))")
public void before1() {
System.out.println("前置增强");
}
}
其他通知:
配置环绕通知:
<!-- 配置环绕通知 -->
<aop:around method="around1" pointcut-ref="pointcut1"/> 这些于其他配置都一样
不同的地方是
//环绕通知 ProceedingJoinPoint: 该方法里面可以加参数进行调用该方法 利用里面的对象可以调用 被 增强的方法 add()方法
public void around1(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
//方法之前
System.out.println("环绕之前");
//执行被增强的方法
proceedingJoinPoint.proceed();//可以调用被增强的方法 就是add()方法 不用set什么的调用或private引入类
//方法之后
System.out.println("环绕之后");
}
通知优先级:
前置通知
环绕通知方法前
方法
环绕通知方法后
后置通知