Configuring the Application Context
Inversion of Control
AKA Dependency InjectionObjects are injected at runtime.
Profiles
You can set profiles like develop or production to be able to branch the code.@Profile(“develop”) --- this anniotation makes sure to run that method.
Bean Scopes
- singleton: Scopes a single bean definition to a single object instance per Spring IoC container.
- prototype: Scopes a single bean definition to any number of object instances.
- request: Scopes a single bean definition to the lifecycle of a single HTTP request; that is each and every HTTP request will have its own instance of a bean created off the back of a single bean definition. Only valid in the context of a web-aware Spring ApplicationContext.
- session: Scopes a single bean definition to the lifecycle of a HTTP Session. Only valid in the context of a web-aware Spring ApplicationContext.
- global session: Scopes a single bean definition to the lifecycle of a global HTTP Session. Typically only valid when used in a portlet context. Only valid in the context of a web-aware Spring ApplicationContext.
e.g.: @Scope(“singleton”)
Proxies
Since Spring 4.0 every class which is loaded into the Bean Factory gets at least one Proxy.Annotation based configuration
@Component scan
This indicates that a class should be loaded to the bean factory.Dependency injection is achieved through @Autowired.
Autowiring
Field level: private attributes can be autowired, but not a good practice.Setter Injection: inject at the setter method.
Constructor Injection: good practice, inject at the constructor. Class become immutable.
…
InventoryService inventoryService;
@Autowired
public OrderServiceImpl(InventoryService inventoryService) {
this.inventoryService = inventoryService;
}
Lifecycle methods
@PostConstruct: method being run after constructor.@PreDestroy: method being run before destructor is called.
Bean lifecycle
Initialization phase:- Begins with creation of ApplicationContext
- BeanFactory initialization phase
- Bean initialization and instantiation
- Bean definitions loaded: from Java configuration, Bean configuration, Component scanning and aut configuration
- Post-process bean definitions: BeanFactory is loaded with references
- Instantiate Bean: Bean pointer is still referenced in Bean Factory, Objects have been constructed, BUT not available for use yet!
- Setters: beans are fully initialized; all initial dependencies are injected - beans still not ready for use
- Bean post-processor (pre- and post-init): almost the same as Initializer
- Initializer: @PostConstruct methods are called here; after the step beans are instantiated and initialized, dependencies have been injects, BEANS READY TO USE
Aspect Oriented Programming (AOP)
Aspects: reusable blocks of code that that are injected into your application during runtime.Applications:
- Logging
- Transactions
- Caching
- Security
In Spring AspectJ is handling the aspecting.
Parts of a Spring Aspect:
- Aspect: A modularization of a concern that cuts across multiple objects. Transaction management is a good example of a crosscutting concern in J2EE applications. In Spring AOP, aspects are implemented using regular classes (the schema-based approach) or regular classes annotated with the @Aspect annotation (@AspectJ style).
- Join point: A point during the execution of a program, such as the execution of a method or the handling of an exception. In Spring AOP, a join point always represents a method execution. Join point information is available in advice bodies by declaring a parameter of type org.aspectj.lang.JoinPoint.
- Advice: Action taken by an aspect at a particular join point. Different types of advice include "around," "before" and "after" advice. Advice types are discussed below. Many AOP frameworks, including Spring, model an advice as an interceptor, maintaining a chain of interceptors "around" the join point.
- Pointcut: A predicate that matches join points. Advice is associated with a pointcut expression and runs at any join point matched by the pointcut (for example, the execution of a method with a certain name). The concept of join points as matched by pointcut expressions is central to AOP: Spring uses the AspectJ pointcut language by default.