org.springframework.context.annotation

## Annotation Type EnableLoadTimeWeaving

    @Target(value=TYPE)
    @Retention(value=RUNTIME)
    @Documented
    @Import(value=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. As of Spring 3.1: detecting Sun's GlassFish, Oracle's OC4J, Spring's VM agent and any ClassLoader supported by Spring's `ReflectiveLoadTimeWeaver` (for example, the `TomcatInstrumentableClassLoader`).

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, e.g. 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`

### Optional Element Summary

Optional Elements
`EnableLoadTimeWeaving.AspectJWeaving` `aspectjWeaving` Whether AspectJ weaving should be enabled.

### Element Detail

#### aspectjWeaving

    public abstract EnableLoadTimeWeaving.AspectJWeaving aspectjWeaving

Whether AspectJ weaving should be enabled.

Default:
  org.springframework.context.annotation.EnableLoadTimeWeaving.AspectJWeaving.AUTODETECT