Spring学习笔记_27——@EnableLoadTimeWeaving

@EnableLoadTimeWeaving

1. 介绍

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

LWT[Spring学习笔记_26------LWT-CSDN博客](https://blog.csdn.net/LuckyLay/article/details/143586246 "Spring学习笔记_26——LWT-CSDN博客")

2. 场景

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

3. 源码

java 复制代码
/**
 * @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

  • 配置类
java 复制代码
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 {
}
  • 切面类
java 复制代码
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());
    }
}
  • 控制器类
java 复制代码
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;

    @Autowired
    public 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 类
java 复制代码
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
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>
  • 启动
bash 复制代码
java -javaagent:/path/to/spring-instrument.jar -jar example.jar
相关推荐
java_nnnn4 分钟前
Spring IoC & DI 从入门到理解:控制反转、依赖注入与 Bean 管理详解
数据库·sql·spring
吹什么轩15 分钟前
constexpr 完全指南:从 const 的两种含义,到编译期计算的四次演进
java·前端·javascript
她的男孩25 分钟前
租户 A 的验证码,却用了租户 B 的 AccessKey:Forge Admin 修跨租户短信串发
java·spring boot·saas
LabVIEW开发27 分钟前
LabVIEW 局部变量与数据流:这道 CLAD 题为什么答案是 Undefined
java·开发语言·labview
文丑颜不良啊27 分钟前
LeetCode1721~1740题目解析
java·leetcode
wangbing112532 分钟前
监控网页项目常用英文缩写
java
麻瓜code37 分钟前
双写一致性:为什么是“删缓存“,而不是“改缓存“
java·缓存·mybatis
小蒜学长39 分钟前
基于SpringBoot+Vue的云南地区扶贫助农系统的设计与实现(代码+数据库+LW)
java·vue.js·spring boot·后端·乡村振兴
RuoyiOffice1 小时前
Hyper-V+Kubernetes 搭建实战:保留 Windows,构建三节点 Linux 容器集群
linux·spring boot·kubernetes·containerd·hyper-v·微服务部署·ruoyi office
砚底藏山河1 小时前
量化回测可复现流水线CI化
java·python·ci/cd·金融