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();
    }
}

🧠 Test Your Knowledge

Which bean scope creates a new instance every time it's requested?