
Explore inversion of control and dependency injection, their types, and when to use each, then build your first Spring application and set up IntelliJ IDEA and documentation sources.
Discover inversion of control, a design principle that moves dependency creation to another component, reducing coupling and enabling easier testing with mock objects.
Explore inversion of control and solid principles through barista coffee examples, contrasting tightly coupled versus decoupled design, and compare dependency inversion with dependency injection.
Learn how to install IntelliJ IDEA community edition, create a new Maven Java project, configure the SDK, and navigate the project structure, pom.xml, and build goals like clean and package.
Explore IntelliJ IDEA basics, mastering project structure, Maven setup, and essential shortcuts to quickly configure Java projects and run a Hello World build.
Master inversion of control in a practical Java project by creating barista and coffee shop classes with latte and coffee instructions, using constructor injection and a simple factory.
Practice inversion of control by injecting coffee instructions through the coffee instructions interface and swapping latte and espresso implementations via the constructor.
Create a coffee factory with a coffee instructions interface, implement latte and espresso instructions, and apply inversion of control so the barista uses any coffee type via a factory.
Master dependency injection and inversion of control. See how constructors inject dependencies into a class and how a dependency container provides or omits them, blocking creation when missing.
Explore three dependency injection methods—constructor, setter, and field—and when to use each. Constructor enforces mandatory dependencies; setter enables optional ones; field exposes a public attribute.
Explore dependency injection and inversion of control, compare three injection methods into a component, and implement a dependency injector that returns a prepared component with injected coffee instructions.
Explore dependency injection techniques in a barista example, comparing constructor, setter, and direct injection. Use latte and espresso instructions, and note optional dependencies within the Spring framework.
Rewrite the dependency injection logic with the Spring framework, remove legacy injectors, and use an annotation-based Spring context to automatically register and fetch beans.
Learn how spring di creates and manages beans in the application context, using component scanning, autowired wiring, and primary annotation to run espresso and latte instruction scenarios.
Explore Spring dependency injection by comparing constructor, setter, and field injection, using @Autowired and @Primary to manage two coffee instruction implementations in a barista app.
Explore Spring core concepts, including the Spring container, bean definitions, scopes, and lifecycle. Compare bean factory post processor and bean factory processor, and examine proxies in Spring AOP.
Understand how the Spring container stores and manages beans. Discover the three configuration approaches—XML, Java config, and annotations—and how the Spring container wires beans in application context.
Explore the Spring container hierarchy, comparing bean factory and application context, and learn how annotation config and classpath xml contexts create bean definitions and apply post processors.
Explore configuring the Spring container with XML, Java configurations, and annotations, create a Maven module, and add the Spring beans dependency to build a working app.
Explore the Spring container by creating a restaurant service that uses a cook interface with fast and slow cooks through dependency injection, enabling flexible order handling.
build a spring container with xml config, inject a cook into the restaurant service via an interface, and run a pizza order while swapping slow to fast cook in xml.
Configure the Spring container with Java config and annotations using an application config class, defining restaurant service and cook beans. Resolve missing bean issues by guiding Spring where to search.
Explore how the Spring container manages beans with and without @Configuration, observe cglib proxies in action, and learn how application config differs when using configuration annotations.
Apply @Component to classes and scan a base package so Spring creates beans. When multiple implementations exist, use primary annotation to choose the bean.
Explain the importance of the configuration annotation and how a Spring proxy ensures a single bean in the Spring container, preventing multiple object creations when calling cook.
Explore bean definition in the Spring container, including metadata, XML and Java configuration, and how a bean factory uses definitions to create beans. Examine abstract, generic, and annotated generic definitions.
Learn to create and inspect bean definitions in a Spring app, adjust scope and init/destroy methods, and transition from annotation config to a Java config class.
Explore how bean definitions differ between annotation-based components and Java configuration, as a restaurant service returns a cook implementation; understand how autowired mode changes and the role of configuration classes.
Create and register your own bean definition by specifying the bean name and bean class, and observe the init and destroy methods being invoked when you close the context.
Register properties, inject values into a bean, compare constructor versus init method, and demonstrate singleton versus prototype scope in Spring.
Explore singleton and prototype bean scopes in Spring, how singleton maps one bean definition to one instance, how prototype creates a new bean per request, and custom scope basics.
Explore how to inject prototype beans into a singleton in Spring, and learn four solutions—application context, lookup method, proxy mode, and bean factory supplier—for achieving true prototype behavior.
Explore bean scopes, including the default singleton and prototype injection into a singleton, and implement a custom bean using component and annotation-based configuration.
Explore prototype bean behavior and how ApplicationContextAware helps fetch a new cook bean per order to ensure a fresh instance rather than a singleton.
Explore bean scopes with prototype and proxy mode, showing how a prototype bean is created anew by a cglib or jdk dynamic proxy, and how lookup annotation guides proxy behavior.
Explore Spring bean scopes by building a supplier-based bean and a custom scope that uses autowired injection and reuses a bean for five seconds before recreating it.
Implement a custom Spring scope that reuses a bean for five seconds, creating a new bean if the previous one is older, and register destruction callback with the bean factory.
Learn how bean creation differs from bean initialization, and follow how bean definitions flow through the bean factory, bean post processors, and post construct methods for full configuration.
Learn how the bean life cycle works in Spring, including post construct and pre-destroy annotations, bean post processors, and three init/destroy approaches for singleton and prototype beans.
Explore the bean life cycle with @PostConstruct and @PreDestroy, analyze initialization order between slow cook and restaurant service, and learn why prototype beans are not destroyed by the container.
Explore the Spring bean life cycle by implementing init and destroy methods, using post construct and pre-destroy, and configuring via annotations or Java config for singleton and prototype beans.
Explore how @PostConstruct initializes beans and init method call order in Spring. Learn that post construct annotation on default interface methods is supported, while non-default interface methods aren't invoked.
Explore the Spring bean life cycle, prototype scope, and proxy with ApProxy, using a cglib target class and init method invocation. Note property injection order and application context aware behavior.
Explore the bean factory post processor (BFPP): how it retrieves and modifies bean definitions within the bean factory, the role of static methods, and how ordering interfaces control execution.
Practice lesson about bean factory post processor; create a custom annotation @InitMethod to call a specified init method. Explore two registration approaches using component and bean annotations.
Develop a custom bean factory postprocessor to scan bean definitions in our package, detect the init method annotation, and register and set each bean's init method name.
Master how to create and test a custom Spring bean factory post processor, register beans, and ensure post construct initialization works, highlighting the importance of static methods in lifecycle handling.
Explore how bean post processor works with bean factory post processor, detailing before and after initialization steps, bean vs proxy distinction, and the chain of responsibility among processors.
Create two custom bean post processors to practice preparing code for bean post processors, exploring postProcessBeforeInitialization, postProcessAfterInitialization, and postConstruct, with proxy, dynamic proxy, and cglib considerations.
Explore implementing a dynamic proxy via a bean post processor with an invocation handler. See how the proxy forwards methods to the target bean and impacts post construct annotations.
Learn to build dynamic and cglib proxies using enhancer, callback, and invocation handler, switch proxy types, and preserve the original bean for post processors through method interception.
Create a second bean post processor that enforces the @Critical annotation with a max time, uses reflection to time methods, and prints a warning when execution exceeds the limit.
Explore a dynamic proxy approach in Spring to enforce a critical annotation, measuring method execution time against a max threshold and emitting warnings when exceeded during a pizza order workflow.
Explore basic annotations like @Configuration, @ComponentScan, and @Import, and learn how configuration marks beans and bean methods for runtime retention, and how Spring scans packages to import components.
Discover the component annotation for auto-detected beans via component scan, the role of stereotypes (controller, service, repository), and how @Bean on methods registers named beans with optional multiple names.
Inject values with @Value and property sources, and control bean scope with @Scope for singleton or prototype, while understanding post construct and pre destroy lifecycle methods.
Master spring autowiring with @Autowired and @Qualifier in constructor, method, field injections. Learn how Spring resolves candidates via primary or bean name, and when no unique bean definition exception arises.
Master the Spring autowiring basics, including @Autowired with required=false, setter and field injection, collection and map injections, and using qualifiers and interfaces to inject all matching beans.
Explore how primary annotation prioritizes beans and how @Qualifier with custom qualifiers selects the correct bean for autowired injection, such as fast cook or slow cook.
Explore how autowired and qualifiers wire dependencies in Spring through hands-on practice, covering single vs multiple constructors, required and qualifier annotations, and injecting lists and maps of beans.
Learn setter-based dependency injection with @Autowired tricks, including required false and qualifiers, and compare the effects of labeled vs unlabeled injections while Spring injects lists and maps of beans.
Explore how Spring resolves autowired bean injection when multiple beans exist using primary annotations and qualifiers, and observe list versus string injections with different bean configurations.
Demonstrates using qualifiers to select between cook implementations, replaces primary with named qualifiers, and creates custom qualifiers to resolve duplicate injection issues in a bean-based DI setup.
Explore creating and using custom @Qualifier annotations in Spring to control bean injection, resolve multiple beans, and implement targeted qualifier strategies.
Explore how spring aop uses dynamic and cglib proxies to intercept methods. See interface-based dynamic proxies and target-class cglib proxies created with enhancer, including before and after method calls.
Explore how aspect-oriented programming uses aspects to apply common concerns like logging, security, and transactions to multiple methods, using proxies and an AspectJ expression and after advice.
Discover Spring AOP advice types: before, after, after returning, after throwing, and around, and how join points, order methods, and proceeding join points shape proxies, AspectJ, and auto proxy.
Learn practical spring aop concepts by building dynamic proxies and aspects, applying various advices, and implementing a custom annotation to replace bean post processors.
Compare cglib proxy and dynamic proxy in Spring aop, using enhancer and target class versus interface, and apply before advice with AspectJ auto proxy.
Explore auto proxy in Spring as a dynamic proxy wraps the restaurant service to apply @After advice after the order method. Understand proxy behavior and the final execution sequence.
Explore Spring AOP advices: after returning, after throwing, and finally, and master around advice with proceeding join point to control method execution and results.
Implement Spring AOP around advice for a critical annotation, capture method execution time, compare with max time, and log when exceeded.
Test Spring AOP in practice by using dynamic proxies and cli proxies, adjust proxy target class, and implement aspects with different advices around a critical annotation.
Master the Core Fundamentals of Spring Framework and Build Rock-Solid Java Applications
Are you ready to take your Java development skills to the next level? This comprehensive Spring Framework course will teach you everything you need to know about Spring's core concepts, from the ground up.
Why This Course?
Spring Framework is the most popular Java framework used by millions of developers worldwide. But here's the problem: most developers jump straight into Spring Boot without understanding the fundamental concepts that power it. This course fixes that by teaching you the core principles that make Spring so powerful.
What Makes This Course Different?
Deep Dive Into Core Concepts: Unlike surface-level tutorials, we explore how Spring actually works under the hood. You'll understand WHY things work, not just HOW to make them work.
Theory + Practice Approach: Every concept is explained theoretically first, then immediately reinforced with hands-on coding exercises using real-world examples like coffee shop and restaurant applications.
Professional Development Setup: Learn to work with IntelliJ IDEA like a pro, including project setup, navigation, and debugging techniques.
What You'll Master:
Section 1: Foundation Concepts
Inversion of Control (IoC): Understand this fundamental design principle and its relationship with SOLID principles
Dependency Injection: Master all three types of DI with practical implementations
IntelliJ IDEA Mastery: Complete IDE setup and project structure understanding
Section 2: Spring Core Deep Dive
Spring Container: Configure applications using XML, Java Config, and component scanning
Bean Definitions: Create and manipulate bean definitions programmatically
Bean Scopes: Master Singleton, Prototype, and custom scopes with real-world scenarios
Bean Lifecycle: Control bean initialization and destruction with various callback methods
Advanced Topics:
Bean Factory Post Processors (BFPP): Build custom processors to modify bean definitions
Bean Post Processors (BPP): Create powerful interceptors using dynamic proxies and CGLIB
Spring Annotations: Master @Configuration, @ComponentScan, @Autowired, @Qualifier, and more
Aspect-Oriented Programming (AOP): Implement cross-cutting concerns with various advice types
Hands-On Learning Experience
You'll build multiple practical applications throughout the course:
Coffee shop instruction system demonstrating IoC and DI
Restaurant service application showcasing Spring Container features
Custom annotation processors for real-world scenarios
AOP implementations for logging and error handling
Students Feebdack:
Over 500 students have already completed my Russian-language version of this course on Stepik platform.
"I really enjoyed the course. It will be very useful for beginners. I've been working as a Java developer for 5 years and decided to dive deeper into Spring out of curiosity. I definitely don't regret taking it - I learned something new and refreshed my knowledge on familiar topics."