当前位置: 首页 > news >正文

Spring学习笔记_27——@EnableLoadTimeWeaving

@EnableLoadTimeWeaving

1. 介绍

在Spring框架中,@EnableLoadTimeWeaving 是一个注解,它用于启用加载时织入(Load-Time Weaving, LTW)

LWT[Spring学习笔记_26——LWT-CSDN博客]

2. 场景

  • AOP:在Spring框架中,LTW通常与Spring AOP结合使用,以提供更强大的AOP功能。例如,可以定义切面来拦截特定的方法调用,并在这些方法调用前后执行额外的操作。
  • ORM:在一些对象关系映射(ORM)框架中,如Hibernate,LTW可以用来延迟加载实体属性或集合,而无需在运行时显式地配置代理。

3. 源码

/*** @author Chris Beams* @since 3.1* @see LoadTimeWeaver* @see DefaultContextLoadTimeWeaver* @see org.aspectj.weaver.loadtime.ClassPreProcessorAgentAdapter*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(LoadTimeWeavingConfiguration.class)
public @interface EnableLoadTimeWeaving {AspectJWeaving aspectjWeaving() default AspectJWeaving.AUTODETECT;enum AspectJWeaving {ENABLED,    // 开启LTW支持DISABLED,   // 不开启LTW支持AUTODETECT; // 检测类路径下的META-INF目录下是否存在aop.xml文件,如果存在,则开启LTW支持,否则不开启LTW支持}
}

4. Demo

  • 配置类
package com.example.config;import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableLoadTimeWeaving;
import org.springframework.context.annotation.EnableLoadTimeWeaving.AspectJWeaving;@Configuration
@EnableLoadTimeWeaving(aspectjWeaving = AspectJWeaving.ENABLED)
public class AppConfig {
}
  • 切面类
package com.example.aspect;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.springframework.stereotype.Component;@Aspect
@Component
public class LoggingAspect {@Before("execution(* com.example.service.UserService.login(..))")public void logBeforeLogin(JoinPoint joinPoint) {System.out.println("User is logging in: " + joinPoint.getSignature());}@After("execution(* com.example.service.UserService.logout(..))")public void logAfterLogout(JoinPoint joinPoint) {System.out.println("User has logged out: " + joinPoint.getSignature());}
}
  • 控制器类
package com.example.controller;import com.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/users")
public class UserController {private final UserService userService;@Autowiredpublic UserController(UserService userService) {this.userService = userService;}@GetMapping("/login")public String login() {userService.login();return "Logged in";}@GetMapping("/logout")public String logout() {userService.logout();return "Logged out";}
}
  • service 类
package com.example.service;public class UserService {public void login() {System.out.println("User is logging in...");}public void logout() {System.out.println("User is logging out...");}
}
  • AOP配置文件aop.xml
<aspectj><weaver><!-- Specify which packages to weave --><include within="com.example..*"/></weaver><aspects><!-- Specify which aspects to use --><aspect name="com.example.aspect.LoggingAspect"/></aspects>
</aspectj>
  • 启动
java -javaagent:/path/to/spring-instrument.jar -jar example.jar
http://www.lryc.cn/news/481309.html

相关文章:

  • 【数据分析】如何构建指标体系?
  • 大数据程序猿不可不看的资料大全
  • 【架构设计常见技术】
  • LLMs之MemFree:MemFree的简介、安装和使用方法、案例应用之详细攻略
  • Hive简介 | 体系结构
  • [C++] GDB的调试和自动化检测
  • 车机版 Android Audio 框架笔记
  • 【NLP自然语言处理】深入解析Encoder与Decoder模块:结构、作用与深度学习应用
  • 【JAVA EE】多线程、锁、线程池的使用
  • 云计算:定义、类型及对企业的影响
  • 大数据面试题--kafka夺命连环问
  • 【大模型】Spring AI Alibaba 对接百炼平台大模型使用详解
  • Zabbix如何配置将信息发送到邮件
  • jmeter常用配置元件介绍总结之前置处理器、测试片段
  • Redis2:Redis数据结构介绍、通用命令、String类型、Key的层级格式
  • jenkins流水线pipeline
  • 【计网】基于TCP协议的Echo Server程序实现与多版本测试
  • 「QT」几何数据类 之 QVector2D 二维向量类
  • 深度学习——权重初始化、评估指标、梯度消失和梯度爆炸
  • Rust: 利用 chrono 库实现日期和字符串互相转换
  • 【IEEE/EI会议】第八届先进电子材料、计算机与软件工程国际学术会议(AEMCSE 2025)
  • volatile 关键字的作用学习
  • 数据字典是什么?和数据库、数据仓库有什么关系?
  • Docker平台搭建方法
  • JavaScript数组
  • 产品经理如何使用项目管理软件推进复杂项目按时上线
  • 构建基于 DCGM-Exporter, Node exporter,PROMETHEUS 和 GRAFANA 构建算力监控系统
  • 第13章 聚合函数
  • 【计网不挂科】计算机网络期末考试——【选择题&填空题&判断题&简述题】试卷(4)
  • C# 中 LibraryImport 和 DllImport有什么不同