Spring Aop的原理和实践

213 阅读2分钟

这是我参与8月更文挑战的第12天,活动详情查看:8月更文挑战

前言

Aop概述
  Aop是软件设计领域中的面向切面编程,它是面向对象编程(OOP)的一种补充和完善。它以通过预编译方式和运行期动态代理方式,实现在不修改源代码的情况下给程序动态统一添加额外功能的一种技术。
  

应用场景分析 实际项目中通常会将系统分为两大部分,一部分是核心业务,一部分是非核业务。 在编程实现时我们首先要完成的是核心业务的实现,非核心业务一般是通过特定方式切入到系统中,这种特定方式一般就是借助AOP进行实现。 AOP就是要基于OCP(开闭原则),在不改变原有系统核心业务代码的基础上动态添加一些扩展功能并可以"控制"对象的执行。例如AOP应用于项目中的日志处理,事务处理,权限处理,缓存处理等等

图片1.png

原理

JDK代理 1、假如目标对象(被代理对象)实现接口,则底层可以采用JDK动态代理机制为目标对象创建代理对象(目标类和代理类会实现共同接口)。

CGLIB代理 2、假如目标对象(被代理对象)没有实现接口,则底层可以采用CGLIB代理机制为目标对象创建代理对象(默认创建的代理类会继承目标对象类型)。

图片2.png

关键字

切面(aspect): 横切面对象,一般为一个具体类对象(可以借助@Aspect声明)。

通知(Advice):在切面的某个特定连接点上执行的动作(扩展功能),例如around,before,after等。

连接点(joinpoint):程序执行过程中某个特定的点,一般指被拦截到的的方法。

切入点(pointcut):对多个连接点(Joinpoint)一种定义,一般可以理解为多个连接点的集合。

配置依赖
<dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
开发思想如下
1、先创建日志列表的对象SysLog、mvc的数据写入并定义方法。
2、编写日志切面Aspect,定义切面方法(Pointcut):我们需要对哪个实现类进行	     功能的扩展等。=>用户管理页面的行为日志,所以在其实现类进行ben注入
3、将获取的数据set到SysLog对象中。
4、依赖注入,并将对象传入给service接口中,并在前台展示。
@Aspect
public class SysUserOptAspect {
	
	@Pointcut("bean(sysUserServiceImpl)")
	public void doUserOpt() {}
	
	
	@Around("doUserOpt()")
	public Object doOperation(ProceedingJoinPoint pj) throws Throwable {
		long start =System.currentTimeMillis();
		Object result =pj.proceed();
		long end =System.currentTimeMillis();
		
		long time =end-start;
		saveObject(pj,time);
		return result;		
	}
	private void saveObject(ProceedingJoinPoint pj,long time) throws Throwable, SecurityException {
			 ×× 里面放的一些逻辑处理等等。
			}
}