AOP
1.AOP简介
2.AOP核心概念
- 2.1连接点
(JoinPoint):程序执行过程中的任意位置,粒度为执行方法,抛出异常,设置变量等
在SpringAOP中,理解为方法的执行
切入点(Pointcut):匹配连接点的式子
在SpringAop中,一个切入点可以只描述一个具体方法,也可以匹配多个方法
- 2.2一个具体方法
一个具体方法:com.hcx.dao包下的BookDao接口中的无形参返回值的save方法
匹配多个方法,所有的save方法,所有的get开头的方法,所有以Dao结尾的接口中的任意方法,所有带有一个参数的方法
-2.3 - 通知(Advice)
通知(Advice):在切入点处执行的操作,也就是共性功能
在Spring中,功能最终以方法的形式呈现
-2.4 通知类
通知类:定义通知的类
切面(Aspect):描述通知与切入点的对应关系
3.AOP注解开发版
3.1
package com.shangyacong.config; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.EnableAspectJAutoProxy; import org.springframework.stereotype.Component; @Configuration @ComponentScan("com.shangyacong") @EnableAspectJAutoProxy//表示注解开发AOP public class SpringConfig { }
这个是AOP的SpringConfig配置类
@Configuration注解表示这是一个配置类
@ComponentScan(“com.shangyacong”)表示要扫描com.shangyacong下的包
@EnableAspectJAutoProxy表示用注解开发AOP使其能进入aop包下的通知类能扫描他并生成bean
3.2
package com.shangyacong.dao; import org.springframework.stereotype.Component; public interface BookDao { public void save(); public void select(); }
这是一个接口里面有两个方法再继承接口时必须实现方法
3.3
package com.shangyacong.dao; import org.springframework.stereotype.Component; import org.springframework.stereotype.Repository; @Repository public class BookDaoImpl implements BookDao{ public void save(){ System.out.println(System.currentTimeMillis()); System.out.println("book dao save..."); } public void select() { System.out.println("book dao select..."); } }
这是一个实现类并继承了一个BookDao的接口里面重写了接口的方法
3.4
package com.shangyacong; import com.shangyacong.config.SpringConfig; import com.shangyacong.dao.BookDaoImpl; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import com.shangyacong.dao.BookDao; public class APP { public static void main(String[] args) { ApplicationContext applicationContext=new AnnotationConfigApplicationContext(SpringConfig.class); BookDao bookDao= applicationContext.getBean(BookDao.class); bookDao.select(); } }
ApplicationContext applicationContext=new AnnotationConfigApplicationContext(SpringConfig.class);
这行代码时获取配置文件
BookDao BookDao= applicationContext.getBean(BookDao.class);这行是从IOC容器中获取BookDao类型的Bean
下面是调用select方法
我们可以看到在select方法中什么都没有,只有一句打印
3.5
package com.shangyacong.aop; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.stereotype.Component; @Component @Aspect public class MyAdvice { @Pointcut("execution(void com.shangyacong.dao..select())") private void pt(){} @Around("pt()") public Object Around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { System.out.println("before advice"); Object object= proceedingJoinPoint.proceed(); System.out.println(System.currentTimeMillis()); System.out.println("after advice"); return object; } }
以上代码是一个基本的 Spring AOP 切面的实现示例:
@Component
注解标识该类为 Spring 组件,它会被 Spring 扫描并纳入到 Spring 容器中管理。@Aspect
注解标识该类为切面类,告诉 Spring 它包含切点和通知。MyAdvice
类定义了一个切面,其中包含了一个切点和一个环绕通知。@Pointcut
注解定义了一个切点,该切点匹配了com.shangyacong.dao
包下的所有select()
方法的执行。这里使用了 AspectJ 的切点表达式语法来定义切点。Around
方法标记了一个环绕通知,它会在切点匹配的方法执行前后执行。- 在
Around
方法中,首先输出 “before advice”,表示在目标方法执行前执行的逻辑。 proceedingJoinPoint.proceed()
调用了目标方法的执行,实际上启动了目标方法的执行过程。Object object= proceedingJoinPoint.proceed();
语句执行目标方法,并将返回值保存在object
变量中。- 在目标方法执行完成后,输出当前时间戳(
System.currentTimeMillis()
)和 “after advice”,表示在目标方法执行后执行的逻辑。 - 最后,返回目标方法的执行结果。
这段代码通过切面 MyAdvice
定义了一个环绕通知,该通知会在匹配的目标方法执行前后分别输出 “before advice” 和 “after advice”,并输出当前时间戳。