首先,要了解AOP的概念
AOP为Aspect Oriented
Programming的缩写,意为:面向切面编程(也叫面向方面),可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。实际上编码中如果要实现日志打印之类,按照我们以前的方法是非常繁琐的,代码量大。我们一般主要用来事务控制,比如运行日志,权限控制等,除此以为,aop在模块的耦合,及管理,功能升级方面多有很好的用途
AOP中的核心注解:
1.Aspect(切面):声明在JAVA类上,主要包含一些切点(Pointcut)以及通知(Advice)
2.Joint point(连接点):表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point
3.Pointcut(切点):表示一组Joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。
4.Advice(通知-增强):Advice 定义了在 Pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码。
5.Target(目标对象):织入 Advice 的目标对象.。
6.Weaving(织入):将 Aspect 和其他对象连接起来, 并创建 Adviced object 的过程
用Springboot来配置第一步就是引入maven依赖
AOP依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
日志注解Slf4j
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
<scope>provided</scope>
</dependency>
然后在config配置里面上代码块
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
/**
* @author zzz
* @desc
*/
@Slf4j //声明日志
@Aspect //声明为一个 AspectJ切面
@Component //声明为组件,这样系统启动会进行该类的初始化
public class AopConfig {
//声明切点,我这里启动Controller层下的所有类下的方法就可以打印,可以使用*来代表任意字符,用..来表示任意个参数
private final String operateLogPoint="execution(* com.dem.controller.*.*(..))";
@Pointcut(operateLogPoint)//切点
public void webLog(){
}
//在方法
@Before(value="webLog()")//这个方法横向的插入到切点方法执行前
public void beforeControll(JoinPoint joinPoint) throws Exception{
log.info("Controller启动了!!!");
}
@After(value="webLog()")
public void afterControll() throws Exception{
log.info("结束了");
}
}
这里说下@Component注解的用法:@component (把普通pojo实例化到spring容器中,相当于配置文件中的)
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注
我只用到了其中的一些方法并且非常简单,仅仅是一种使用方法,还有其他方法也是一样的使用例如@AfterThrowing,@AfterReturning,@Around,这样一个简单的日志就打印出来了,还有更多需要获取的根据具体的业务逻辑来写。