横切关注点
通知 Advice
连接点 JointPoint
切入点 Pointcut
切面 Aspect
目标 target
织入 Weaving
AOP代理
@Before
前置通知:在执行目标方法之前运行
@After
后置通知:在目标方法运行结束之后
@AfterReturning
返回通知:在目标方法正常返回值后运行
@AfterThrowing
异常通知:在目标方法出现异常后运行
@Around
环绕通知:在目标方法完成前、后做增强处理 ,环绕通知是最重要的通知类型 ,像事务,日志等都是环绕通知,注意编程中核心是一个ProceedingJoinPoint
,需要手动执行joinPoint.procced()
访问修饰符 返回值类型(必填) 包和类 方法(必填) @Pointcut("execution(public int net.xdclass.sp.service.VideoOrderService.*(..))")
*:匹配任何数量字符 单个;
…:匹配任何数量字符,可以多个,在类型模式中匹配任何数量子包;在方法参数模式中匹配任何数量参数
() 匹配一个不接受任何参数的方法 (..) 匹配一个接受任意数量参数的方法 (*) 匹配了一个接受一个任何类型的参数的方法 (*,Integer) 匹配了一个接受两个参数的方法,其中第一个参数是任意类型,第二个参数必须是Integer类型
常见例子
任意公共方法
execution(public * *(..))
任何一个名字以“save”开始的方法
execution(* save*(..))
VideoService接口定义的任意方法(识别)
execution(* net.xdclass.service.VideoService.*(..))
在service包中定义的任意方法(识别)
execution(* net.xdclass.service.*.*(..))
匹配 service 包,子孙包下所有类的所有方法(识别)
execution(* net.xdclass.service..*.*(..))
步骤:
开启SpringAOP注解配置
@Configuration @ComponentScan("net.xdclass") @EnableAspectJAutoProxy //开启了spring对aspect的支持 public class AnnotationAppConfig { }
配置切入点和通知
@Component @Aspect //告诉spring,这个一个切面类,里面可以定义切入点和通知 public class LogAdvice { //切入点表达式 @Pointcut("execution(* net.xdclass.sp.service.VideoServiceImpl.*(..))") public void aspect(){ } //前置通知 @Before("aspect()") public void beforeLog(JoinPoint joinPoint){ System.out.println("LogAdvice beforeLog"); } //后置通知 @After("aspect()") public void afterLog(JoinPoint joinPoint){ System.out.println("LogAdvice afterLog"); } }
@Configuration @PropertySource(value = {"classpath:config.properties"}) public class CustomConfig { @Value("${server.host}") private String host; @Value("${server.port}") private int port; public String getHost() { return host; } public void setHost(String host) { this.host = host; } public int getPort() { return port; } public void setPort(int port) { this.port = port; } }