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
相关推荐
HanhahnaH6 分钟前
Spring集合注入Bean
java·spring
未定义.22112 分钟前
电子削铅笔刀顺序图详解:从UML设计到PlantUML实现
java·软件工程·uml
雾月5529 分钟前
LeetCode 1292 元素和小于等于阈值的正方形的最大边长
java·数据结构·算法·leetcode·职场和发展
CopyLower1 小时前
在 Spring Boot 中实现 WebSockets
spring boot·后端·iphone
24k小善1 小时前
Flink TaskManager详解
java·大数据·flink·云计算
想不明白的过度思考者2 小时前
Java从入门到“放弃”(精通)之旅——JavaSE终篇(异常)
java·开发语言
.生产的驴2 小时前
SpringBoot 封装统一API返回格式对象 标准化开发 请求封装 统一格式处理
java·数据库·spring boot·后端·spring·eclipse·maven
猿周LV2 小时前
JMeter 安装及使用 [软件测试工具]
java·测试工具·jmeter·单元测试·压力测试
晨集2 小时前
Uni-App 多端电子合同开源项目介绍
java·spring boot·uni-app·电子合同
时间之城2 小时前
笔记:记一次使用EasyExcel重写convertToExcelData方法无法读取@ExcelDictFormat注解的问题(已解决)
java·spring boot·笔记·spring·excel