仅作为学习笔记
1. AOP基本概念
连接点:类中可以被增强的方法
切入点:实际被增强的方法
通知:增强的逻辑
切面:把通知注入到切入点的过程(一种动作)
2. AspectJ
AspectJ是一种独立于Spring的框架,实现AOP需要Spring结合AspectJ
实现方式:注解(重点)、xml配置文件
使用前需要引入依赖
3. 切入点表达式
表示对哪个类的哪个方法进行增强
execution([权限修饰符][返回类型][类全路径]方法名)
其中,权限修饰符可省略
例如,对于com.cumt.Book类中,含有add、update方法
//只对add方法进行增强
execution(*com.cumt.Book.add(..))
//对Book类中所有方法增强
execution(*com.cumt.Book.*(..))
//对cumt包下所有类的所有方法增强
execution(*com.cumt.*.*(..))
4.AOP步骤
1、创建一个类(User)
2、创建一个增强类,在该类中声明一些增强的逻辑/通知(UserProxy)
3、在Spring配置文件中开启注解扫描,在增强类中添加注解@Aspect
4、在Spring配置文件中开启代理对象的生成(命名空间Aop)
5、在增强类中,作为通知的方法上添加通知类型的注解AOP切入点表达式
//第一步:创建User类
@Component(value = "user")
public class User {
public int add(int a, int b){
return a+b;
};
public int update(int id){
System.out.println(id);
return id;
}
}
//第二步:创建User的增强类,在类中声明增强方法
public class UserProxy {
public void beforeadd(){
System.out.println("这是add方法之前的增强逻辑");
}
public void afteradd(){
System.out.println("add方法之后的增强逻辑");
}
}
//第三步:在配置文件中,开启注解扫描
//第四步:开启代理对象生成
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<aop:aspectj-autoproxy proxy-target-class="true"> </aop:aspectj-autoproxy>
<context:component-scan base-package="com.cumt.hx">
</context:component-scan>
//在增强类中的通知上配置切入点表达式
@Component
@Aspect
public class UserProxy {
@Before(value = "execution(* com.cumt.hx.aoptest.User.add(..))")
public void beforeadd(){
System.out.println("这是add方法之前的增强逻辑");
}
@After(value = "execution(* com.cumt.hx.aoptest.User.update(..)))")
public void afteradd(){
System.out.println("add方法之后的增强逻辑");
}
}
//测试
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
User user = (User) context.getBean("user");
System.out.println(user.add(2,5));
}
注意点:增强类也需要基于注解来创建对象,否则不会之前通知(在UserProxy类中Component注解也需要,不加不会执行通知方法)