Spring:AOP面向切面案例解说AOP焦点概念

打印 上一主题 下一主题

主题 1674|帖子 1674|积分 5024

Spring的AOP,在不惊动(改动)原有计划(代码)的前提下,想给谁添加功能就给谁添加。这个也就是Spring的理念:
无入侵式/无侵入式
AOP中焦点概念分别指的是什么?


  • 毗连点
  • 切入点
  • 关照
  • 关照类
  • 切面
    下面以一个例子举行解说,直接上代码:
1,设置依赖坐标

  1. <dependencies>
  2.     <dependency>
  3.       <groupId>org.springframework</groupId>
  4.       <artifactId>spring-context</artifactId>
  5.       <version>6.1.14</version>
  6.     </dependency>
  7.     <dependency>
  8.       <groupId>org.aspectj</groupId>
  9.       <artifactId>aspectjweaver</artifactId>
  10.       <version>1.9.4</version>
  11.     </dependency>
  12.   </dependencies>
复制代码
2,界说接口与实现类

  1. //接口
  2. public interface BookDao {
  3.     public void save();
  4.     public void update();
  5.     public void delete();
  6.     public void select();
  7. }
  8. //实现类
  9. @Repository
  10. public class BookDaoImpl implements BookDao {
  11.     public void save() {
  12.         //记录程序当前执行执行(开始时间)
  13.         Long startTime = System.currentTimeMillis();
  14.         //业务执行万次
  15.         for (int i = 0;i<10000;i++) {
  16.             System.out.println("book dao save ...");
  17.         }
  18.         //记录程序当前执行时间(结束时间)
  19.         Long endTime = System.currentTimeMillis();
  20.         //计算时间差
  21.         Long totalTime = endTime-startTime;
  22.         //输出信息
  23.         System.out.println("执行万次消耗时间:" + totalTime + "ms");
  24.     }
  25.     public void update(){
  26.         System.out.println("book dao update ...");
  27.     }
  28.     public void delete(){
  29.         System.out.println("book dao delete ...");
  30.     }
  31.     public void select(){
  32.         System.out.println("book dao select ...");
  33.     }
  34. }
复制代码
3,界说关照类和关照、界说切入点、制作切面

  1. @Component
  2. @Aspect
  3. public class MyAdvice {
  4.     @Pointcut("execution(* com.itheima.dao.BookDao.*d*(..))")
  5.     private void pt(){}
  6.     @Around("pt()")
  7.     public Object around(ProceedingJoinPoint pjp) throws Throwable {
  8.         System.out.println("------------------------------");
  9.         Long startTime = System.currentTimeMillis();
  10.         for (int i = 0 ; i<10000 ; i++) {
  11.             //调用原始操作
  12.             pjp.proceed();
  13.         }
  14.         Long endTime = System.currentTimeMillis();
  15.         Long totalTime = endTime-startTime;
  16.         System.out.println("执行万次消耗时间:" + totalTime + "ms");
  17.         return null;
  18.     }
  19. }
复制代码
解说:


  • 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功能

  1. @Configuration
  2. @ComponentScan("com.itheima")
  3. @EnableAspectJAutoProxy
  4. public class SpringConfig {
  5. }
复制代码
5,运行程序

  1. public class App {
  2.     public static void main(String[] args) {
  3.         ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
  4.         BookDao bookDao = ctx.getBean(BookDao.class);
  5.         bookDao.select();
  6.         //bookDao.delete();
  7.         //bookDao.update();
  8.         //bookDao.save();
  9.     }
  10. }
复制代码
运行效果:


  • 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):程序实行过程中的任意位置,粒度为实行方法、抛出异常、设置变量等

    • 在SpringAOP中,明白为方法的实行

  • 切入点(Pointcut):匹配毗连点的式子

    • 在SpringAOP中,一个切入点可以形貌一个具体方法,也可也匹配多个方法

      • 一个具体的方法:如com.itheima.dao包下的BookDao接口中的无形参无返回值的save方法
      • 匹配多个方法:所有的save方法,所有的get开头的方法,所有以Dao末端的接口中的任意方法,所有带有一个参数的方法

    • 毗连点范围要比切入点范围大,是切入点的方法也一定是毗连点,但是是毗连点的方法就不一定要被增强,所以可能不是切入点

  • 关照(Advice):在切入点处实行的操作,也就是共性功能

    • 在SpringAOP中,功能终极以方法的情势呈现

  • 关照类:界说关照的类
  • 切面(Aspect):形貌关照与切入点的对应关系。
[阐明]:内容重要来源黑马程序员网上资源学习

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

拉不拉稀肚拉稀

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表