EnableLoadTimeWeaving (Spring Framework 3.2.1.RELEASE API)
Date: 2013-01-24

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
    Modifier and Type | Optional Element and Description
    --- | ---
    `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