The @Component annotation serves as a generic marker for any class requiring Spring container management. Applied to POJOs, service layers, or persistence entities, it triggers automatic instantiation and registration in the IoC container.
Conversely, @Bean declares a managed object within configuration classes. Placed on methods, it registers the return value as a bean, enabling precise control over instantiation, scoping, and dependencies.
Key Distinctions:
- Purpose:
@Componentidentifies classes for auto-detection;@Beandefines objects from method outputs - Application:
@Componentuses class-level scanning;@Beanemploys method-level configuraton - Control:
@Componentdelegates creation to Spring;@Beanpermits manual instantiation
// @Component usage
@Component
public class InventoryService { }
// @Bean usage
@Configuration
public class AppSetup {
@Bean
public InventoryService inventoryManager() {
return new InventoryService();
}
}
Proxy Implementation in Spring Boot
Spring Boot prefers CGLIB over JDK dynamic proxies due to:
- Interface Flexibility: Generates subclass proxies assignable to interfaces or concrete types
- Performance Gains: Bytecode manipulation typically outperforms reflection-based proxies
- Enhanced Control: Provides granular configuration options for complex scenarios
Creating Custom Starters
Implement a starter by:
- Packaging reusable components and configurations
- Including auto-configuration classes
- Registering configurations via
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@AutoConfiguration
public class CustomAutoConfig {
@Bean
public FeatureModule featureProvider() {
return new FeatureModule();
}
}
Spring MVC Processing Flow
- Client request reaches
DispatcherServlet - Handler mapping identifies controller
- Adapter executes controller method
- Controller returns
ModelAndView - View resolver processes template
- Response rendered to client
Spring Framework Benefits
- Lightweight: Minimal footprint (~2MB core)
- IoC Container: Manages object lifecycle and dependencies
- AOP Support: Decouples cross-cutting concerns
- Declarative Transactions: Unified transaction management
- Integrated Ecosystem: Comprehansive toolset for enterprise apps
Convention Over Configuration
Defaults eliminate boilerplate:
- Starter POMs manage dependencies
- Embedded servers (Tomcat/Jetty)
- Auto-configuration via classpath scanning
- Standard property files (
application.yml)
Thread-Safe Beans
Mitigate singleton risks by:
- Switching to prototype scope
- Eliminating mutable instance variables
- Using thread-local storage or concurrent collections
- Applying synchronization primitives
@Scope("prototype")
@Component
public class StatelessProcessor { }
Bean Registration Methods
- Annotation scanning (
@Component,@Service) - XML definitions (
<bean>declarations) - Java configuration (
@Beanmethods) - Programmatic registration (
BeanDefinitionRegistry)
Transaction Propagation Behaviors
| Behavior | Description |
|---|---|
| REQUIRED (default) | Join existing or create new transaction |
| REQUIRES_NEW | Suspend current, start new transaction |
| NESTED | Execute within nested transaction scope |
| MANDATORY | Require active transaction |
| SUPPORTS | Execute non-transactionally if none exists |
| NEVER | Fail if transaction exists |
| NOT_SUPPORTED | Execute non-transactionally |
Transaction Scopes
Spring manages single-resource transactions (ACID compliance). Distributed transactions require external solutions like Seata integrated via Spring interfaces.
Spring Cloud Overview
Microservice toolkit providing:
- Service discovery (Consul/Nacos)
- API gateway (Gateway/Zuul)
- Load balancing (LoadBalancer/Ribbon)
- Resilience patterns (Sentinel/Hystrix)
- Configuration server
Duplicate Bean Handling
- XML: Fails on duplicate IDs during parsing
- Multiple XMLs: Last definition wins
- Java Config: First
@Beanmethod registered, subsequent duplicates ignored
IoC Container Workflow
Phase 1: Initialization
- Parse configuration metadata (XML/annotations)
- Generate
BeanDefinitionobjects - Store definitions in registry
Phase 2: Instantiation
- Create singleton instances (non-lazy)
- Resolve dependencies via DI
- Apply lifecycle callbacks
Bean retrieval via @Autowired or context.getBean().