1.理解切面编程的思想 ---首先,先得有类,我们可以将该类中的非业务的核心代码部分提取出来 ---例如,在该项目中有多个类对象,我想要在所有的类对象的第一个方法前输出一句话 ---这时候所有的对象类的第一个方法就是一个连接点(JIONPoint) ---我们要将一句话输出,所以需要定义一个方法来输出这句话,那么这个方法就叫做通知(Advice) ---定义该通知的类叫做切面(Aspect),有了切面之后我们就可以将该切面的通知插入到我们所需要的地方 ---所以我们还需要给该切面提供一个位置,就是我们需要将它插入在哪个方法,这时就需要一个切入点(PointCut)来给切面指明位置 ---经过该过程后就可以将一段代码插入至某个类中而不影响该类的核心业务 ---(这只是Aop编程的思想,还有我们需要注意的细节) ---我们首先需要保证切面(Aspect)和连接点(JIONPoint)的类对象必须要交给spring容器管理
2.基于注解实现切面
首先,基于Maven创建一个项目,引入spring依赖,和Aspect依赖
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.23</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>5.3.26</version> </dependency>
创建一个简单的接口以及实现类,以及spring配置类和切面类。
接口定义:
public interface UserMapper {
public void addUser(String name,String sex);
}
实现类:
public class UserMapperImpl implements UserMapper {
public UserMapperImpl() {
System.out.println("UserMapperImpl----被创建");
}
public void addUser(String name,String sex){
System.out.println("addUser被执行");
// throw new RuntimeException();
}
}
定义配置类:
通过注解你需要将你的切面(Aspect),连接点(JOINPoint)交给spring管理
@Configuration
@ComponentScan({"com.jiazhong.aop", "com.jiazhong.mapper"})
public class MyApp {
}
定义切面:(定义切面需要@Aspect注释,添加到该类的声明之前)
再切点内定义通知(Advice)和切点(PointCut)
@Aspect
public class MyAspect {
/*定义切点,*/
@Pointcut("execution(void com.jiazhong.mapper.UserMapper.addUser(String,String))")
public void myPointCut(){}
/*定义通知*/
@Before("myPointCut()")
public void advice1(){
System.out.println("前置通知被执行");
}
}
3.通知类型(前置、后置、异常、最终、环绕)
通过注解实现:
前置:@Before、后置:@AfterRuning、异常:@AfterThrowing、最终:@After、
环绕:@Around
4.切点表达式
execution(访问修饰符 返回值类型 包名.子包名.类名.方法名(参数))