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. 源码

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
相关推荐
摘星编程9 分钟前
原型模式深度解析:Java设计模式实战指南与克隆机制优化实践
java·设计模式·性能优化·原型模式·创建型模式·软件架构·对象克隆
liujing1023292915 分钟前
Day09_刷题niuke20250609
java·c++·算法
无奈何杨16 分钟前
事件时间驱动的策略版本管理:风控系统中的关键设计抉择
java·后端·架构
程序员JerrySUN37 分钟前
Linux 内核内存管理子系统全面解析与体系构建
java·linux·运维
风象南1 小时前
SpringBoot的5种签到打卡实现方案
java·spring boot·后端
1candobetter1 小时前
JAVA后端开发——多租户
java·开发语言
星辰离彬1 小时前
Java 高级泛型实战:8 个场景化编程技巧
java·开发语言·后端·程序人生
筏.k1 小时前
C++ 网络编程(10) asio处理粘包的简易方式
java·网络·c++
张哈大3 小时前
【 java 虚拟机知识 第一篇 】
java·开发语言·jvm·笔记·缓存
懒虫虫~5 小时前
基于SpringBoot利用死信队列解决RabbitMQ业务队列故障重试无效场景问题
spring boot·rabbitmq