Annotation Interface EnableLoadTimeWeaving


@Target(TYPE) @Retention(RUNTIME) @Documented @Import(LoadTimeWeavingConfiguration.class) public @interface EnableLoadTimeWeaving
Activates a Spring LoadTimeWeaver for this application context, available as a bean with the name "loadTimeWeaver", similar to the <context:load-time-weaver> element in Spring XML.

To be used on @Configuration classes; the simplest possible example of which follows:

@Configuration
@EnableLoadTimeWeaving
public class AppConfig {

    // application-specific @Bean definitions ...
}
The example above is equivalent to the following Spring XML configuration:
<beans>

    <context:load-time-weaver/>

    <!-- application-specific <bean> definitions -->

</beans>

The LoadTimeWeaverAware interface

Any bean that implements the LoadTimeWeaverAware interface will then receive the LoadTimeWeaver reference automatically; for example, Spring's JPA bootstrap support.

Customizing the LoadTimeWeaver

The default weaver is determined automatically: see DefaultContextLoadTimeWeaver.

To customize the weaver used, the @Configuration class annotated with @EnableLoadTimeWeaving may also implement the LoadTimeWeavingConfigurer interface and return a custom LoadTimeWeaver instance through the #getLoadTimeWeaver method:

@Configuration
@EnableLoadTimeWeaving
public class AppConfig implements LoadTimeWeavingConfigurer {

    @Override
    public LoadTimeWeaver getLoadTimeWeaver() {
        MyLoadTimeWeaver ltw = new MyLoadTimeWeaver();
        ltw.addClassTransformer(myClassFileTransformer);
        // ...
        return ltw;
    }
}

The example above can be compared to the following Spring XML configuration:

<beans>

    <context:load-time-weaver weaverClass="com.acme.MyLoadTimeWeaver"/>

</beans>

The code example differs from the XML example in that it actually instantiates the MyLoadTimeWeaver type, meaning that it can also configure the instance, for example, calling the #addClassTransformer method. This demonstrates how the code-based configuration approach is more flexible through direct programmatic access.

Enabling AspectJ-based weaving

AspectJ load-time weaving may be enabled with the aspectjWeaving() attribute, which will cause the AspectJ class transformer to be registered through LoadTimeWeaver.addTransformer(ClassFileTransformer). AspectJ weaving will be activated by default if a "META-INF/aop.xml" resource is present on the classpath. Example:
@Configuration
@EnableLoadTimeWeaving(aspectjWeaving=ENABLED)
public class AppConfig {
}

The example above can be compared to the following Spring XML configuration:

<beans>

    <context:load-time-weaver aspectj-weaving="on"/>

</beans>

The two examples are equivalent with one significant exception: in the XML case, the functionality of <context:spring-configured> is implicitly enabled when aspectj-weaving is "on". This does not occur when using @EnableLoadTimeWeaving(aspectjWeaving=ENABLED). Instead you must explicitly add @EnableSpringConfigured (included in the spring-aspects module)

Since:
3.1
Author:
Chris Beams
See Also: