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: 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, 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
    • Element Detail

      • aspectjWeaving

        public abstract EnableLoadTimeWeaving.AspectJWeaving aspectjWeaving
        Whether AspectJ weaving should be enabled.
        Default:
        org.springframework.context.annotation.EnableLoadTimeWeaving.AspectJWeaving.AUTODETECT