# 《Spring核心技术》第28章:@EnableLoadTimeWeaving注解

作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码地址:https://github.com/binghe001/spring-annotation-book/tree/master/spring-annotation-chapter-28 (opens new window)

沉淀,成长,突破,帮助他人,成就自我。

大家好,我是冰河~~


  • 本章难度:★★★☆☆

  • 本章重点:进一步学习并掌握@EnableLoadTimeWeaving注解切换不同场景实现类增强的案例和流程。


本章目录如下所示:

  • 学习指引
  • 注解说明
    • 注解源码
    • 使用场景
  • 使用案例
  • 总结
  • 思考
  • VIP服务

# 一、学习指引

在Spring AOP中,你了解过@EnableLoadTimeWeaving注解吗?

Spring中有这么一个注解,可以实现切换不同场景下实现目标类的增强,这个注解就是@EnableLoadTimeWeaving注解。很多工作多年的开发人员对于@EnableLoadTimeWeaving注解都不是很了解。本章,我们就一起来聊聊@EnableLoadTimeWeaving注解。

# 二、注解说明

关于@EnableLoadTimeWeaving注解的一点点说明~~

Spring默认是在编译时,将切面类织入到Java类中,那你有没有想过怎么让切面类在类加载的时候就织入到Java类中?

# 2.1 注解源码

@EnableLoadTimeWeaving注解主要用于切换不同场景下实现类的增强功能,源码详见:org.springframework.context.annotation.EnableLoadTimeWeaving。

/**
 * @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,
		DISABLED,
		AUTODETECT;
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

从@EnableLoadTimeWeaving注解的源码可以看出,@EnableLoadTimeWeaving注解是从Spring3.1版本开始提供的注解,开启@EnableLoadTimeWeaving注解只能标注到类上。在@EnableLoadTimeWeaving注解中提供了一个AspectJWeaving枚举类型的aspectjWeaving属性。具体含义如下所示。

  • aspectjWeaving:是否开启LTW的支持。具体取值如下所示。
    • ENABLED:开启LTW支持。
    • DISABLED:不开启LTW支持。
    • AUTODETECT:检测类路径下的META-INF目录下是否存在aop.xml文件,如果存在,则开启LTW支持,否则,不开启LTW支持。

# 2.2 使用场景

在Java 语言中,从织入切面的方式上来看,存在三种织入方式:编译期织入、类加载期织入和运行期织入。编译期织入是指在Java编译期,采用特殊的编译器,将切面织入到Java类中;而类加载期织入则指通过特殊的类加载器,在类字节码加载到JVM时,织入切 面;运行期织入则是采用CGLib工具或JDK动态代理进行切面的织入。

AspectJ提供了两种切面织入方式,第一种通过特殊编译器,在编译期,将AspectJ语言编写的切面类织入到Java类中,可以通过一个Ant或Maven任务来完成这个操作;第二种方式是类加载期织入,也简称为LTW(Load Time Weaving)。

使用场景的以上内容摘录自互联网。

Spring默认是在编译期,将AspectJ语言编写的切面类织入到Java类中,可以使用@EnableLoadTimeWeaving注解开启LTW支持,也就是开启在类加载时,将AspectJ语言编写的切面类织入到Java类中的支持。

# 三、使用案例

# 查看完整文章

加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码