Spring的AOP,在不惊动(改动)原有计划(代码)的前提下,想给谁添加功能就给谁添加。这个也就是Spring的理念:
无入侵式/无侵入式
AOP中焦点概念分别指的是什么?
- 毗连点
- 切入点
- 关照
- 关照类
- 切面
下面以一个例子举行解说,直接上代码:
1,设置依赖坐标
- <dependencies>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-context</artifactId>
- <version>6.1.14</version>
- </dependency>
- <dependency>
- <groupId>org.aspectj</groupId>
- <artifactId>aspectjweaver</artifactId>
- <version>1.9.4</version>
- </dependency>
- </dependencies>
复制代码 2,界说接口与实现类
- //接口
- public interface BookDao {
- public void save();
- public void update();
- public void delete();
- public void select();
- }
- //实现类
- @Repository
- public class BookDaoImpl implements BookDao {
- public void save() {
- //记录程序当前执行执行(开始时间)
- Long startTime = System.currentTimeMillis();
- //业务执行万次
- for (int i = 0;i<10000;i++) {
- System.out.println("book dao save ...");
- }
- //记录程序当前执行时间(结束时间)
- Long endTime = System.currentTimeMillis();
- //计算时间差
- Long totalTime = endTime-startTime;
- //输出信息
- System.out.println("执行万次消耗时间:" + totalTime + "ms");
- }
- public void update(){
- System.out.println("book dao update ...");
- }
- public void delete(){
- System.out.println("book dao delete ...");
- }
- public void select(){
- System.out.println("book dao select ...");
- }
- }
复制代码 3,界说关照类和关照、界说切入点、制作切面
- @Component
- @Aspect
- public class MyAdvice {
- @Pointcut("execution(* com.itheima.dao.BookDao.*d*(..))")
- private void pt(){}
- @Around("pt()")
- public Object around(ProceedingJoinPoint pjp) throws Throwable {
- System.out.println("------------------------------");
- Long startTime = System.currentTimeMillis();
- for (int i = 0 ; i<10000 ; i++) {
- //调用原始操作
- pjp.proceed();
- }
- Long endTime = System.currentTimeMillis();
- Long totalTime = endTime-startTime;
- System.out.println("执行万次消耗时间:" + totalTime + "ms");
- return null;
- }
- }
复制代码 解说:
- Pointcut(切入点)
@Pointcut(“execution(* com.itheima.dao.BookDao.*d*(…))”)
这个注解界说了一个切入点,它匹配所有在com.itheima.dao.BookDao类中以d开头的方法的实行。
这里的*表示返回类型可以是任何类型
而(…)表示方法可以接受任意数量和类型的参数
*d*中的第一个星号表示返回值类型不限,d之后的星号表示方法名中必须包罗字母d,但是可以在厥后有其他字符。
- Around Advice(围绕关照)
@Around(“pt()”)
这个注解界说了一个围绕关照,它会在切入点匹配的方法被实行之前和之后实行。
在这个围绕关照中,首先打印了一条分割线,然后记录了开始时间,接着在一个循环中调用了原始方法10000次(pjp.proceed()),末了计算并打印了这10000次调用所耗费的时间。
- ProceedingJoinPoint 是 AspectJ 框架中的一个接口,用于表示围绕关照(@Around)中的毗连点(Join Point)。毗连点是指程序实行过程中的某个特定点,比方方法的调用、异常的抛出等。在围绕关照中,ProceedingJoinPoint 对象提供了访问毗连点信息和控制毗连点实行的本领。
重要功能和方法:
获取毗连点的信息:
getSignature(): 返回毗连点的署名,通常是一个方法署名。
getArgs(): 返回毗连点方法的参数数组。
getTarget(): 返回目的对象,即被增强的对象。
getThis(): 返回署理对象,即当前实行的署理对象。
控制毗连点的实行:
proceed(): 实行毗连点的方法。如果不调用这个方法,毗连点的方法将不会被实行。
proceed(Object[] args): 使用指定的参数数组重新实行毗连点的方法。
4,焦点设置类,开启注解格式AOP功能
- @Configuration
- @ComponentScan("com.itheima")
- @EnableAspectJAutoProxy
- public class SpringConfig {
- }
复制代码 5,运行程序
- public class App {
- public static void main(String[] args) {
- ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
- BookDao bookDao = ctx.getBean(BookDao.class);
- bookDao.select();
- //bookDao.delete();
- //bookDao.update();
- //bookDao.save();
- }
- }
复制代码 运行效果:
- bookDao.select():并没有实行增强功能,由于@Pointcut(“execution(* com.itheima.dao.BookDao.*d*(…))”)中d不包罗select
- bookDao.delete():实行了增强功能
- bookDao.update():实行了增强功能
- bookDao.save():同样没有实行增强功能,由于@Pointcut(“execution(* com.itheima.dao.BookDao.*d*(…))”)中d不包罗save
示例解说概念
(1)前面一直在夸大,Spring的AOP是对一个类的方法在不举行任何修改的前提下实现增强。对于上面的案例中BookServiceImpl中有save,update,delete和select方法,这些方法我们给起了一个名字叫毗连点
(2)在BookServiceImpl的四个方法中,update和delete只有打印没有计算万次实行消耗时间,但是在运行的时间已经有该功能,那也就是说update和delete方法都已经被增强,所以对于需要增强的方法我们给起了一个名字叫切入点
(3)实行BookServiceImpl的update和delete方法的时间都被添加了一个计算万次实行消耗时间的功能,将这个功能抽取到一个方法中,换句话说就是存放共性功能的方法,我们给起了个名字叫关照
(4)关照是要增强的内容,会有多个,切入点是需要被增强的方法,也会有多个,那哪个切入点需要添加哪个关照,就需要提前将它们之间的关系形貌清楚,那么对于关照和切入点之间的关系形貌,我们给起了个名字叫切面
(5)关照是一个方法,方法不能独立存在需要被写在一个类中,这个类我们也给起了个名字叫关照类
至此AOP中的焦点概念就已经介绍完了,总结下:
- 毗连点(JoinPoint):程序实行过程中的任意位置,粒度为实行方法、抛出异常、设置变量等
- 切入点(Pointcut):匹配毗连点的式子
- 在SpringAOP中,一个切入点可以形貌一个具体方法,也可也匹配多个方法
- 一个具体的方法:如com.itheima.dao包下的BookDao接口中的无形参无返回值的save方法
- 匹配多个方法:所有的save方法,所有的get开头的方法,所有以Dao末端的接口中的任意方法,所有带有一个参数的方法
- 毗连点范围要比切入点范围大,是切入点的方法也一定是毗连点,但是是毗连点的方法就不一定要被增强,所以可能不是切入点。
- 关照(Advice):在切入点处实行的操作,也就是共性功能
- 关照类:界说关照的类
- 切面(Aspect):形貌关照与切入点的对应关系。
[阐明]:内容重要来源黑马程序员网上资源学习
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |