Spring Expression Language (SpEL) introduced in Spring 3.0 introduces EL style language for referencing beans and properties, and gives a standard syntax for doing property replacement into beans.
Annotation based bean definition
- component scan allows you to configure annotated beans – simplest approach, avoids xml:
Enabled with context:component-scan in xml file:
<context:component-scan base-package="your.package"/>
- @Component – declares beans
- @Autowired – bean of a matching type is automatically injected into contructor, method, or field
- Only one constructor can be autowired, but multiple methods and attributes can be autowired
- @Autowired properties don’t need setters
- @Autowired methods don’t need to be setters, and don’t need to be named ‘set…()’
- @Qualifier allows you to specify a specific bean id if matching beans by type is ambiguous
‘The spirit of autowiring is by type’ – use of the @Qualifier should be only if necessary, since it restricts the flexibility and power of the Autowiring.
Use of @Autowired implies @Required (don’t need to explicitly defined @Required if @Autowired)
Stereotype annotations
Also enabled via context:component-scan
- @Service – indicates purpose in layering, but doesn’t add any additional behavior
Following stereotypes do add extra behavior:
- @Repository – data access
- @Controller – MVC controller
- @Configuration – programmatic Spring configuration
Other Spring projects use similar annotation approach for adding additional stereotype based functionality.
JSR 330 CDI Annotation Support
- Spring is a an implementation of JSR330
- provides support for JSR330 standard @Named, @Inject, @Scope, @Singleton
- Spring provides other Spring specific annotations not supported in JSR330 (@Value, @Required, @Lazy)
Bean configuration using Annotations & Java: @Configuration
- Enabled with context:component-scan
- @Configuration marks configuration clas
- Use @Bean on method that provides instance of the bean
- Method name is the id of the bean, eg participantService() – id = “participantService”
- Java code can perform any initialization – you can invoke any other methods necessary to perform initialization
- All @Bean annotated methods produce singletons by default – @Bean methods are proxied to add this behavior – this can be overridden with @Scope(“prototype”)
- @Import allows to import other @Configuration classes
- Alternate configuration: AnnotationConfigApplicationContext – instantiating this context allows a completely xml free configuration approach
Annotations vs XML based configuration
- easier to make changes to annotated beans during development
- could always move to xml config when beans become more mature, but no compelling reason to do this, could always just leave the annotations
- xml config always overrides the annotation metadata
Spring JUnit Support
Integration testing support allows testing with Spring Bean dependencies
@ContextConfuguration("example-context.xml") @RunWith(SpringJUnit4ClassRunner.class) public class ExampleTest { @Autowired private ExampleService exampleService; @Test public void eampleTest() { ... } }