@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