AOP的一些简单用法

JAVA: 面向对象编程
面向对象有很多对象,每个对象有很多法,而我们每做的一个动作都是一个方法.

面向对象关注的是将需求功能垂直划分为不同的并且相对独立的,会封装好很好的类 并且有属于他们自己的行为.
AOP技术 :利用的是一种横切的技术,将面向对象构建的庞大的类的体系进行水平的切割,并且会将那些影响到多个类的公共行为封装成一个可重用的模块,这个模块称之为切面,所以AOP叫做面向切面编程
关键思想: 将能用的逻辑从业务逻辑中分离出来
附上一些简单的代码:

private final static Logger logger = LoggerFactory.getLogger(HttpAspect.class);
@Before("execution(public * com.imooc.controller.BuyerProductController.*(..))")//拦截BuyerProductController下所有的方法
public void beforeLogAllMethod() {
    //System.out.println("Before-HttpAspect: 拦截所有方法");
    logger.info("Before-HttpAspect: 拦截所有方法");
}
@After("execution(public * com.imooc.controller.BuyerProductController.*(..))")//拦截BuyerProductController下所有的方法
public void afterLog() {
    //System.out.println("After-HttpAspect: 拦截所有方法");
    logger.info("After-HttpAspect: 拦截所有方法");
}
//以上方法比较Low重复的比较多 优化二个
@Pointcut("execution(public * com.imooc.controller.BuyerProductController.list(..))")//寻找切入点
public void log() {
}
@Before("log()")//拦截list()方法  before 在方法执行之前
public void beforeLog1() {
    //System.out.println("Before-HttpAspect: 拦截list()方法");
    logger.info("Before-HttpAspect: 拦截list()方法");
}
@After("log()")//拦截list()方法  after 在方法执行之后
public void afterLogAllMethod1() {
    //System.out.println("After-HttpAspect: 拦截list()方法");
    logger.info("After-HttpAspect: 拦截list()方法");
}
@Before("log()")
public void beforeRequestInfo(JoinPoint joinPoint) {//获取方法里的内容
    ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    HttpServletRequest request = requestAttributes.getRequest();
    //url
    logger.info("url :{}", request.getRequestURL());
    //mehtod
    logger.info("mehtod :{}", request.getMethod());
    //ip
    logger.info("ip :{}", request.getRemoteAddr());
    //类方法
    logger.info("class_method :{}", joinPoint.getSignature().getDeclaringTypeName() + "...." + joinPoint.getSignature().getName());
    //参数
    logger.info("args :{}", joinPoint.getArgs());
}
@AfterReturning(returning = "object", pointcut = "log()")//获取返回的内容
public void doAfterReturning(Object object) {
    logger.info("response: {}", object);
}
### AOP简单使用方法与实现方式 #### 什么是 AOP AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,旨在将非功能性需求从业务逻辑中分离出来。通过 AOP,可以在不修改原有代码的基础上动态地添加新功能[^2]。 --- #### Spring 中 AOP 的核心概念 在学习 AOP 使用之前,需先了解以下几个基本术语: 1. **Join Point(连接点)**:程序执行过程中可以插入通知的位置。 2. **Advice(通知/增强处理)**:定义了在某个 Join Point 上要执行的操作。 3. **Pointcut(切入点)**:用于匹配 Join Points 的表达式。 4. **Aspect(切面)**:将 Advice 和 Pointcut 结合在一起的对象。 5. **Weaving(织入)**:将 Aspect 应用到目标对象的过程。 这些概念构成了 AOP 的基础框架。 --- #### AOP 的实现方式 Spring 提供了多种 AOP 实现方式,主要包括以下几种: 1. **基于 JDK 动态代理** - 如果目标类实现了接口,则默认会使用 JDK 动态代理。 - 它的核心在于利用 Java 反射机制创建代理实例,并拦截调用的方法。 2. **基于 CGLIB 动态代理** - 若目标类未实现任何接口,默认会启用 CGLIB 来生成子类代理。 - 需要在配置文件或注解中显式设置 `proxyTargetClass=true`[^3]。 3. **XML 配置方式** - 这是最传统的 AOP 实现方式之一,适用于早期版本的 Spring。 - 用户需要在 XML 文件中声明切面、切入点以及通知等内容。 4. **Annotation 注解方式** - 更现代化的方式,推荐优先使用。 - 利用 `@Aspect` 注解标记切面类,并配合其他注解(如 `@Before`, `@AfterReturning`, `@Around` 等)完成具体功能定义[^4]。 --- #### 示例代码:基于 Annotation 的 AOP 使用 以下是通过注解实现的一个简单例子,展示如何记录方法执行时间的日志功能。 ```java // 引入必要的依赖包 import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; @Component @Aspect // 标记这是一个切面类 public class LoggingAspect { @Before("execution(* com.example.service.*.*(..))") // 定义切入点 public void logExecutionTime() { System.out.println("Method execution started..."); } } // 测试服务类 package com.example.service; import org.springframework.stereotype.Service; @Service public class MyService { public void performTask() { System.out.println("Executing task..."); } } // 主函数入口 import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class AopTest { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); MyService service = context.getBean(MyService.class); service.performTask(); } } ``` 在此示例中,当调用 `MyService#performTask()` 方法时,会在控制台打印一条日志消息表示方法已启动。 --- #### 注意事项 - 若要强制使用 CGLIB,请确保在配置文件中加入如下属性:`<aop:aspectj-autoproxy proxy-target-class="true"/>` 或者以注解形式开启 `@EnableAspectJAutoProxy(proxyTargetClass = true)`[^3]。 - 对于复杂场景下可能涉及字节码操作工具(如 ASM、Javassist),它们提供了更灵活但也更为底层的支持选项[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值