AOP知识

学习目标:

  • 掌握 AOP知识

学习内容:

  1. 了解AOP的概念
  2. AOP入门案例
  3. 百度网盘分享链接输入密码空格处理

学习时间:

  • 周一8:30-18:00

学习产出:

1、AOP的概念–面向切面编程,一种编程范式,无侵入式

核心概念:
1)连接点(JoinPoint):程序执行中的任意位置,粒度为执行方法,抛出异常,设置变量等,在springAOP中,理解为方法的执行
2)切入点(Pointcut):匹配连接点的式子(连接点包含切入点)

  • 在springAOP中,一个切入点可以只描述一个具体方法,也可以匹配多个方法

3)通知(Advice):在切入点处执行的操作,也就是共性功能

  • 在SpringAOP中,功能最终以方法的形式呈现

4)通知类:定义通知的类
5)切面(Aspect):描述通知与切入点的对应关系

2、AOP入门案例
案例设定:测定接口执行效率
简化设定:在接口执行前输出当前系统时间
开发模式:XML or 注解
思路分析:

  1. 导入坐标(pom.xml)
  2. 制作连接点方法(原始操作,Dap接口与实现类)
  3. 制作共性功能(通知类与通知)
  4. 定义切入点
  5. 绑定切入点与通知关系(切面)

1、导入aop相关坐标

<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.1.11.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.9.4</version>
    </dependency>

2、原始操作

@Repository
public class bookDaoImpl implements BookDao {
    public  void  save(){
        System.out.println(System.currentTimeMillis());
        System.out.println("bookdao save");
    }
    public void update(){
        System.out.println("bookdao update");
    }
}
public interface BookDao {
public void save();
public void update();
}

@Configuration
@ComponentScan("com.it")
@EnableAspectJAutoProxy
public class SpringConfig {
}

3、制作共性功能,定义切入点

@Component
@Aspect
public class MyAdvice {
//切入点
    @Pointcut("execution(void com.it.dao.impl.bookDaoImpl.update())")
   //定义无返回值的,无参数的,私有的方法
    private void pt(){

    }
//共性功能
//绑定关系
    @Before("pt()")
    public void time(){
        System.out.println(System.currentTimeMillis());
    }
}

3、SpringAOP采用代理模式

  • 目标对象(Target):原始功能去掉共性功能对应的类产生的对象,这种对象是无法直接完成最终工作的
  • 代理(Proxy):目标对象无法直接完成工作,需要对其进行功能回填,通过原始对象的代理对象实现

4、切入点表达式
在这里插入图片描述

AOP通知类型
@Before–前置通知
@After–后置通知
@Around–环绕通知

@Component
@Aspect
public class MyAdvice {
//切入点
 @Pointcut("execution(void com.it.dao.impl.bookDaoImpl.save())")
    private void around(){
    };

@Around("around()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("around before save");
        //表示对原始操作的调用
        Object ret=pjp.proceed();
        System.out.println("around after save");
        return ret;
    };
 }

@AfterReturning–程序正常运行完之后执行
@AfterThrowing–抛出异常后才执行

在这里插入图片描述


afterReturning获取参数

 @AfterReturning(value="around()",returning="ret")
    public void afterReturning(JoinPoint jp,String ret){
        System.out.println("afterReturning"+ret);
    }

获取切入点方法的参数
在这里插入图片描述
4、百度网盘分享链接输入密码空格处理

@Around("around()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        Object[] args=pjp.getArgs();
        for (int i = 0; i < args.length; i++) {
            //如果是字符串数据
            if(args[i].getClass().equals(String.class)){
                //取出数据,trim()操作后,更新数据
                args[i]=args[i].toString().trim();
            }
        }
        return pjp.proceed(args);
    };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值