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
相关推荐
P7进阶路10 分钟前
实现用户登录系统的前后端开发
java
2401_8576176211 分钟前
“无缝购物体验”:跨平台网上购物商城的设计与实现
java·开发语言·前端·安全·架构·php
事业运财运爆棚14 分钟前
7种server的服务器处理结构模型
java·linux·服务器
西岭千秋雪_29 分钟前
设计模式の中介者&发布订阅&备忘录模式
java·观察者模式·设计模式·中介者模式·备忘录模式
憶巷36 分钟前
MyBatis中动态SQL执行原理
java·sql·mybatis
重生之绝世牛码37 分钟前
Java设计模式 —— 【结构型模式】享元模式(Flyweight Pattern) 详解
java·大数据·开发语言·设计模式·享元模式·设计原则
seasugar42 分钟前
记一次Maven拉不了包的问题
java·maven
Allen Bright1 小时前
【Java基础-26.1】Java中的方法重载与方法重写:区别与使用场景
java·开发语言
苹果酱05671 小时前
Golang的文件解压技术研究与应用案例
java·vue.js·spring boot·mysql·课程设计
秀儿y1 小时前
单机服务和微服务
java·开发语言·微服务·云原生·架构