Let me show how it works by creating simple test project. Let's start with Maven's project descriptor (pom.xml):
Next one, let me create application context (applicationContext.xml) and place it inside src/main/resources:4.0.0 spring-configurable spring-configurable 0.0.1-SNAPSHOT jar spring-configurable http://maven.apache.org UTF-8 3.0.5.RELEASE org.aspectj aspectjweaver 1.6.5 org.springframework spring-beans ${spring.framework.version} org.springframework spring-aspects ${spring.framework.version} org.springframework spring-core ${spring.framework.version} org.springframework spring-context ${spring.framework.version} org.springframework spring-jdbc ${spring.framework.version}
Two key declarations here are <context:spring-configured /> and <context:load-time-weaver />. According to documentation, <context:spring-configured /> "... signals the current application context to apply dependency injection to non-managed classes that are<context:annotation-config /> <context:spring-configured /> <context:load-time-weaver /> <context:component-scan base-package="com.test.configurable" /> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" />
instantiated outside of the Spring bean factory (typically classes annotated with the @Configurable annotation)..." and <context:load-time-weaver /> turns on runtime weaving.
Respective Java code which uses power of @Configurable annotation is located into Starter.java, which itself is placed inside src/main/java:
package com.test.configurable; import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.util.Assert; public class Starter { @Configurable private static class Inner { @Autowired private DataSource dataSource; } public static void main(String[] args) { final ApplicationContext context = new ClassPathXmlApplicationContext( "/applicationContext.xml" ); final DataSource dataSource = context.getBean( DataSource.class ); Assert.notNull( dataSource ); Assert.notNull( new Inner().dataSource ); } }As we see, class Inner is not a bean, is nested into another class and is created simply by calling new. Nevertheless, dataSource bean is injected as expected. Last but not least, in order this example to work, application should be run using an agent (I am using Spring Framework 3.0.5): -javaagent:spring-instrument-3.0.5.RELEASE.jar