Package org.springframework.context.annotation

# 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(java.lang.instrument.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:
  - `LoadTimeWeaver`
  - `DefaultContextLoadTimeWeaver`
  - `ClassPreProcessorAgentAdapter`

## Nested Class Summary

Nested Classes
Modifier and Type
Class
Description
`static enum`
`EnableLoadTimeWeaving.AspectJWeaving`
AspectJ weaving enablement options.

## Optional Element Summary

Optional Elements
Modifier and Type
Optional Element
Description
`EnableLoadTimeWeaving.AspectJWeaving`
`aspectjWeaving`
Whether AspectJ weaving should be enabled.

## Element Details

### aspectjWeaving

EnableLoadTimeWeaving.AspectJWeaving aspectjWeaving
Whether AspectJ weaving should be enabled.

Default:
  AUTODETECT