Spring Core
Master dependency injection and IoC container fundamentals
⚡ What is Spring Core?
Spring Core is the foundation module providing IoC container and dependency injection. It manages object creation, configuration, and lifecycle, making your applications more modular and testable with loose coupling.
// Bean definition and injection
@Component
public class EmailService {
public void sendEmail(String message) {
System.out.println("Email sent: " + message);
}
}
Core Features
Bean Factory
Creates and manages application objects
@Bean
public UserService userService() {
return new UserService();
}
Lifecycle Management
Controls object creation and destruction
@PostConstruct
public void init() {
// Initialization logic
}
Scopes
Define bean lifecycle and visibility
@Scope("singleton")
@Component
public class MyService { }
Configuration
Java-based and XML configuration
@Configuration
@ComponentScan
public class AppConfig { }
🔹 Dependency Injection Types
Spring supports different types of dependency injection:
@Service
public class OrderService {
// Constructor Injection (Recommended)
private final PaymentService paymentService;
public OrderService(PaymentService paymentService) {
this.paymentService = paymentService;
}
// Field Injection
@Autowired
private EmailService emailService;
// Setter Injection
private LoggingService loggingService;
@Autowired
public void setLoggingService(LoggingService loggingService) {
this.loggingService = loggingService;
}
}
Best Practice:
Use constructor injection for required dependencies
🔹 Bean Scopes
Spring provides different bean scopes:
// Singleton (Default) - One instance per container
@Component
@Scope("singleton")
public class DatabaseService { }
// Prototype - New instance each time
@Component
@Scope("prototype")
public class RequestProcessor { }
// Session - One instance per HTTP session (Web apps)
@Component
@Scope("session")
public class UserSession { }
// Request - One instance per HTTP request (Web apps)
@Component
@Scope("request")
public class RequestData { }
Scope Usage:
- Singleton: Stateless services, utilities
- Prototype: Stateful objects, temporary objects
- Session: User-specific data in web apps
- Request: Request-specific data
🔹 Configuration Methods
Configure Spring beans using different approaches:
🔸 Java Configuration (Recommended)
@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
@Bean
public DataSource dataSource() {
HikariDataSource dataSource = new HikariDataSource();
dataSource.setJdbcUrl("jdbc:h2:mem:testdb");
return dataSource;
}
@Bean
public UserRepository userRepository(DataSource dataSource) {
return new UserRepository(dataSource);
}
}
🔸 Annotation-based Configuration
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Value("${app.name}")
private String appName;
public List getAllUsers() {
return userRepository.findAll();
}
}