Spring 2.5 introduced a new style of dependency injection with Annotation-Driven Injection. In Spring XML, Annotation-Driven Injection is enabled in the container by declaring
<context:annotation-config/>
In JavaConfig, this same functionality is enabled with the
@AnnotationDrivenConfig
annotation
@Configuration @AnnotationDrivenConfig public class Config { // may now use @Autowired to reference beans from other @Configuration classes, XML, etc }
An equivalent for Spring XML's <context:component-scan/>
is
provided with the @ComponentScan
annotation.
package com.company.foo; @Service public class FooServiceImpl implements FooService { private final FooRepository fooRepository; @Autowired public FooService(FooRepository fooRepository) { this.fooRepository = fooRepository; } // ... }
package com.company.foo; @Repository public class JdbcFooRepository implements FooRepository { private final DataSource dataSource; @Autowired public FooRepository(DataSource dataSource) { this.dataSource = dataSource; } // ... }
@Configuration @ComponentScan("com.company") // search the com.company package for @Component classes @ImportXml("classpath:com/company/data-access-config.xml") // XML with DataSource bean public class Config { }
Because Spring's @Service
and @Repository
stereotype annotations are each meta-annotated with @Component
,
they are candidates for component scanning. Because FooServiceImpl
and JdbcFooRepository
both reside underneath the
com.company
package, they will be discovered during component
scanning and will be autowired together. @ImportXml
pulls in the
DataSource
bean, ensuring it will be available for autowiring into
JdbcFooRepository
.
With the above very minimal configuration in the Config
class, we
can bootstrap and use the application as follows:
public class Main { public static void main(String[] args) { JavaConfigApplicationContext ctx = new JavaConfigApplicationContext(Config.class); FooService fooService = ctx.getBean(FooService.class); fooService.doStuff(); } }
Please see "Chapter 3, IoC" of the core spring documentation for additional detail on Annotation-Driven Injection support.