学习目标:
- 掌握 AOP知识
学习内容:
- 了解AOP的概念
- AOP入门案例
- 百度网盘分享链接输入密码空格处理
学习时间:
- 周一8:30-18:00
学习产出:
1、AOP的概念–面向切面编程,一种编程范式,无侵入式
核心概念:
1)连接点(JoinPoint):程序执行中的任意位置,粒度为执行方法,抛出异常,设置变量等,在springAOP中,理解为方法的执行
2)切入点(Pointcut):匹配连接点的式子(连接点包含切入点)
- 在springAOP中,一个切入点可以只描述一个具体方法,也可以匹配多个方法
3)通知(Advice):在切入点处执行的操作,也就是共性功能
- 在SpringAOP中,功能最终以方法的形式呈现
4)通知类:定义通知的类
5)切面(Aspect):描述通知与切入点的对应关系
2、AOP入门案例
案例设定:测定接口执行效率
简化设定:在接口执行前输出当前系统时间
开发模式:XML or 注解
思路分析:
- 导入坐标(pom.xml)
- 制作连接点方法(原始操作,Dap接口与实现类)
- 制作共性功能(通知类与通知)
- 定义切入点
- 绑定切入点与通知关系(切面)
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);
};