<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Ayush Shrivastava</title>
    <description>The latest articles on Forem by Ayush Shrivastava (@ayshriv).</description>
    <link>https://forem.com/ayshriv</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1478693%2F668d3c7d-3081-4681-ad85-b8ba8a77286c.png</url>
      <title>Forem: Ayush Shrivastava</title>
      <link>https://forem.com/ayshriv</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ayshriv"/>
    <language>en</language>
    <item>
      <title>Building AI Applications with Spring AI and Azure OpenAI</title>
      <dc:creator>Ayush Shrivastava</dc:creator>
      <pubDate>Fri, 27 Feb 2026 09:54:46 +0000</pubDate>
      <link>https://forem.com/ayshriv/building-ai-applications-with-spring-ai-and-azure-openai-j6k</link>
      <guid>https://forem.com/ayshriv/building-ai-applications-with-spring-ai-and-azure-openai-j6k</guid>
      <description>&lt;p&gt;Artificial Intelligence is no longer optional for modern applications. Whether you're building a chatbot, developer assistant, FAQ engine, or content generator — AI integration is becoming a core backend requirement.&lt;/p&gt;

&lt;p&gt;If you're already a Spring Boot developer, the good news is: you don’t need to learn an entirely new ecosystem to build AI-powered apps.&lt;/p&gt;

&lt;p&gt;Thanks to Spring AI, integrating models like Azure OpenAI Service becomes clean, structured, and production-friendly.&lt;/p&gt;

&lt;p&gt;In this blog, I’ll walk you step-by-step through building a simple AI-powered REST API using Spring AI and Azure OpenAI.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. What is Spring AI?
&lt;/h2&gt;

&lt;p&gt;Spring AI is a Spring ecosystem project designed to simplify AI integration in Spring Boot applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Instead of manually:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Writing HTTP calls&lt;/li&gt;
&lt;li&gt;Handling authentication headers&lt;/li&gt;
&lt;li&gt;Parsing JSON responses&lt;/li&gt;
&lt;li&gt;Managing model-specific configurations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Spring AI provides clean abstractions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ChatClient&lt;/li&gt;
&lt;li&gt;EmbeddingClient&lt;/li&gt;
&lt;li&gt;Model abstraction layer&lt;/li&gt;
&lt;li&gt;Auto configuration support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you already know Spring Boot, you can start building AI applications almost immediately.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Why Do We Need Spring AI?
&lt;/h2&gt;

&lt;p&gt;Before Spring AI&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Developers had to:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Manually call REST APIs&lt;/li&gt;
&lt;li&gt;Handle authentication tokens&lt;/li&gt;
&lt;li&gt;Build request bodies&lt;/li&gt;
&lt;li&gt;Parse large AI responses&lt;/li&gt;
&lt;li&gt;Maintain provider-specific logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;This made code:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hard to maintain&lt;/li&gt;
&lt;li&gt;Hard to scale&lt;/li&gt;
&lt;li&gt;Difficult to switch AI providers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;With Spring AI&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clean dependency injection&lt;/li&gt;
&lt;li&gt;Simple configuration&lt;/li&gt;
&lt;li&gt;Provider abstraction&lt;/li&gt;
&lt;li&gt;Spring Boot auto configuration&lt;/li&gt;
&lt;li&gt;Production-ready structure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI calls now look like standard Spring code.&lt;/p&gt;

&lt;p&gt;That’s powerful.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Core Features of Spring AI
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;ChatClient&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Used for sending prompts and receiving AI-generated responses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model Abstraction&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Switch between providers (OpenAI, Azure OpenAI, etc.) without rewriting business logic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Auto Configuration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Works seamlessly with Spring Boot auto configuration.&lt;/p&gt;

&lt;p&gt;** Simple Prompt Handling**&lt;/p&gt;

&lt;p&gt;Send a message and receive output in just a few lines of code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Integration Friendly&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Works smoothly with:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;REST APIs&lt;/li&gt;
&lt;li&gt;Databases&lt;/li&gt;
&lt;li&gt;Microservices&lt;/li&gt;
&lt;li&gt;Cloud deployments&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Project Setup Overview
&lt;/h2&gt;

&lt;p&gt;Let’s understand the project architecture step by step.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We are building:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Spring Boot application&lt;/li&gt;
&lt;li&gt;Connected to Azure OpenAI&lt;/li&gt;
&lt;li&gt;Exposing a REST endpoint&lt;/li&gt;
&lt;li&gt;Secured using environment variables&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Maven Dependencies Explained
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Spring Boot Parent&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Provides dependency management and plugin configuration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spring Web MVC&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Used to build REST APIs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spring AI Azure OpenAI Starter&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Connects your application with Azure OpenAI service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spring AI BOM&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Manages compatible versions of Spring AI libraries.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DevTools&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Used for development-time restart.&lt;/p&gt;

&lt;p&gt;** Test Dependency**&lt;/p&gt;

&lt;p&gt;Used for writing unit and integration tests.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. application.properties Explained
&lt;/h2&gt;

&lt;p&gt;`spring.application.name=openai&lt;/p&gt;

&lt;p&gt;spring.ai.azure.openai.api-key=${AZURE_OPENAI_API_KEY}&lt;br&gt;
spring.ai.azure.openai.endpoint=${AZURE_OPENAI_ENDPOINT}&lt;br&gt;
spring.ai.azure.openai.chat.options.deployment-name=${AZURE_OPENAI_DEPLOYMENT}&lt;br&gt;
spring.ai.azure.openai.chat.options.temperature=1&lt;br&gt;
`&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explanation&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;application.name → Name of your application&lt;/li&gt;
&lt;li&gt;api-key → Azure OpenAI API key (from environment variable)&lt;/li&gt;
&lt;li&gt;endpoint → Azure endpoint URL&lt;/li&gt;
&lt;li&gt;deployment-name → Your deployed model name&lt;/li&gt;
&lt;li&gt;temperature → Controls AI creativity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using environment variables is a secure way to manage secrets.&lt;/p&gt;

&lt;p&gt;Never hardcode your API keys.&lt;/p&gt;
&lt;h2&gt;
  
  
  7. Main Application Class
&lt;/h2&gt;

&lt;p&gt;`@SpringBootApplication&lt;br&gt;
public class OpenaiApplication {&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public static void main(String[] args) {
    SpringApplication.run(OpenaiApplication.class, args);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;br&gt;
`&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explanation&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;@SpringBootApplication → Enables auto configuration &amp;amp; component scanning&lt;/li&gt;
&lt;li&gt;SpringApplication.run() → Starts the application&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the entry point of your backend.&lt;/p&gt;
&lt;h2&gt;
  
  
  8. Chat Controller Explained
&lt;/h2&gt;

&lt;p&gt;`@RestController&lt;br&gt;
@RequestMapping("/api")&lt;br&gt;
public class ChatController {&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;private final ChatClient chatClient;

public ChatController(ChatClient.Builder chatClientBuilder) {
    this.chatClient = chatClientBuilder.build();
}

@GetMapping("/chat")
public String chat(@RequestParam("message") String message) {
    return chatClient
            .prompt(message)
            .call()
            .content();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;br&gt;
`&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;@RestController&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Marks the class as a REST controller.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;@RequestMapping("/api")&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Base URL path.&lt;/p&gt;

&lt;p&gt;ChatClient Injection&lt;/p&gt;

&lt;p&gt;Spring automatically provides ChatClient.Builder.&lt;/p&gt;

&lt;p&gt;We build it using:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;chatClientBuilder.build();&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;/chat Endpoint&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;http://localhost:8080/api/chat?message=Hello&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Final Summary
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Using:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spring Boot&lt;/li&gt;
&lt;li&gt;Spring AI&lt;/li&gt;
&lt;li&gt;Azure OpenAI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You created an intelligent backend system with minimal code.&lt;/p&gt;

&lt;p&gt;Spring AI removes complexity and makes AI integration feel native to Spring developers.&lt;/p&gt;

&lt;p&gt;This is the modern way of building intelligent backend applications using Java.&lt;/p&gt;
&lt;h2&gt;
  
  
  Source Code
&lt;/h2&gt;

&lt;p&gt;You can find the complete project here:&lt;/p&gt;
&lt;h2&gt;
  
  
  GitHub Repository:
&lt;/h2&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/ayushstwt" rel="noopener noreferrer"&gt;
        ayushstwt
      &lt;/a&gt; / &lt;a href="https://github.com/ayushstwt/spring-ai-azure-openai-chat-api" rel="noopener noreferrer"&gt;
        spring-ai-azure-openai-chat-api
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Demo project for Spring Ai and OpenAI
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Building AI Applications with Spring AI and Azure OpenAI&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Author: Ayush Shrivastava&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;1. What is Spring AI?&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Spring AI is a Spring ecosystem project that helps developers build
AI-powered applications using simple and familiar Spring Boot concepts.&lt;/p&gt;
&lt;p&gt;It provides integration with popular AI providers like OpenAI and Azure
OpenAI. Instead of writing complex HTTP calls manually, Spring AI gives
you ready-to-use abstractions like ChatClient, EmbeddingClient, and
more.&lt;/p&gt;
&lt;p&gt;If you already know Spring Boot, you can easily start building AI
applications without learning new complicated frameworks.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;2. Why Do We Need Spring AI?&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Before Spring AI: - Developers had to manually call REST APIs. - They
had to handle authentication, request bodies, and response parsing. -
Code became complex and hard to maintain.&lt;/p&gt;
&lt;p&gt;With Spring AI: - Configuration is simple. - Dependency injection works
as usual. - AI calls look clean and readable. - It integrates smoothly
with Spring Boot projects.&lt;/p&gt;…&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/ayushstwt/spring-ai-azure-openai-chat-api" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




</description>
      <category>ai</category>
      <category>azure</category>
      <category>openai</category>
      <category>java</category>
    </item>
    <item>
      <title>Building an AI Chat Application with Spring AI and OpenAI</title>
      <dc:creator>Ayush Shrivastava</dc:creator>
      <pubDate>Sat, 01 Nov 2025 21:15:16 +0000</pubDate>
      <link>https://forem.com/ayshriv/building-an-ai-chat-application-with-spring-ai-and-openai-40kj</link>
      <guid>https://forem.com/ayshriv/building-an-ai-chat-application-with-spring-ai-and-openai-40kj</guid>
      <description>&lt;h2&gt;
  
  
  Building a Chat Application Backend with Spring AI and OpenAI
&lt;/h2&gt;

&lt;p&gt;Artificial Intelligence is rapidly becoming an essential part of modern applications. From improving automation to enhancing user experience, AI continues to redefine how software systems interact and respond. One of the most practical and engaging ways to explore AI is through chat-based applications, where intelligent responses and contextual understanding create more human-like interactions.&lt;/p&gt;

&lt;p&gt;Recently, I started working on a Chat Application Backend that integrates Spring AI with OpenAI to generate real-time, AI-powered responses. The goal of this project is to build a simple yet extendable backend foundation for future conversational and intelligent chat features.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction to Spring AI
&lt;/h2&gt;

&lt;p&gt;Spring AI is an emerging project from the Spring Team designed to simplify the integration of artificial intelligence models into Spring Boot applications. It provides a structured way to connect with AI providers like OpenAI and allows developers to work with AI models using familiar Spring concepts.&lt;/p&gt;

&lt;p&gt;Instead of manually handling complex API calls, Spring AI offers clean abstractions that let developers easily send prompts, receive responses, and manage context. This makes it an ideal choice for teams already using Spring Boot who want to experiment with or deploy AI-driven features quickly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction to OpenAI
&lt;/h2&gt;

&lt;p&gt;OpenAI is a leading organization in the field of artificial intelligence, best known for its large language models such as GPT-4. These models can process and generate human-like text, answer questions, write code, and assist in natural conversations. Integrating OpenAI’s models into backend systems opens new possibilities, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Smart chatbots and conversational agents&lt;/li&gt;
&lt;li&gt;Personalized recommendations&lt;/li&gt;
&lt;li&gt;Context-aware assistants and feedback systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By combining OpenAI with Spring AI, developers can bring intelligent behavior directly into their applications with minimal setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  About the Project
&lt;/h2&gt;

&lt;p&gt;This project provides the initial backend setup for a chat system built using Spring Boot and Spring AI. It focuses on creating a clean, modular, and easily extendable structure for building AI-driven chat systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Features:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;REST APIs for sending user messages and receiving AI-generated responses&lt;/li&gt;
&lt;li&gt;Integration with OpenAI through Spring AI&lt;/li&gt;
&lt;li&gt;Real-time response generation using HTTP endpoints&lt;/li&gt;
&lt;li&gt;Scalable architecture for adding future chat-related features&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The application workflow is straightforward:&lt;/li&gt;
&lt;li&gt;A user sends a message to the backend via an API endpoint.&lt;/li&gt;
&lt;li&gt;The backend receives the message and passes it to Spring AI.&lt;/li&gt;
&lt;li&gt;Spring AI communicates with the OpenAI model to generate a response.&lt;/li&gt;
&lt;li&gt;The AI-generated response is instantly returned to the client.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This foundation makes it possible to extend the system with advanced features such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Conversation history and context management&lt;/li&gt;
&lt;li&gt;Authentication and user session handling&lt;/li&gt;
&lt;li&gt;Frontend chat integration for real-time interactions&lt;/li&gt;
&lt;li&gt;Streaming responses for a smoother experience&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Repository
&lt;/h2&gt;

&lt;p&gt;The complete source code and setup guide are available here:&lt;br&gt;
GitHub Repository – ChatApp Backend&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Final Thoughts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This project represents an initial step toward exploring how AI can enhance chat-based systems using Spring Boot. It demonstrates how developers can integrate Spring AI to create intelligent, responsive, and context-aware applications.&lt;/p&gt;

&lt;p&gt;If you are interested in learning or experimenting with Spring AI and OpenAI, you can explore the repository, run the project locally, and build upon it to create your own intelligent systems.&lt;/p&gt;

</description>
      <category>springboot</category>
      <category>openai</category>
      <category>chatgpt</category>
      <category>ayshirv</category>
    </item>
    <item>
      <title>Spring Boot + Redis + Docker: Ultimate Guide to Caching in Java</title>
      <dc:creator>Ayush Shrivastava</dc:creator>
      <pubDate>Tue, 20 May 2025 09:32:05 +0000</pubDate>
      <link>https://forem.com/masteringbackend/spring-boot-redis-docker-ultimate-guide-to-caching-in-java-31k</link>
      <guid>https://forem.com/masteringbackend/spring-boot-redis-docker-ultimate-guide-to-caching-in-java-31k</guid>
      <description>&lt;p&gt;With Redis, your Spring Boot app can become faster and handle more traffic without breaking a sweat. This article will show you how to set it up step by step. However, before diving deep into Redis, we need to understand the concept of &lt;strong&gt;caching&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Cache&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Cache is a fast, small, temporary storage frequently used by the computer or application to store and access important data. &lt;/p&gt;

&lt;p&gt;It stores data in a key-value format. By leveraging cache memory, we can minimize database calls, improving application performance since database queries are typically resource-intensive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The main objective of a cache is to speed up the retrieval of data by making a copy of the data in a location that can be accessed faster than the source or database.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A cache is a small and fast, efficient memory space that an application frequently uses to store or access important data.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="" class="article-body-image-wrapper"&gt;&lt;img alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Caching?
&lt;/h3&gt;

&lt;p&gt;The main objective of a cache is to speed up the retrieval of data by making a copy of the data in a location that can be accessed faster than the source or database.&lt;/p&gt;

&lt;p&gt;In our application, whenever multiple requests access static data (data that is not changed frequently), we fetch the data from the database every time. Therefore, the number of database calls increases, which affects the performance of our application because database calls are always costly.&lt;/p&gt;

&lt;p&gt;However, the static data can be stored in a cache, and whenever a request is made to access the data, it is fetched from the cache. As a result, the number of database calls is reduced, and the application's performance is improved.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;How does a Cache work?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;In the diagram above, multiple requests made to access the data in the application will first check the cache to determine whether the data is present. If the data is found, it is returned from the cache, a concept known as a &lt;em&gt;Cache Hit&lt;/em&gt;. If the data is not found, it is retrieved from the database, which is referred to as a &lt;em&gt;Cache Miss&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Cache Hit&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Data is found in the cache, so it has to be fetched from a faster source.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We can understand the cache hit like this: imagine you have a notebook where you write down answers to questions you frequently ask. You ask a question, and the answer is already written in your notebook. you quickly find it without searching elsewhere.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Cache Miss&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Data is not found in the cache, so it has to be fetched from a slower source.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Similarly, you asked a question, but it’s not in your notebook. You have to search in a big textbook (which takes more time) and then write the answer in your notebook for future use.&lt;/p&gt;

&lt;h2&gt;
  
  
  Redis
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwho7xe6iopxn2uwli0st.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwho7xe6iopxn2uwli0st.png" width="512" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Redis (Remote Dictionary Server) is an open-source, in-memory key-value data store that supports various data structures, including strings, lists, sets, and hashes. Its in-memory architecture ensures high performance, making it an ideal choice for caching and session management in modern applications.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;spring-boot-starter-redis&lt;/strong&gt; is a Spring Boot starter that simplifies integrating Redis into Spring applications. It includes all the necessary dependencies to connect, configure, and operate with Redis.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-data-redis&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Spring Boot provides the &lt;code&gt;spring-boot-starter-redis&lt;/code&gt; starter, enabling seamless communication with the Redis server. It includes various components that facilitate efficient interaction with Redis.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;JedisConnectionFactory&lt;/strong&gt;: Manages and establishes the connection between the Spring Boot application and the Redis server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RedisTemplate&lt;/strong&gt;: It provides methods to perform operations like saving, retrieving, and deleting data in Redis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;StringRedisTemplate&lt;/strong&gt;: A specialized version of &lt;code&gt;RedisTemplate&lt;/code&gt; that simplifies operations for String-based keys and values.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpsForValue&lt;/strong&gt;: Supports operations on simple key-value pairs in Redis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpsForHash&lt;/strong&gt;: It is providing methods to peform operations based on Hash Data structure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpsForList&lt;/strong&gt;: Provides methods to interact with Redis Lists.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpsForSet&lt;/strong&gt;: Facilitates operations on Redis Sets.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Spring Boot with Redis Integration
&lt;/h2&gt;

&lt;p&gt;Spring Boot provides seamless integration with Redis, an in-memory data store, through the &lt;code&gt;spring-boot-starter-redis&lt;/code&gt; starter. It simplifies configuration and enables developers to use Redis for caching, messaging, and data persistence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prerequisites for Running the Spring Boot Redis Integration Project&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Redis Server (Local or Cloud-based; here we use docker)&lt;/li&gt;
&lt;li&gt;Java Development Kit (JDK 17 or above)&lt;/li&gt;
&lt;li&gt;Maven (Build tool)&lt;/li&gt;
&lt;li&gt;IDE (e.g., IntelliJ IDEA, Eclipse, or Spring Tool Suite)&lt;/li&gt;
&lt;li&gt;Postman (Optional, for testing REST APIs)&lt;/li&gt;
&lt;li&gt;Project Build Using Maven&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Docker Redis Setup&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;In this article, we install Redis using Docker. We can also manually download it from the Redis website, but here, we download the &lt;a href="https://hub.docker.com/_/redis/tags" rel="noopener noreferrer"&gt;latest Redis image from Docker Hub&lt;/a&gt; (ensure Docker is already installed on your machine).&lt;/p&gt;

&lt;p&gt;We have a sample spring-boot application that you &lt;a href="https://github.com/ayushstwt/product-api" rel="noopener noreferrer"&gt;clone from Github&lt;/a&gt; for initial setup. The initial code is available in the main branch, so please checkout to the main or redis integration branch. I also added the postman collection on the root directory of the project so you can test all the API before integration.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Steps to Integrate Redis with Spring Boot&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Add the Maven dependency in the &lt;code&gt;pom.xml&lt;/code&gt; file. Since we are using Docker, we also include the Docker Compose dependency.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-redis&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-docker-compose&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;scope&amp;gt;&lt;/span&gt;runtime&lt;span class="nt"&gt;&amp;lt;/scope&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Configure Redis Connection or database connection (we’re using H2 as database). Add the Redis server configuration to &lt;strong&gt;&lt;code&gt;application.properties&lt;/code&gt;&lt;/strong&gt; or &lt;strong&gt;&lt;code&gt;application.yml&lt;/code&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;spring.application.name=spring-boot-redis-cache

spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true

spring.cache.type=redis
spring.data.redis.host=localhost
spring.data.redis.port=6379

# if we are using local redis or cloud but here we use docker so there is no need of username or password
spring.data.redis.username=
spring.data.redis.password=
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Create the &lt;code&gt;docker-compose.yml&lt;/code&gt; file on the root folder with the same naming convention we follow for docker-redis configurations.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;redis&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;redis:7.4.2&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;6379:6379&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Mark the spring-boot application class as &lt;code&gt;@EnableCaching&lt;/code&gt; to enable caching in our Spring Boot application. To enable caching in our Spring Boot application, add the &lt;code&gt;@EnableCaching&lt;/code&gt; annotation to one of our configuration classes. This annotation triggers a post-processor that inspects each Spring bean for caching annotations.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.ayshriv.springbootrediscache&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.boot.SpringApplication&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.boot.autoconfigure.SpringBootApplication&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.cache.annotation.EnableCaching&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@SpringBootApplication&lt;/span&gt;
&lt;span class="nd"&gt;@EnableCaching&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SpringBootRedisCacheApplication&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;SpringApplication&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;SpringBootRedisCacheApplication&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Create the class &lt;code&gt;RedisConfig.class&lt;/code&gt; inside the config package
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.ayshriv.springbootrediscache.config&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.techie.springbootrediscache.dto.ProductDto&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.context.annotation.Bean&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.context.annotation.Configuration&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.data.redis.cache.RedisCacheConfiguration&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.data.redis.cache.RedisCacheManager&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.data.redis.connection.RedisConnectionFactory&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.data.redis.serializer.RedisSerializationContext&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.time.Duration&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@Configuration&lt;/span&gt;  &lt;span class="c1"&gt;// Marks this class as a Spring configuration class&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;RedisConfig&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@Bean&lt;/span&gt;  &lt;span class="c1"&gt;// Defines a Spring bean for RedisCacheManager&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;RedisCacheManager&lt;/span&gt; &lt;span class="nf"&gt;redisCacheManager&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;RedisConnectionFactory&lt;/span&gt; &lt;span class="n"&gt;redisConnectionFactory&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Define cache configuration&lt;/span&gt;
        &lt;span class="nc"&gt;RedisCacheConfiguration&lt;/span&gt; &lt;span class="n"&gt;cacheConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;RedisCacheConfiguration&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;defaultCacheConfig&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;entryTtl&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Duration&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ofMinutes&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;// Set time-to-live (TTL) for cache entries to 10 minutes&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;disableCachingNullValues&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;// Prevent caching of null values&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;serializeValuesWith&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;RedisSerializationContext&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;SerializationPair&lt;/span&gt;
                        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fromSerializer&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Jackson2JsonRedisSerializer&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;(&lt;/span&gt;&lt;span class="nc"&gt;ProductDto&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;)));&lt;/span&gt; &lt;span class="c1"&gt;// Serialize values using Jackson JSON serializer&lt;/span&gt;

        &lt;span class="c1"&gt;// Create and return a RedisCacheManager with the specified configuration&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;RedisCacheManager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;redisConnectionFactory&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cacheDefaults&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cacheConfig&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Apply default cache configuration&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This class configures Redis caching in a Spring Boot application. The &lt;code&gt;@Configuration&lt;/code&gt; annotation marks it as a configuration class, and the &lt;code&gt;@Bean&lt;/code&gt; annotation defines a &lt;code&gt;RedisCacheManager&lt;/code&gt; bean. &lt;/p&gt;

&lt;p&gt;The cache configuration includes a time-to-live (TTL) of 10 minutes (&lt;code&gt;Duration.ofMinutes(10)&lt;/code&gt;), which ensures that cached data expires automatically after this period. It also disables the caching of &lt;code&gt;null&lt;/code&gt; values (&lt;code&gt;disableCachingNullValues()&lt;/code&gt;) to optimize memory usage.&lt;/p&gt;

&lt;p&gt;For serialization, the &lt;code&gt;Jackson2JsonRedisSerializer&lt;/code&gt; is used, which converts Java objects (&lt;code&gt;ProductDto&lt;/code&gt;) to JSON before storing them in Redis. This ensures that cached data remains structured and readable. &lt;/p&gt;

&lt;p&gt;The &lt;code&gt;RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(cacheConfig).build()&lt;/code&gt; method initializes the cache manager with the given configuration and connects it to the Redis database using &lt;code&gt;RedisConnectionFactory&lt;/code&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;After doing all the configurations, we implement the caching on the business class (service class).
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.ayshriv.springbootrediscache.service&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.techie.springbootrediscache.dto.ProductDto&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.techie.springbootrediscache.entity.Product&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.techie.springbootrediscache.repository.ProductRepository&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.cache.annotation.CacheEvict&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.cache.annotation.CachePut&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.cache.annotation.Cacheable&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.stereotype.Service&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@Service&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProductService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;ProductRepository&lt;/span&gt; &lt;span class="n"&gt;productRepository&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;ProductService&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ProductRepository&lt;/span&gt; &lt;span class="n"&gt;productRepository&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;productRepository&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;productRepository&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@CachePut&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"PRODUCT_CACHE"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"#result.id"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;ProductDto&lt;/span&gt; &lt;span class="nf"&gt;createProduct&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ProductDto&lt;/span&gt; &lt;span class="n"&gt;productDto&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setName&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;productDto&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
        &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setPrice&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;productDto&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;price&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;

        &lt;span class="nc"&gt;Product&lt;/span&gt; &lt;span class="n"&gt;savedProduct&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;productRepository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;save&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ProductDto&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;savedProduct&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getId&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;savedProduct&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getName&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt;
                &lt;span class="n"&gt;savedProduct&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getPrice&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Cacheable&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"PRODUCT_CACHE"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"#productId"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;ProductDto&lt;/span&gt; &lt;span class="nf"&gt;getProduct&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;productId&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Product&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;productRepository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findById&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;productId&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;orElseThrow&lt;/span&gt;&lt;span class="o"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Cannot find product with id "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;productId&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ProductDto&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getId&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getName&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt;
                &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getPrice&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@CachePut&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"PRODUCT_CACHE"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"#result.id"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;ProductDto&lt;/span&gt; &lt;span class="nf"&gt;updateProduct&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ProductDto&lt;/span&gt; &lt;span class="n"&gt;productDto&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;productId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;productDto&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="nc"&gt;Product&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;productRepository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findById&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;productId&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;orElseThrow&lt;/span&gt;&lt;span class="o"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Cannot find product with id "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;productId&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;

        &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setName&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;productDto&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
        &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setPrice&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;productDto&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;price&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;

        &lt;span class="nc"&gt;Product&lt;/span&gt; &lt;span class="n"&gt;updatedProduct&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;productRepository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;save&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ProductDto&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;updatedProduct&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getId&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;updatedProduct&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getName&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt;
                &lt;span class="n"&gt;updatedProduct&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getPrice&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@CacheEvict&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"PRODUCT_CACHE"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"#productId"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;deleteProduct&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;productId&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;productRepository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;deleteById&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;productId&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When we mark the &lt;code&gt;createProduct()&lt;/code&gt; method with this &lt;strong&gt;&lt;code&gt;@CachePut(value = "PRODUCT_CACHE", key = "#[result.id](http://result.id/)")&lt;/code&gt;&lt;/strong&gt; annotation, this ensures that the object returned by this method is stored or updated in the cache name &lt;code&gt;PRODUCT_CACHE&lt;/code&gt;, and the key part specifies that the cache key should be the ID of the returned &lt;code&gt;ProductDto&lt;/code&gt; object.&lt;/p&gt;

&lt;p&gt;This is useful in scenarios where a new product is created or an existing product is updated, as it ensures that the latest product details are stored in the cache. By using this annotation, subsequent requests for the same product can be served quickly from the cache, &lt;strong&gt;reducing database queries and improving application performance&lt;/strong&gt; while keeping the cache up to date.&lt;/p&gt;

&lt;p&gt;Next, when we mark the &lt;code&gt;getProductById()&lt;/code&gt; method with this &lt;strong&gt;&lt;code&gt;@Cacheable(value = "PRODUCT_CACHE", key = "#productId")&lt;/code&gt;&lt;/strong&gt; annotation, this ensures that the returned object by this method is &lt;strong&gt;stored in the cache&lt;/strong&gt; named &lt;code&gt;"PRODUCT_CACHE"&lt;/code&gt;, and the &lt;code&gt;key&lt;/code&gt; part specifies that the cache key should be the &lt;code&gt;productId&lt;/code&gt; parameter passed to the method.&lt;/p&gt;

&lt;p&gt;If the requested &lt;code&gt;productId&lt;/code&gt; is already present in the cache, the method &lt;strong&gt;skips execution&lt;/strong&gt; and directly returns the cached value, avoiding a database call. However, if the &lt;code&gt;productId&lt;/code&gt; is not found in the cache, the method executes, retrieves the product from the database, &lt;strong&gt;stores the result in the cache&lt;/strong&gt;, and then returns it.&lt;/p&gt;

&lt;p&gt;When we mark the &lt;code&gt;deleteProduct()&lt;/code&gt; method with this &lt;strong&gt;&lt;code&gt;@CacheEvict(value = "PRODUCT_CACHE", key = "#productId")&lt;/code&gt;&lt;/strong&gt; annotation, this ensures that the &lt;strong&gt;cache entry associated with the given &lt;code&gt;productId&lt;/code&gt; is removed&lt;/strong&gt; from the cache named &lt;code&gt;"PRODUCT_CACHE"&lt;/code&gt;. The &lt;code&gt;key&lt;/code&gt; part specifies that the cache key to be evicted is the &lt;code&gt;productId&lt;/code&gt; parameter passed to the method.&lt;/p&gt;

&lt;p&gt;This means that after deleting a product from the database, its cached entry will also be removed, ensuring that &lt;strong&gt;stale data is not served from the cache&lt;/strong&gt; in future requests. If the deleted product is requested again, it will be fetched from the database and re-cached if applicable.&lt;/p&gt;

&lt;p&gt;Here, we do all the things with the help of the annotation-based approach but we can also do the same things with the help of &lt;code&gt;CacheManager&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;CacheManager&lt;/code&gt; is a &lt;strong&gt;Spring framework interface&lt;/strong&gt; responsible for managing different cache implementations. It acts as a central mechanism to store, retrieve, and manage cached data efficiently.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;CacheManager&lt;/span&gt; &lt;span class="n"&gt;cacheManager&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;ProductDto&lt;/span&gt; &lt;span class="nf"&gt;createProduct&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ProductDto&lt;/span&gt; &lt;span class="n"&gt;productDto&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setName&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;productDto&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
        &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setPrice&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;productDto&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;price&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;

        &lt;span class="nc"&gt;Product&lt;/span&gt; &lt;span class="n"&gt;savedProduct&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;productRepository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;save&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;Cache&lt;/span&gt; &lt;span class="n"&gt;productCache&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cacheManager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getCache&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"PRODUCT_CACHE"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;productCache&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;savedProduct&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getId&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;savedProduct&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ProductDto&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;savedProduct&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getId&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;savedProduct&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getName&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt;
                &lt;span class="n"&gt;savedProduct&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getPrice&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Test the application&lt;/strong&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;ADD-PRODUCT: &lt;a href="http://localhost:8080/api/product" rel="noopener noreferrer"&gt;http://localhost:8080/api/product&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;GET-PRODUCT: &lt;a href="http://localhost:8080/api/product/3" rel="noopener noreferrer"&gt;http://localhost:8080/api/product/3&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;UPDATE PRODUCT: &lt;a href="http://localhost:8080/api/product" rel="noopener noreferrer"&gt;http://localhost:8080/api/product&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DELETE PRODUCT: &lt;a href="http://localhost:8080/api/product/2" rel="noopener noreferrer"&gt;http://localhost:8080/api/product/2&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Redis with Spring Boot makes apps faster by caching data and reducing database calls. Using &lt;code&gt;@Cacheable&lt;/code&gt;, &lt;code&gt;@CachePut&lt;/code&gt;, and &lt;code&gt;@CacheEvict&lt;/code&gt;, we can easily store, update, and delete cached data. This improves speed, reduces server load, and helps the app handle more users smoothly.&lt;/p&gt;

&lt;p&gt;When we are performing the create operation, then the response of this operation is stored in the cache so whenever we perform operations like the &lt;code&gt;getProduct()&lt;/code&gt; it checks the product in the cache first, if the product is present inside the cache, it returns that if not then it will return from the database. &lt;/p&gt;

&lt;p&gt;Similarly, when we perform the delete operation, first it deletes the data from the database and then deletes it from the cache as well. All these types of operations reduce the number of DB calls so the performance of the application is increased.&lt;/p&gt;

</description>
      <category>java</category>
      <category>ayshriv</category>
      <category>redis</category>
      <category>springboot</category>
    </item>
    <item>
      <title>OOPs in Java: Principles, Concepts, and Real-World Examples</title>
      <dc:creator>Ayush Shrivastava</dc:creator>
      <pubDate>Tue, 20 May 2025 09:29:49 +0000</pubDate>
      <link>https://forem.com/masteringbackend/oops-in-java-principles-concepts-and-real-world-examples-3m9j</link>
      <guid>https://forem.com/masteringbackend/oops-in-java-principles-concepts-and-real-world-examples-3m9j</guid>
      <description>&lt;h2&gt;
  
  
  Object-Oriented Programming
&lt;/h2&gt;

&lt;p&gt;OOP stands for object-oriented programming. It is a programming paradigm that revolves around the object rather than function and procedure. In other words, it is an approach for developing applications that emphasize on objects. An object is a real&lt;br&gt;
word entity that contains data and code. It allows binding data and code together. here objects means real world entity like car, bike, atm etc.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Procedural Programming&lt;/th&gt;
&lt;th&gt;OOPS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;programs are divided into parts called functions&lt;/td&gt;
&lt;td&gt;Programs are divided into objects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Overloading is not possible&lt;/td&gt;
&lt;td&gt;Overloading is possible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inheritance is not possible&lt;/td&gt;
&lt;td&gt;Inheritance is  possible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data hiding is not present&lt;/td&gt;
&lt;td&gt;Data hiding is present&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;It follows a top-down approach&lt;/td&gt;
&lt;td&gt;It follows a bottom-up approach&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;It focuses on the process.&lt;/td&gt;
&lt;td&gt;It focuses on data.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ex:- C, Pascal etc.&lt;/td&gt;
&lt;td&gt;Ex:- Java, C++, Python etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;OOP Concepts in Java&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Java follows Object-Oriented Programming (OOP), which is based on the following &lt;strong&gt;nine&lt;/strong&gt; key concepts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Class&lt;/strong&gt; – A blueprint for creating objects.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Object&lt;/strong&gt; – An instance of a class with state and behavior.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Encapsulation&lt;/strong&gt; – Hiding internal details and exposing only the necessary parts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Polymorphism&lt;/strong&gt; – The ability to take multiple forms (method overloading &amp;amp; overriding).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inheritance&lt;/strong&gt; – Acquiring properties and behaviors from a parent class.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Abstraction&lt;/strong&gt; – Hiding implementation details and showing only essential features.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Association&lt;/strong&gt; – A relationship between two classes without ownership.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Composition&lt;/strong&gt; – A strong association where one class owns another.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;The Four Pillars of OOP&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;These are the core principles of OOP in Java:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Encapsulation&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inheritance&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Polymorphism&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Abstraction&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: Concepts and pillars are different. Java has 8 main concepts, but only 4 pillars of OOP.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Benefits of OOP in Java&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Reusability&lt;/strong&gt; – Write once, use multiple times to reduce redundancy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Redundancy&lt;/strong&gt; – Avoids duplication by using shared class definitions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code Maintenance&lt;/strong&gt; – Easier to update and manage code efficiently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt; – Encapsulation and abstraction restrict unnecessary data access.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Easy Troubleshooting&lt;/strong&gt; – Objects simplify debugging and modification.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better Design&lt;/strong&gt; – Stable base classes reduce errors in derived classes.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  1. Class
&lt;/h3&gt;

&lt;p&gt;A class in java a blueprint or template of an object from where an object is created. it doesn’t take space in the memory. It is a user-defined data type. Inside a class, we define variables, constants, functions. It is example of data binding. it is a logical entity.&lt;/p&gt;

&lt;p&gt;Syntax&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ClassName&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Fields (variables)&lt;/span&gt;

    &lt;span class="c1"&gt;// Constructors&lt;/span&gt;

    &lt;span class="c1"&gt;// Methods&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Object
&lt;/h3&gt;

&lt;p&gt;An Object is a real world entity that has attributes, behavior, and properties. It is referred to as an instance of the class. It contains member functions, variables that we have defined in the class. It occupies space in the memory. Different objects have&lt;br&gt;
different states or attributes, and behaviors.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Object is a real world entity, every object have state and behavior state tell us how the object looks like and behavior tell us what the object does.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Syntax&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;ClassName&lt;/span&gt; &lt;span class="n"&gt;objectName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ClassName&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;  

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Class&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Object&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;It is a logical entity&lt;/td&gt;
&lt;td&gt;It is a real-world entity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;It is a based on concepts.&lt;/td&gt;
&lt;td&gt;It is based on real world&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;It uses the keyword class when declared.&lt;/td&gt;
&lt;td&gt;It uses the new keyword to create an object.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;It does not occupy space in the memory.&lt;/td&gt;
&lt;td&gt;It occupies space in the memory.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;It is a data type that represents the blueprint of an&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;object.&lt;/td&gt;
&lt;td&gt;It is an instance of the class.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="" class="article-body-image-wrapper"&gt;&lt;img alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;here car is a object is class and the Audi, BMW is a instance of that class. so all the properties and behavior of the class is also present in its instance.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Car&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

        &lt;span class="c1"&gt;// state&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;brand&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;speed&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Constructor&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Car&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;brand&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;brand&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;brand&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;speed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Initial speed&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;//behavior&lt;/span&gt;

    &lt;span class="c1"&gt;// Method to increase speed&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;increaseSpeed&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;increment&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;speed&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;increment&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;brand&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" speed increased to "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;speed&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" km/h"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Method to apply brake&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;applyBrake&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;decrement&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;speed&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="n"&gt;decrement&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;speed&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;speed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;brand&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" speed reduced to "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;speed&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" km/h"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Method to drive&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;drive&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;brand&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" is driving at "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;speed&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" km/h"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Method to display car details&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;displayDetails&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Brand: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;brand&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;", Type: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;", Color: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Car&lt;/span&gt; &lt;span class="n"&gt;audi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Car&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Red"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Sedan"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Audi"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;Car&lt;/span&gt; &lt;span class="n"&gt;bmw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Car&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Blue"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"SUV"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"BMW"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="n"&gt;audi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;displayDetails&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;audi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;increaseSpeed&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;audi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;drive&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;audi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;applyBrake&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

        &lt;span class="n"&gt;bmw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;displayDetails&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;bmw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;increaseSpeed&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;bmw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;drive&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;bmw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;applyBrake&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nl"&gt;Brand:&lt;/span&gt; &lt;span class="nc"&gt;Audi&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;Type:&lt;/span&gt; &lt;span class="nc"&gt;Sedan&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;Color:&lt;/span&gt; &lt;span class="nc"&gt;Red&lt;/span&gt;
&lt;span class="nc"&gt;Audi&lt;/span&gt; &lt;span class="n"&gt;speed&lt;/span&gt; &lt;span class="n"&gt;increased&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt; &lt;span class="n"&gt;km&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;
&lt;span class="nc"&gt;Audi&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;driving&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt; &lt;span class="n"&gt;km&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;
&lt;span class="nc"&gt;Audi&lt;/span&gt; &lt;span class="n"&gt;speed&lt;/span&gt; &lt;span class="n"&gt;reduced&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="n"&gt;km&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;

&lt;span class="nl"&gt;Brand:&lt;/span&gt; &lt;span class="no"&gt;BMW&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;Type:&lt;/span&gt; &lt;span class="no"&gt;SUV&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;Color:&lt;/span&gt; &lt;span class="nc"&gt;Blue&lt;/span&gt;
&lt;span class="no"&gt;BMW&lt;/span&gt; &lt;span class="n"&gt;speed&lt;/span&gt; &lt;span class="n"&gt;increased&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="n"&gt;km&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;
&lt;span class="no"&gt;BMW&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;driving&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="n"&gt;km&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;
&lt;span class="no"&gt;BMW&lt;/span&gt; &lt;span class="n"&gt;speed&lt;/span&gt; &lt;span class="n"&gt;reduced&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="n"&gt;km&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. &lt;strong&gt;Encapsulation&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The process of wrapping the data and code which is acting on the data together into a single unit  is called as Encapsulation. we can achieve the encapsulation by creating the variables of class  as private and create the getter and setter method as public to view and modify the variables. it is also known as data hiding. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Advantages&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;loosely coupled code.&lt;/li&gt;
&lt;li&gt;Better access control &amp;amp; security.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;oops&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Encapsulation&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// creating the object&lt;/span&gt;
        &lt;span class="nc"&gt;Student&lt;/span&gt; &lt;span class="n"&gt;student&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Student&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

        &lt;span class="c1"&gt;// setting the value of the variables&lt;/span&gt;
        &lt;span class="n"&gt;student&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setAge&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;student&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setName&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Ayush"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Accessing the value of the variables&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;student&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getName&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;student&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getAge&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Student&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// variables as private&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// getter and setter&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getName&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setName&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;getAge&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setAge&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;output-&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Ayush&lt;/span&gt;
&lt;span class="mi"&gt;10&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;here in this example we are creating the variables of the class as private so other classes can’t access theme this concept is called the encapsulation. and we provide the getter and method to modify and view the value of the variables. It provides you the &lt;strong&gt;control over the data&lt;/strong&gt;. Suppose you want to set the value of age which should be greater than 18 only, you can write the logic inside the setter method. You can write the logic not to store the negative numbers in the setter methods.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Abstraction
&lt;/h3&gt;

&lt;p&gt;The Process of hiding the internal implementation and shows only essential functionality to the user is known as abstraction. it is also known as the detail hiding. in java it is achieved through  interface and abstract classes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Advantages-&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It increases security and confidentiality.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example-&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When we are driving a car if we want to stop the car than we just apply the break and the car speed will reduce, we don’t know how the car speed is reduce. and also there is no need to know as a driver how the things works in car. so we can say that break and other functionality of the car is abstract from us.&lt;/p&gt;

&lt;p&gt;Similar in the cellphone how the call is made that is abstracted to us.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;oops&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Car&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;applyBreak&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BMW&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Car&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;applyBreak&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Applying break"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Starting the car"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;here in this example car is an interface applyBreak() and start() is a method of the Car interface and the class BMW implement the car interface so user only knows about the abstartion method that are applyBreak() and start() but don’t know about the internal implementations.  here what we do we just hides the internal details of the class.&lt;/p&gt;

&lt;p&gt;What are the interface and abstract class we learn in next article.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;5. Polymorphism&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Polymorphism is a combination of two words ploy means “Many” and morphism means “Form”. means same entity (method) having different behavior is called as a polymorphism.&lt;/p&gt;

&lt;p&gt;Example-&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A person can be father, boy, teacher or can be a dancer, writer, programmer as well.&lt;/li&gt;
&lt;li&gt;water is  liquid, solid or gas.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;There are a tow types of polymorphism&lt;/strong&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Compile Time / static polymorphism&lt;/li&gt;
&lt;li&gt;Run Time/ Dynamic polymorphism &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Compile Time polymorphism&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A polymorphism which is achieved at compile time known as the compile time polymorphism.&lt;/p&gt;

&lt;p&gt;Example- Method Overloading&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run Time polymorphism&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A polymorphism which is achieved at run time known as the run time polymorphism.&lt;/p&gt;

&lt;p&gt;Example- Method Overriding&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Method Overloading&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Two method is said to be overloaded if both the method having same name but variation in parameters. variation in parameters means.  In method Overriding method signature is different.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Number of parameters&lt;/li&gt;
&lt;li&gt;Position of parameters&lt;/li&gt;
&lt;li&gt;Data type of the parameters
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Calculator&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Method to add two integers&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Method to add three integers (overloaded)&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Method to add two double numbers (overloaded)&lt;/span&gt;
    &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MethodOverloadingExample&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Calculator&lt;/span&gt; &lt;span class="n"&gt;calculator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Calculator&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;sum1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calculator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;                 &lt;span class="c1"&gt;// Calls the first method&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;sum2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calculator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;             &lt;span class="c1"&gt;// Calls the second method&lt;/span&gt;
        &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;sum3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calculator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2.5&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;3.5&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;           &lt;span class="c1"&gt;// Calls the third method&lt;/span&gt;

        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Sum1: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;sum1&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Sum2: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;sum2&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Sum3: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;sum3&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here in this example, we have a &lt;code&gt;Calculator&lt;/code&gt; class with overloaded &lt;code&gt;add&lt;/code&gt; methods. The methods have the same name but different parameter lists (number and type of parameters). Depending on the number and types of arguments passed, the appropriate overloaded method is called.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Method Overriding&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If child class method is not satisfied with its parent class method implementation than it override that implementation this concept is called as a overriding. It is only possible with Inheritance. In the runtime polymorphism it is decided which method is to be called parent class method or child class method. In method Overriding method signature is same.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Vehicle&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"The vehicle starts"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Car&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Vehicle&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"The car starts with a key ignition"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Bike&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Vehicle&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"The bike starts with a kick"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Main&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Vehicle&lt;/span&gt; &lt;span class="n"&gt;myVehicle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Vehicle&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;myVehicle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;  &lt;span class="c1"&gt;// Calls the start method in Vehicle&lt;/span&gt;

        &lt;span class="nc"&gt;Vehicle&lt;/span&gt; &lt;span class="n"&gt;myCar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Car&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;myCar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;  &lt;span class="c1"&gt;// Calls the overridden start method in Car&lt;/span&gt;

        &lt;span class="nc"&gt;Vehicle&lt;/span&gt; &lt;span class="n"&gt;myBike&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Bike&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;myBike&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;  &lt;span class="c1"&gt;// Calls the overridden start method in Bike&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here in this example Vehicle is a class having methods as start and bike and car is the subclass of that class where we override the start() method according to use case. The specific implementation is executed depending on the type of object at runtime.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Inheritance
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Inheritance in Java&lt;/strong&gt; is a mechanism in which one object acquires all the properties and behaviors of a parent object. The idea behind inheritance in Java is that you can create new classes that are built upon existing classes. When you inherit from an existing class, you can reuse methods and fields of the parent class. Moreover, you can add new methods and fields in your current class also.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Inheritance represents the &lt;strong&gt;IS-A relationship&lt;/strong&gt; which is also known as a &lt;em&gt;parent-child&lt;/em&gt; relationship.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Parent / super class - A class that&lt;/strong&gt;  properties and behaviors are acquired by the child class.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Child / sub class -&lt;/strong&gt; &lt;strong&gt;A class that&lt;/strong&gt;  properties and behaviors are acquiring from the super class.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Advantages-&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Method overriding&lt;/li&gt;
&lt;li&gt;Code reuse&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Types of Inheritance&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Multiple Inheritance (In java through class is not possible)&lt;/li&gt;
&lt;li&gt;Multilevel Inheritance&lt;/li&gt;
&lt;li&gt;Single level Inheritance&lt;/li&gt;
&lt;li&gt;hierarchical Inheritance&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Hybrid Inheritance (In java through class is not possible)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Multiple Inheritance→ Single child class Acquiring the properties and behaviors of the super class.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Multilevel Inheritance → Acquiring the properties and behaviors from another derived class.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Hierarchical Inheritance → Two child classes are inheriting the properties and behavior from single super/ parent class.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="" class="article-body-image-wrapper"&gt;&lt;img alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Multiple Inheritance → When one class Inherit multiple classes than this is known as the multiple inheritance. In java this is not possible through the class because of ambiguity or diamond problem but with help of interface we can achieve.&lt;/li&gt;
&lt;li&gt;Hybrid Inheritance → It is a combination of two and more than two inheritance. In java this is not possible through the class but with help of interface we can achieve.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="" class="article-body-image-wrapper"&gt;&lt;img alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Object-Oriented Programming (OOP) is a powerful approach to designing and organizing code that makes applications easier to build, manage, and scale. Through OOP concepts, developers create efficient, reusable, and maintainable code structures.&lt;/p&gt;

&lt;p&gt;OOP is built on four fundamental pillars that govern how objects interact and function in a program:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Encapsulation&lt;/strong&gt; – Protects data by keeping it private within a class and exposing only what's necessary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Abstraction&lt;/strong&gt; – Simplifies complex implementations by providing a clean interface for users.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inheritance&lt;/strong&gt; – Enables classes to inherit properties and behaviors from other classes, promoting code reuse.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Polymorphism&lt;/strong&gt; – Allows a single action to behave differently in various contexts, enhancing code flexibility.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These concepts are essential for writing clean, structured code. For a deeper understanding, explore our dedicated articles on each pillar. Mastering OOP principles will improve your programming skills and help you tackle real-world problems more effectively .&lt;/p&gt;

</description>
      <category>java</category>
      <category>oop</category>
      <category>ayshriv</category>
      <category>programming</category>
    </item>
    <item>
      <title>Containerizing Spring Boot Applications with Docker: A Complete Guide</title>
      <dc:creator>Ayush Shrivastava</dc:creator>
      <pubDate>Sun, 18 May 2025 15:46:50 +0000</pubDate>
      <link>https://forem.com/masteringbackend/containerizing-spring-boot-applications-with-docker-a-complete-guide-4bc</link>
      <guid>https://forem.com/masteringbackend/containerizing-spring-boot-applications-with-docker-a-complete-guide-4bc</guid>
      <description>&lt;h2&gt;
  
  
  Containerizing Spring Boot Applications with Docker
&lt;/h2&gt;

&lt;p&gt;In today's world of cloud computing and microservices, deploying applications efficiently is a big challenge. This is where Docker comes in. Docker helps in packaging applications along with all their dependencies, making them easy to deploy anywhere.&lt;/p&gt;

&lt;p&gt;In this blog, we will see how to containerize a Spring Boot application using Docker, step by step. By the end, you’ll be able to run your Spring Boot app inside a Docker container and deploy it seamlessly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Docker has changed the way we build, run, and scale applications.&lt;/strong&gt; It lets you package your app with everything it needs, so it runs the same everywhere—on your computer, on someone else’s, or on a server. &lt;strong&gt;Docker is one of the most popular tools for this.&lt;/strong&gt; It helps keep things consistent and avoids the “it works on my machine” problem.&lt;/p&gt;

&lt;p&gt;In this blog, we will see how to containerize a Spring Boot application using Docker, step by step. By the end, you’ll be able to run your Spring Boot app inside a Docker container and deploy it seamlessly.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is Docker ?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Docker is a word that is driven from dock-worker, dock worker is a job of person who loads and un loads the containers in a ship from where it has been names as ‘Docker’.&lt;/li&gt;
&lt;li&gt;Using docker we can implement the containerization technologies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Containerization&lt;/strong&gt; is concept through which we can package software applications and the corresponding
libraries/binaries which are required for running the application. and that package is called &lt;strong&gt;image&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Docker is tool/platform that makes it easy to create, manage or run the containers.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="" class="article-body-image-wrapper"&gt;&lt;img alt="Spring Boot Application with Docker.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Docker ?
&lt;/h3&gt;

&lt;p&gt;suppose that we are building a spring boot application on our local machine. it runs perfectly because our system has the right version of java, maven and other tools installed. In order to deploy our application in a another machine we need to setup all the Software which are required to our application. In a real time project should be deployed into multiple environments for testing purpose such as DEV, UAT, PROD, SIT etc. To deploy application to these many environments we need to take of all the software required to run our application in all environments. It is very difficult task. Maybe another machine has different java version, or it is missing some dependencies. then it throws errors. &lt;/p&gt;

&lt;p&gt;Now, let’s we use Docker, we create a Dockerfile that includes our application, the exact java version, and all the requires settings. once it is packaged into  a docker image, it can run on any system with Docker installed- without worrying about what’s installed on that machine. now we can run the same container in every environments as we run in our local system. so we can say that docker help us to save the time and simplifies both development and deployment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Basic knowledge of Java, Spring Boot and Maven.&lt;/li&gt;
&lt;li&gt;Installed Java, Maven, Docker and Docker CLI and IDE (IntelliJ, VS Code).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Simple Spring Boot Application
&lt;/h3&gt;

&lt;p&gt;I created a basic Spring Boot project with just one REST API that returns &lt;strong&gt;"Hello, World!"&lt;/strong&gt; when we hit the &lt;strong&gt;/hello&lt;/strong&gt; endpoint. and I push the code of spring boot application on GitHub. so you just clone it and switch to master branch. &lt;/p&gt;

&lt;p&gt;You can check out the full code here :  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ayushstwt/docker-spring-boot.git" rel="noopener noreferrer"&gt;ayushstwt/docker-spring-boot&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Test Spring Boot Application on localhost
&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://localhost:8080/hello" rel="noopener noreferrer"&gt;http://localhost:8080/hello&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="" class="article-body-image-wrapper"&gt;&lt;img alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Docker Terminology
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Docker file-&lt;/strong&gt; It contains set of instructions to build docker image.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Docker Image&lt;/strong&gt;- It is a package which contains application code + dependencies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Docker Hub&lt;/strong&gt;- It is a registry to store docker images. (AWS ECR)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Docker Container&lt;/strong&gt;- It is a runtime instance of our application Run time instance of an image. If you run docker image container will be created that's where our application is running.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To Generate docker image from our spring-boot application there are three different commonly used approaches. we can choose one of theme.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dockerfile&lt;/li&gt;
&lt;li&gt;Buildpacks&lt;/li&gt;
&lt;li&gt;Google Jib&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Approach 1
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Running a Spring Boot application as a container using Dockerfile
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Step 1&lt;/strong&gt; - Run the maven command, “&lt;strong&gt;mvn clean install&lt;/strong&gt;”. to generate  a fat jar inside the target folder.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2&lt;/strong&gt;- Create the file name as &lt;strong&gt;Dockerfile&lt;/strong&gt; inside the root directory to generate a Docker image.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; openjdk:17-jdk-slim&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; target/docker-spring-boot-0.0.1-SNAPSHOT.jar docker-spring-boot-0.0.1-SNAPSHOT.jar&lt;/span&gt;
&lt;span class="k"&gt;ENTRYPOINT&lt;/span&gt;&lt;span class="s"&gt; ["java","-jar","/docker-spring-boot-0.0.1-SNAPSHOT.jar"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;here in the above file &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;FROM openjdk:17-jdk-slim&lt;/code&gt;&lt;/strong&gt; – Uses a lightweight OpenJDK 17 base image to run the Spring Boot application. &lt;strong&gt;&lt;code&gt;COPY target/docker-spring-boot-0.0.1-SNAPSHOT.jar docker-spring-boot-0.0.1-SNAPSHOT.jar&lt;/code&gt;&lt;/strong&gt; – Copies the built JAR file from the target directory into the Docker image. &lt;strong&gt;&lt;code&gt;ENTRYPOINT ["java","-jar","/docker-spring-boot-0.0.1-SNAPSHOT.jar"]&lt;/code&gt;&lt;/strong&gt; – Defines the command to run the Spring Boot JAR when the container starts.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;To use Docker, first download Docker Desktop from &lt;a href="https://docker.com/products/docker-desktop" rel="noopener noreferrer"&gt;docker.com/products/docker-desktop&lt;/a&gt;. Pick the version for your OS (Windows or macOS). If you're on Linux, follow the guide at &lt;a href="https://docs.docker.com/engine/install" rel="noopener noreferrer"&gt;docs.docker.com/engine/install&lt;/a&gt;. Install it like any app and launch Docker Desktop.&lt;/p&gt;

&lt;p&gt;Next, open your terminal and run &lt;code&gt;docker login&lt;/code&gt;. Enter your Docker Hub username and password. If you don’t have an account, create one at &lt;a href="https://hub.docker.com/signup" rel="noopener noreferrer"&gt;hub.docker.com/signup&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Once logged in, you’re ready to build images, run containers, and manage apps easily. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Step 3&lt;/strong&gt; -  Execute the docker command to generate the docker image based on the tag name. make sure that your docker desktop is running.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;
// syntax
docker build -t your-image-name:tag .

// command
docker build -t ayshriv/**docker-spring-boot:latest .**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;after executing this command you get this output that means our image is successfully generated.  here the &lt;code&gt;docker build&lt;/code&gt; command is used to create a Docker image from a Dockerfile. The &lt;code&gt;-t&lt;/code&gt; flag allows you to give your image a name and optionally add a version tag. For example, &lt;code&gt;docker-spring-boot&lt;/code&gt; is the name and : latest is version of the image you're creating. The &lt;code&gt;.&lt;/code&gt; (dot) at the end tells Docker to look in the current directory for the Dockerfile and all the necessary files to build the image. &lt;/p&gt;

&lt;p&gt;&lt;a href="" class="article-body-image-wrapper"&gt;&lt;img alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;now check that image is generated or not we use the command &lt;strong&gt;docker images&lt;/strong&gt; to see all the images.&lt;/p&gt;

&lt;p&gt;&lt;a href="" class="article-body-image-wrapper"&gt;&lt;img alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;step 4&lt;/strong&gt; - after this execute the command that creates the docker container based on the image.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;docker run -p 8080:8080 ayshriv/**docker-spring-boot:latest**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;here the command &lt;code&gt;docker run -p 8080:8080 ayshriv/docker-spring-boot:latest&lt;/code&gt; is used to start a Docker container from our image. The &lt;code&gt;-p 8080:8080&lt;/code&gt; part maps your computer’s port 8080 to the container’s port 8080, so you can access the app in your browser at &lt;code&gt;http://localhost:8080&lt;/code&gt;. The &lt;code&gt;ayshriv/docker-spring-boot:latest&lt;/code&gt; is the name of the image you're running from Docker Hub. This command makes your Spring Boot app run inside a container. here in 8080:8080 where first value represents the external port and the second value represents the container port. after executing this command we get the out like this and now our container is running successfully.&lt;/p&gt;

&lt;p&gt;&lt;a href="" class="article-body-image-wrapper"&gt;&lt;img alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;to check that our container is running or not we used the command that is &lt;strong&gt;docker ps&lt;/strong&gt; that show all the running containers.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;the Docker image name &lt;code&gt;ayshriv/docker-spring-boot:latest&lt;/code&gt;, &lt;code&gt;ayshriv&lt;/code&gt; is your Docker Hub username, which helps identify you as the owner of the image. &lt;code&gt;docker-spring-boot&lt;/code&gt; is the name of your application, and it's good practice to keep this name short, clear, and related to what your app does. The part after the colon, &lt;code&gt;latest&lt;/code&gt;, is the tag, which usually refers to the current or most recent version of the image. You can also use tags like &lt;code&gt;v1.0&lt;/code&gt;, &lt;code&gt;prod&lt;/code&gt;, or &lt;code&gt;dev&lt;/code&gt; to manage different versions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;While this approach of creating a Docker image using a Dockerfile is effective and widely used, one of the main disadvantages is that the resulting image can be quite large, especially when using a base image like OpenJDK. A larger image takes more time to build, transfer, and start, which can slow down development and deployment. Additionally, maintaining the Dockerfile requires extra effort, as you need to keep it updated whenever the application structure or dependencies change. here we show that the image size is 428MB that is very large now next approach helps to reduce the size and minimal efforts as well.&lt;/p&gt;

&lt;h2&gt;
  
  
  Approach 2
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Running a Spring Boot application as a container using Buildpacks
&lt;/h3&gt;

&lt;p&gt;Cloud Native Buildpacks transform your application source code into images that can run on any cloud. it is an alternative approach to dockerfiles. with the help of Buildpacks we can automatically generate production ready images form our application source code without writing the Dockerfile.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://buildpacks.io/" rel="noopener noreferrer"&gt;https://buildpacks.io/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 1- we need to add the given configuration inside the pom.xml for the image name.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;build&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;plugins&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-maven-plugin&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;image&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;ayshriv/${project.artifactId}:latest&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/image&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/plugins&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/build&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;here also we follows the same naming convention for image name.&lt;/p&gt;

&lt;p&gt;Step 2- now we run the given maven command to generate the docker image with out the need of Dockerfile. (make sure that docker desktop is running).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;mvn spring-boot:build-image
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 3- after this executing the given command that creates the docker container based on the image and also port mapping provided.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;docker run -p 8080:8080 ayshriv/docker-spring-boot:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;now in this approach no need of Dockerfile and also the image size is also reducing. but there is one more problem here in our local system we need a Docker desktop is installed. to remove this problem we use Google JIB this is only used for java application to generate the imagef of our springboot application without need of Dockerfile and also the size is reduced.&lt;/p&gt;

&lt;h2&gt;
  
  
  Approach 3
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Running a Spring Boot application as a container using Google JIB
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/GoogleContainerTools/jib" rel="noopener noreferrer"&gt;GitHub - GoogleContainerTools/jib: 🏗 Build container images for your Java applications.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Google JIB is used to Build container images for your Java applications. without need of Dockerfile and Docker Desktop. it is an alternative approach to dockerfiles. with the help of Google JIB we can automatically generate production ready images form our application source code without writing the Dockerfile.&lt;/p&gt;

&lt;p&gt;Step 1- we need to add the given configuration inside the pom.xml for the image name.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;&amp;lt;build&amp;gt;&lt;/span&gt;
  &lt;span class="s"&gt;&amp;lt;plugins&amp;gt;&lt;/span&gt;
    &lt;span class="s"&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
      &lt;span class="s"&gt;&amp;lt;groupId&amp;gt;com.google.cloud.tools&amp;lt;/groupId&amp;gt;&lt;/span&gt;
      &lt;span class="s"&gt;&amp;lt;artifactId&amp;gt;jib-maven-plugin&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
      &lt;span class="s"&gt;&amp;lt;version&amp;gt;3.4.0&amp;lt;/version&amp;gt;&lt;/span&gt; 
      &lt;span class="s"&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
        &lt;span class="s"&gt;&amp;lt;to&amp;gt;&lt;/span&gt;
          &lt;span class="s"&gt;&amp;lt;image&amp;gt;ayshriv/${project.artifactId}:latest&amp;lt;/image&amp;gt;&lt;/span&gt;
        &lt;span class="s"&gt;&amp;lt;/to&amp;gt;&lt;/span&gt;
      &lt;span class="s"&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
    &lt;span class="s"&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
  &lt;span class="s"&gt;&amp;lt;/plugins&amp;gt;&lt;/span&gt;
&lt;span class="s"&gt;&amp;lt;/build&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 2- Run the given maven command to generate the docker image (for Google JIB there is no need of Docker Desktop to be installed on your local system).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;mvn compile jib:dockerBuild
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 3- after this executing the given command that creates the docker container based on the image and also port mapping provided.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;docker run -p 8080:8080 ayshriv/docker-spring-boot:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this approach, we eliminate the need for a Dockerfile, and the resulting image size is significantly reduced. However, one limitation is that Docker Desktop must be installed on the local system to build and run Docker images. To overcome this dependency, we can use &lt;strong&gt;Google JIB&lt;/strong&gt; — a powerful tool specifically designed for Java applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google JIB&lt;/strong&gt; allows us to containerize our Spring Boot application &lt;strong&gt;without writing a Dockerfile&lt;/strong&gt; or having Docker installed locally. It integrates directly with Maven or Gradle, enabling seamless image creation and pushing to container registries. Additionally, JIB optimizes image layering, which helps in &lt;strong&gt;reducing image size&lt;/strong&gt; and speeding up rebuild times during development.&lt;/p&gt;

&lt;p&gt;Some Common used Docker Commands for Java Developers&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 1. Build Docker image from Dockerfile (usually for Spring Boot app)&lt;/span&gt;
&lt;span class="s"&gt;docker build -t my-java-app .&lt;/span&gt;

&lt;span class="c1"&gt;# 2. List all images&lt;/span&gt;
&lt;span class="s"&gt;docker images&lt;/span&gt;

&lt;span class="c1"&gt;# 3. Run the Docker container from the built image&lt;/span&gt;
&lt;span class="s"&gt;docker run -d -p 8080:8080 --name java-app-container my-java-app&lt;/span&gt;

&lt;span class="c1"&gt;# 4. View running containers&lt;/span&gt;
&lt;span class="s"&gt;docker ps&lt;/span&gt;

&lt;span class="c1"&gt;# 5. View all containers (including stopped ones)&lt;/span&gt;
&lt;span class="s"&gt;docker ps -a&lt;/span&gt;

&lt;span class="c1"&gt;# 6. Stop a running container&lt;/span&gt;
&lt;span class="s"&gt;docker stop java-app-container&lt;/span&gt;

&lt;span class="c1"&gt;# 7. Start a stopped container&lt;/span&gt;
&lt;span class="s"&gt;docker start java-app-container&lt;/span&gt;

&lt;span class="c1"&gt;# 8. Restart a container&lt;/span&gt;
&lt;span class="s"&gt;docker restart java-app-container&lt;/span&gt;

&lt;span class="c1"&gt;# 9. Remove a container&lt;/span&gt;
&lt;span class="s"&gt;docker rm java-app-container&lt;/span&gt;

&lt;span class="c1"&gt;# 10. Remove an image&lt;/span&gt;
&lt;span class="s"&gt;docker rmi my-java-app&lt;/span&gt;

&lt;span class="c1"&gt;# 11. View logs of a container (helpful for debugging)&lt;/span&gt;
&lt;span class="s"&gt;docker logs java-app-container&lt;/span&gt;

&lt;span class="c1"&gt;# 12. Execute a command inside a running container (like inspecting files, checking logs)&lt;/span&gt;
&lt;span class="s"&gt;docker exec -it java-app-container bash&lt;/span&gt;

&lt;span class="c1"&gt;# 13. Tag an image (e.g., for pushing to Docker Hub)&lt;/span&gt;
&lt;span class="s"&gt;docker tag my-java-app ayushshrivastaav/my-java-app:latest&lt;/span&gt;

&lt;span class="c1"&gt;# 14. Login to Docker Hub&lt;/span&gt;
&lt;span class="s"&gt;docker login&lt;/span&gt;

&lt;span class="c1"&gt;# 15. Push image to Docker Hub&lt;/span&gt;
&lt;span class="s"&gt;docker push ayushshrivastaav/my-java-app:latest&lt;/span&gt;

&lt;span class="c1"&gt;# 16. Pull image from Docker Hub&lt;/span&gt;
&lt;span class="s"&gt;docker pull ayushshrivastaav/my-java-app:latest&lt;/span&gt;

&lt;span class="c1"&gt;# 17. Remove all stopped containers&lt;/span&gt;
&lt;span class="s"&gt;docker container prune -f&lt;/span&gt;

&lt;span class="c1"&gt;# 18. Remove all unused images&lt;/span&gt;
&lt;span class="s"&gt;docker image prune -a -f&lt;/span&gt;

&lt;span class="c1"&gt;# 19. Check Docker version&lt;/span&gt;
&lt;span class="s"&gt;docker version&lt;/span&gt;

&lt;span class="c1"&gt;# 20. View system-wide Docker resource usage&lt;/span&gt;
&lt;span class="s"&gt;docker system df&lt;/span&gt;

&lt;span class="c1"&gt;# 21. Compose up (if using docker-compose.yml for multi-container apps)&lt;/span&gt;
&lt;span class="s"&gt;docker-compose up -d&lt;/span&gt;

&lt;span class="c1"&gt;# 22. Compose down&lt;/span&gt;
&lt;span class="s"&gt;docker-compose down&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Using Docker with Spring Boot makes application deployment faster, more reliable, and scalable. With just a few steps, you can package your application and run it anywhere—on your local machine, cloud, or any server that supports Docker. This approach is widely used in DevOps and Microservices Architecture to ensure smooth deployment.&lt;/p&gt;

&lt;p&gt;Start containerizing your Spring Boot apps today and experience the power of Docker!&lt;/p&gt;

</description>
      <category>java</category>
      <category>docker</category>
      <category>springboot</category>
      <category>ayshriv</category>
    </item>
    <item>
      <title>Mastering the Singleton Design Pattern in Java – A Complete Guide</title>
      <dc:creator>Ayush Shrivastava</dc:creator>
      <pubDate>Fri, 28 Feb 2025 17:27:14 +0000</pubDate>
      <link>https://forem.com/ayshriv/mastering-the-singleton-design-pattern-in-java-a-complete-guide-2ac8</link>
      <guid>https://forem.com/ayshriv/mastering-the-singleton-design-pattern-in-java-a-complete-guide-2ac8</guid>
      <description>&lt;p&gt;Learn how the Singleton Design Pattern ensures a single instance of a class, improving efficiency and resource management in Java applications. Explore real-world use cases and implementation techniques!&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a Design Pattern?
&lt;/h2&gt;

&lt;p&gt;In software development, a design pattern is a proven solution to a commonly occurring problem in software design. It provides best practices that help developers write clean, reusable, and maintainable code.&lt;/p&gt;

&lt;p&gt;Design patterns are broadly categorized into three types:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creational Patterns – Focus on object creation (e.g., Singleton, Factory, Builder).&lt;/li&gt;
&lt;li&gt;Structural Patterns – Deal with object composition (e.g., Adapter, Decorator, Composite).&lt;/li&gt;
&lt;li&gt;Behavioral Patterns – Define how objects interact (e.g., Observer, Strategy, Command).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Among these, the Singleton Pattern is a widely used Creational Design Pattern, ensuring that only one instance of a class exists throughout the application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Singleton Design Pattern
&lt;/h2&gt;

&lt;p&gt;When a class ensures that only one instance is created and used throughout the application, it is called the Singleton Design Pattern. or we can say that for a particular class a single object is maintained or created, it is known as singleton design pattern.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Achieve Singleton Design Pattern ?
&lt;/h2&gt;

&lt;p&gt;if we want to achieve the singleton design pattern we follow the three steps.&lt;/p&gt;

&lt;p&gt;1) we should prevent the object creation from outside of the class. for that we need to create the private constructor, so we can create the object only inside of the class not outside of the class.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;private static Singleton singleton = new Singleton();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2) creating the single object of the class inside the class and creating that object as static so the only single copy of that object is created.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;private static Singleton singleton = new Singleton();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3) create the getter method for accessing the object. and that method we create as static so with the help of the class name we can accessing that object. outside of the class.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public static Singleton getInstance() {
        return singleton;
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class Singleton {
    private static Singleton singleton = new Singleton();

    private Singleton() {
        System.out.println("Singleton created");
    }

    public static Singleton getInstance() {
        return singleton;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Advantages of Singleton Design Pattern
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Controlled Access – Ensures only one instance of the class exists, preventing accidental multiple object creation.&lt;/li&gt;
&lt;li&gt;Saves Memory – Reduces memory usage by reusing the same object instead of creating multiple instances.&lt;/li&gt;
&lt;li&gt;Global Access Point – Provides a single, shared instance accessible from anywhere in the application.&lt;/li&gt;
&lt;li&gt;Prevents Conflicts – Useful in scenarios like database connections, logging, and caching where multiple instances could cause issues.&lt;/li&gt;
&lt;li&gt;Thread-Safety (if implemented correctly) – Helps manage shared resources in a multi-threaded environment.&lt;/li&gt;
&lt;li&gt;Improves Performance – Avoids unnecessary object creation, leading to better efficiency.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>java</category>
      <category>designpatterns</category>
      <category>ayshriv</category>
      <category>singleton</category>
    </item>
    <item>
      <title>Fixing "No Serializer Found" Error in Hibernate</title>
      <dc:creator>Ayush Shrivastava</dc:creator>
      <pubDate>Fri, 28 Feb 2025 16:40:58 +0000</pubDate>
      <link>https://forem.com/ayshriv/fixing-no-serializer-found-error-in-hibernate-5cla</link>
      <guid>https://forem.com/ayshriv/fixing-no-serializer-found-error-in-hibernate-5cla</guid>
      <description>&lt;h1&gt;
  
  
  Fixing "No Serializer Found" Error in Hibernate
&lt;/h1&gt;

&lt;p&gt;If you're working with Hibernate in a Spring Boot application and see an error like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It means that your application is trying to convert a Hibernate entity into JSON, but Jackson (the JSON library) doesn’t know how to handle Hibernate’s proxy objects.&lt;/p&gt;

&lt;p&gt;Don't worry! This blog will help you understand why this happens and how to fix it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Does This Error Happen?
&lt;/h2&gt;

&lt;p&gt;Hibernate uses &lt;strong&gt;lazy loading&lt;/strong&gt; by default for related entities. This means that when you fetch data from the database, Hibernate doesn’t load everything immediately. Instead, it creates a proxy (a placeholder) until the data is actually needed.&lt;/p&gt;

&lt;p&gt;But when Jackson tries to convert this proxy into JSON, it fails because it doesn’t know how to serialize it. That’s when you see this error.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Fix It
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Ignore Hibernate Proxy Fields
&lt;/h3&gt;

&lt;p&gt;Add this annotation to your entity class to tell Jackson to ignore Hibernate’s internal properties:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.fasterxml.jackson.annotation.JsonIgnoreProperties&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@JsonIgnoreProperties&lt;/span&gt;&lt;span class="o"&gt;({&lt;/span&gt;&lt;span class="s"&gt;"hibernateLazyInitializer"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"handler"&lt;/span&gt;&lt;span class="o"&gt;})&lt;/span&gt;
&lt;span class="nd"&gt;@Entity&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;YourEntity&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Your fields and methods&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This prevents Jackson from trying to serialize Hibernate’s internal proxy fields.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Change Fetch Type to EAGER (if necessary)
&lt;/h3&gt;

&lt;p&gt;If the error happens because of a &lt;strong&gt;lazy-loaded&lt;/strong&gt; field, you can change it to &lt;strong&gt;eager loading&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@ManyToOne&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fetch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FetchType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;EAGER&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Location&lt;/span&gt; &lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Warning: Eager loading can affect performance if used on large datasets.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Use DTOs Instead of Entities (Best Practice!)
&lt;/h3&gt;

&lt;p&gt;Instead of returning database entities directly, create &lt;strong&gt;Data Transfer Objects (DTOs)&lt;/strong&gt; and map only the required fields.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example DTO:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;LocationDTO&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="c1"&gt;// Constructors, getters, and setters&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Convert Entity to DTO Before Returning:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;LocationDTO&lt;/span&gt; &lt;span class="n"&gt;locationDTO&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;LocationDTO&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getCity&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;entity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getState&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;locationDTO&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This avoids exposing unnecessary fields and proxy objects.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Force Hibernate to Load the Object Before Serialization
&lt;/h3&gt;

&lt;p&gt;If you're dealing with lazy loading, &lt;strong&gt;initialize the object&lt;/strong&gt; before returning it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;YourEntity&lt;/span&gt; &lt;span class="n"&gt;entity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;yourRepository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findById&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;orElseThrow&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="nc"&gt;Hibernate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;initialize&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getLocation&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This ensures that the related entity is fully loaded before converting it to JSON.&lt;/p&gt;




&lt;h3&gt;
  
  
  5. Ignore Specific Fields in Serialization
&lt;/h3&gt;

&lt;p&gt;If the issue is with a specific field, tell Jackson to ignore it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@JsonIgnore&lt;/span&gt;
&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Location&lt;/span&gt; &lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will prevent Jackson from trying to serialize the &lt;code&gt;location&lt;/code&gt; field.&lt;/p&gt;




&lt;h3&gt;
  
  
  6. Disable Serialization Error in &lt;code&gt;application.properties&lt;/code&gt; (Temporary Fix)
&lt;/h3&gt;

&lt;p&gt;If you just want to &lt;strong&gt;stop the error&lt;/strong&gt; without fixing the root cause, you can add this to &lt;code&gt;application.properties&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;spring.jackson.serialization.fail-on-empty-beans&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is not a recommended solution because it hides the issue instead of fixing it.&lt;/p&gt;




&lt;h3&gt;
  
  
  7. Convert Entity to a Map Before Serializing
&lt;/h3&gt;

&lt;p&gt;Instead of returning an entity directly, convert it into a &lt;strong&gt;Map&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;ObjectMapper&lt;/span&gt; &lt;span class="n"&gt;mapper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ObjectMapper&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mapper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;convertValue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entity&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;TypeReference&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;()&lt;/span&gt; &lt;span class="o"&gt;{});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This helps avoid serialization issues.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;If you get the "No serializer found" error in Hibernate, try these solutions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add &lt;code&gt;@JsonIgnoreProperties&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Change fetch type to &lt;strong&gt;EAGER&lt;/strong&gt; (if needed)&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;DTOs&lt;/strong&gt; (Best Practice!)&lt;/li&gt;
&lt;li&gt;Initialize lazy-loaded fields&lt;/li&gt;
&lt;li&gt;Ignore specific fields with &lt;code&gt;@JsonIgnore&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Disable the error (not recommended)&lt;/li&gt;
&lt;li&gt;Convert entity to a &lt;strong&gt;Map&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Following these methods will help you fix the error and improve your application's performance.&lt;/p&gt;

</description>
      <category>java</category>
      <category>springboot</category>
      <category>hibernate</category>
      <category>ayshriv</category>
    </item>
    <item>
      <title>Introduction to Spring REST</title>
      <dc:creator>Ayush Shrivastava</dc:creator>
      <pubDate>Tue, 25 Feb 2025 06:21:18 +0000</pubDate>
      <link>https://forem.com/ayshriv/introduction-to-spring-rest-3nhl</link>
      <guid>https://forem.com/ayshriv/introduction-to-spring-rest-3nhl</guid>
      <description>&lt;h1&gt;
  
  
  Introduction to Spring REST
&lt;/h1&gt;

&lt;p&gt;In today's world, most applications need to communicate with each other. For example, a mobile app needs data from a backend server. This is where &lt;strong&gt;REST APIs&lt;/strong&gt; come into play. In this blog, we will understand &lt;strong&gt;Spring REST&lt;/strong&gt; in very simple words and see how we can create a REST API using &lt;strong&gt;Spring Boot&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is REST?
&lt;/h2&gt;

&lt;p&gt;REST stands for &lt;strong&gt;Representational State Transfer&lt;/strong&gt;. It is a set of rules that helps applications communicate over the internet using &lt;strong&gt;HTTP methods&lt;/strong&gt; like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GET&lt;/strong&gt; → Used to fetch data from the server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;POST&lt;/strong&gt; → Used to send new data to the server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PUT&lt;/strong&gt; → Used to update existing data on the server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DELETE&lt;/strong&gt; → Used to remove data from the server.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;REST APIs follow a &lt;strong&gt;stateless&lt;/strong&gt; architecture, meaning each request from a client contains all the necessary information for the server to process it, without relying on previous requests.&lt;/p&gt;

&lt;p&gt;A REST API follows these rules and allows different systems to exchange information easily using JSON or XML as data formats.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Spring REST?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Spring REST&lt;/strong&gt; is a part of the &lt;strong&gt;Spring Framework&lt;/strong&gt; that simplifies the creation of REST APIs. It provides built-in support for handling HTTP requests and responses, data conversion, and error handling. This allows developers to focus on writing business logic instead of managing low-level configurations.&lt;/p&gt;

&lt;p&gt;Spring REST is mostly used with &lt;strong&gt;Spring Boot&lt;/strong&gt;, which helps in developing APIs quickly with minimal setup and configuration.&lt;/p&gt;

&lt;h3&gt;
  
  
  Benefits of Spring REST
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Easy to use&lt;/strong&gt;: Reduces boilerplate code and simplifies development.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalable&lt;/strong&gt;: Can handle multiple requests efficiently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexible&lt;/strong&gt;: Supports JSON, XML, and other formats.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integration-friendly&lt;/strong&gt;: Works well with databases, security tools, and third-party services.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Steps to Create a REST API in Spring Boot
&lt;/h2&gt;

&lt;p&gt;Let's go step by step to create a simple REST API using &lt;strong&gt;Spring Boot&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Create a Spring Boot Project
&lt;/h3&gt;

&lt;p&gt;You can create a Spring Boot project using &lt;a href="https://start.spring.io/" rel="noopener noreferrer"&gt;Spring Initializr&lt;/a&gt;. Select the following dependencies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Spring Web&lt;/strong&gt; (for REST API development)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spring Boot DevTools&lt;/strong&gt; (for automatic reloads during development)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lombok&lt;/strong&gt; (for reducing boilerplate code in Java classes)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spring Data JPA&lt;/strong&gt; (for database connectivity)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;H2 Database&lt;/strong&gt; (for an in-memory database during development)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 2: Create a Model Class
&lt;/h3&gt;

&lt;p&gt;A model class represents the data structure used in the API. Here is an example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;User&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;getId&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setId&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getName&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setName&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getEmail&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setEmail&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Create a REST Controller
&lt;/h3&gt;

&lt;p&gt;A REST Controller manages HTTP requests. We use &lt;code&gt;@RestController&lt;/code&gt; to define it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.web.bind.annotation.*&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.List&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.Arrays&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@RestController&lt;/span&gt;
&lt;span class="nd"&gt;@RequestMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/users"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserController&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Arrays&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;asList&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;User&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Alice"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"alice@example.com"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
        &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;User&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Bob"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"bob@example.com"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="nd"&gt;@GetMapping&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;getUsers&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Run the Application
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Start your Spring Boot application.&lt;/li&gt;
&lt;li&gt;Open a web browser or &lt;strong&gt;Postman&lt;/strong&gt; and go to: &lt;code&gt;http://localhost:8080/users&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;You will see the list of users in JSON format.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Additional Features
&lt;/h2&gt;

&lt;p&gt;Once you have a basic REST API, you can add more features like:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Connecting to a Database
&lt;/h3&gt;

&lt;p&gt;Instead of hardcoding data, you can connect the API to a &lt;strong&gt;database&lt;/strong&gt; using &lt;strong&gt;Spring Data JPA&lt;/strong&gt;. This allows you to store and retrieve data dynamically.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Error Handling
&lt;/h3&gt;

&lt;p&gt;Using &lt;code&gt;@ExceptionHandler&lt;/code&gt;, you can handle errors gracefully and return meaningful messages to the user instead of generic error codes.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@ExceptionHandler&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Exception&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;handleException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;(&lt;/span&gt;&lt;span class="s"&gt;"Something went wrong: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getMessage&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="nc"&gt;HttpStatus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;INTERNAL_SERVER_ERROR&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Securing the API
&lt;/h3&gt;

&lt;p&gt;Use &lt;strong&gt;Spring Security&lt;/strong&gt; to protect your API endpoints from unauthorized access. You can implement &lt;strong&gt;JWT authentication&lt;/strong&gt; to ensure only authenticated users can access the API.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. API Documentation with Swagger
&lt;/h3&gt;

&lt;p&gt;Swagger helps in documenting and testing APIs easily. You can add Swagger using the &lt;code&gt;springdoc-openapi-starter-webmvc-ui&lt;/code&gt; dependency and access it at &lt;code&gt;http://localhost:8080/swagger-ui.html&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Deploying the API
&lt;/h3&gt;

&lt;p&gt;Once your API is ready, you can deploy it to cloud platforms like &lt;strong&gt;AWS&lt;/strong&gt;, &lt;strong&gt;Google Cloud&lt;/strong&gt;, or &lt;strong&gt;Heroku&lt;/strong&gt; to make it accessible to users worldwide.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Spring REST is a powerful way to build REST APIs in Java using &lt;strong&gt;Spring Boot&lt;/strong&gt;. It allows you to create APIs quickly by defining a &lt;strong&gt;REST Controller&lt;/strong&gt;, handling &lt;strong&gt;HTTP requests&lt;/strong&gt;, and returning data in JSON format.&lt;/p&gt;

&lt;p&gt;By following these steps, you can build APIs that can be used in web and mobile applications. You can also enhance your API by adding database connectivity, security, and documentation.&lt;/p&gt;

&lt;p&gt;Spring REST makes API development &lt;strong&gt;simple, scalable, and efficient&lt;/strong&gt;, making it an essential tool for modern application development.&lt;/p&gt;

</description>
      <category>rest</category>
      <category>java</category>
      <category>springboot</category>
      <category>ayshriv</category>
    </item>
    <item>
      <title>Spring Boot REST API - Returning Response in JSON Format</title>
      <dc:creator>Ayush Shrivastava</dc:creator>
      <pubDate>Sun, 23 Feb 2025 07:02:36 +0000</pubDate>
      <link>https://forem.com/ayshriv/spring-boot-rest-api-returning-response-in-json-format-4db0</link>
      <guid>https://forem.com/ayshriv/spring-boot-rest-api-returning-response-in-json-format-4db0</guid>
      <description>&lt;h1&gt;
  
  
  &lt;strong&gt;Spring Boot REST API - Returning Response in JSON Format&lt;/strong&gt;
&lt;/h1&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Introduction&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;In this guide, we will learn how to return a response in &lt;strong&gt;JSON format&lt;/strong&gt; from a &lt;strong&gt;Spring Boot REST API&lt;/strong&gt;. By default, Spring Boot returns responses in &lt;strong&gt;JSON&lt;/strong&gt;, making it the standard format for most RESTful services. JSON is widely used due to its lightweight nature, easy readability, and compatibility with various programming languages.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Why Use JSON in REST APIs?&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lightweight &amp;amp; Fast:&lt;/strong&gt; JSON data is compact, making it faster to parse compared to XML.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Human &amp;amp; Machine Readable:&lt;/strong&gt; JSON has a simple and structured format that is easy to read and manipulate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Widely Supported:&lt;/strong&gt; JSON is supported across multiple programming languages and frameworks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ideal for Web &amp;amp; Mobile Applications:&lt;/strong&gt; JSON works well with JavaScript and is natively supported in web and mobile development.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Steps to Implement JSON Response in Spring Boot&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1️⃣ Add Required Dependencies&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Spring Boot uses &lt;strong&gt;Jackson&lt;/strong&gt; for JSON serialization and deserialization. Jackson is included by default in Spring Boot starters, so no extra dependency is needed. However, ensure that your &lt;code&gt;pom.xml&lt;/code&gt; contains the necessary dependency:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.fasterxml.jackson.core&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;jackson-databind&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This ensures that Jackson can automatically convert Java objects to JSON and vice versa.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2️⃣ Create a Model Class (DTO) for JSON Response&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;We need a &lt;strong&gt;model class (DTO)&lt;/strong&gt; that represents the response data. Jackson automatically serializes objects into JSON.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.example.demo.dto&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserResponse&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Default Constructor&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;UserResponse&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;

    &lt;span class="c1"&gt;// Parameterized Constructor&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;UserResponse&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Getters and Setters&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getName&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setName&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;getAge&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setAge&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getEmail&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setEmail&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;3️⃣ Create a REST Controller&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Next, we create a &lt;strong&gt;Spring Boot REST Controller&lt;/strong&gt; that returns the response in JSON format. We use &lt;code&gt;produces = MediaType.APPLICATION_JSON_VALUE&lt;/code&gt; to specify JSON response type.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.example.demo.controller&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.example.demo.dto.UserResponse&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.http.MediaType&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.web.bind.annotation.GetMapping&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.web.bind.annotation.RequestMapping&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.web.bind.annotation.RestController&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@RestController&lt;/span&gt;
&lt;span class="nd"&gt;@RequestMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/api"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserController&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@GetMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"/user"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;produces&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;MediaType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;APPLICATION_JSON_VALUE&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;UserResponse&lt;/span&gt; &lt;span class="nf"&gt;getUser&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;UserResponse&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Ayush"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"ayush@example.com"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;4️⃣ Create Main Spring Boot Application Class&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The main class is needed to start the &lt;strong&gt;Spring Boot application&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.example.demo&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.boot.SpringApplication&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.boot.autoconfigure.SpringBootApplication&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@SpringBootApplication&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DemoApplication&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;SpringApplication&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;DemoApplication&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;5️⃣ Run the Application and Test the API&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Start the &lt;strong&gt;Spring Boot application&lt;/strong&gt;, then send a GET request using Postman, Browser, or Curl:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET http://localhost:8080/api/user
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;6️⃣ Expected JSON Response Output&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;When the API is called, it returns the response in &lt;strong&gt;JSON format&lt;/strong&gt; as shown below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Ayush"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"age"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ayush@example.com"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Troubleshooting Common Issues&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;✅ &lt;strong&gt;Error: JSON Response Not Showing?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ensure that the &lt;code&gt;jackson-databind&lt;/code&gt; dependency is added.&lt;/li&gt;
&lt;li&gt;Check if &lt;code&gt;produces = MediaType.APPLICATION_JSON_VALUE&lt;/code&gt; is correctly set in the controller.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;Postman&lt;/strong&gt; and check the &lt;code&gt;Accept&lt;/code&gt; header; set it to &lt;code&gt;application/json&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;JSON Response Showing as XML?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you have &lt;code&gt;jackson-dataformat-xml&lt;/code&gt; dependency, Spring Boot might return XML.&lt;/li&gt;
&lt;li&gt;Remove any &lt;code&gt;@XmlRootElement&lt;/code&gt; annotations from the model class.&lt;/li&gt;
&lt;li&gt;Explicitly request JSON by setting the &lt;code&gt;Accept&lt;/code&gt; header to &lt;code&gt;application/json&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Summary&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;✅ &lt;strong&gt;Used Jackson for JSON serialization&lt;/strong&gt; (default in Spring Boot).&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Created a DTO class&lt;/strong&gt; for structured JSON responses.&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Developed a REST API&lt;/strong&gt; that returns JSON using &lt;code&gt;produces = MediaType.APPLICATION_JSON_VALUE&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Ran and tested the API&lt;/strong&gt; to verify JSON response output.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Spring Boot provides an easy way to return JSON responses with minimal configuration. With proper setup, JSON-based REST APIs are efficient, fast, and easy to integrate with modern web and mobile applications.&lt;/p&gt;

</description>
      <category>java</category>
      <category>json</category>
      <category>springboot</category>
      <category>ayshriv</category>
    </item>
    <item>
      <title>Spring Boot REST API - Returning Response in XML Format</title>
      <dc:creator>Ayush Shrivastava</dc:creator>
      <pubDate>Sun, 23 Feb 2025 06:57:11 +0000</pubDate>
      <link>https://forem.com/ayshriv/spring-boot-rest-api-returning-response-in-xml-format-2dkh</link>
      <guid>https://forem.com/ayshriv/spring-boot-rest-api-returning-response-in-xml-format-2dkh</guid>
      <description>&lt;h1&gt;
  
  
  &lt;strong&gt;Spring Boot REST API - Returning Response in XML Format&lt;/strong&gt;
&lt;/h1&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Introduction&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;In this guide, we will learn how to return a response in &lt;strong&gt;XML format&lt;/strong&gt; from a &lt;strong&gt;Spring Boot REST API&lt;/strong&gt;. By default, Spring Boot returns responses in &lt;strong&gt;JSON&lt;/strong&gt;, but we can configure it to return &lt;strong&gt;XML&lt;/strong&gt; by following a few simple steps. This is particularly useful when integrating with systems that require XML responses, such as legacy applications or third-party services.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Why Use XML in REST APIs?&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Interoperability:&lt;/strong&gt; Many older systems and enterprise applications still rely on XML for data exchange.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured Data:&lt;/strong&gt; XML provides a well-structured format that is widely used in web services (SOAP-based services).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customization:&lt;/strong&gt; XML allows for defining custom schemas and DTDs, making data validation more flexible.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Steps to Implement XML Response in Spring Boot&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1️⃣ Add Required Dependency&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Spring Boot uses &lt;strong&gt;Jackson&lt;/strong&gt; for JSON serialization and deserialization. To enable &lt;strong&gt;XML support&lt;/strong&gt;, we need to include &lt;code&gt;jackson-dataformat-xml&lt;/code&gt; dependency in &lt;code&gt;pom.xml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.fasterxml.jackson.dataformat&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;jackson-dataformat-xml&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This dependency enables Jackson to convert Java objects into XML format automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2️⃣ Create a Model Class (DTO) for XML Response&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;We need a &lt;strong&gt;model class (DTO)&lt;/strong&gt; that represents the response data. Annotate it with &lt;code&gt;@XmlRootElement&lt;/code&gt; and &lt;code&gt;@XmlAccessorType&lt;/code&gt; to enable XML conversion.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.example.demo.dto&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;jakarta.xml.bind.annotation.XmlElement&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;jakarta.xml.bind.annotation.XmlRootElement&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;jakarta.xml.bind.annotation.XmlAccessorType&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;jakarta.xml.bind.annotation.XmlAccessType&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@XmlRootElement&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"User"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@XmlAccessorType&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;XmlAccessType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;FIELD&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserResponse&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@XmlElement&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@XmlElement&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@XmlElement&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Default Constructor&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;UserResponse&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;

    &lt;span class="c1"&gt;// Parameterized Constructor&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;UserResponse&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Getters and Setters&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getName&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setName&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;getAge&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setAge&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getEmail&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setEmail&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;3️⃣ Create a REST Controller&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Next, we create a &lt;strong&gt;Spring Boot REST Controller&lt;/strong&gt; that returns the response in XML format. We use &lt;code&gt;produces = MediaType.APPLICATION_XML_VALUE&lt;/code&gt; to specify XML response type.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.example.demo.controller&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.example.demo.dto.UserResponse&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.http.MediaType&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.web.bind.annotation.GetMapping&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.web.bind.annotation.RequestMapping&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.web.bind.annotation.RestController&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@RestController&lt;/span&gt;
&lt;span class="nd"&gt;@RequestMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/api"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserController&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@GetMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"/user"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;produces&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;MediaType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;APPLICATION_XML_VALUE&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;UserResponse&lt;/span&gt; &lt;span class="nf"&gt;getUser&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;UserResponse&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Ayush"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"ayush@example.com"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;4️⃣ Create Main Spring Boot Application Class&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The main class is needed to start the &lt;strong&gt;Spring Boot application&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.example.demo&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.boot.SpringApplication&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.boot.autoconfigure.SpringBootApplication&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@SpringBootApplication&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DemoApplication&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;SpringApplication&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;DemoApplication&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;5️⃣ Run the Application and Test the API&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Start the &lt;strong&gt;Spring Boot application&lt;/strong&gt;, then send a GET request using Postman, Browser, or Curl:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET http://localhost:8080/api/user
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;6️⃣ Expected XML Response Output&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;When the API is called, it returns the response in &lt;strong&gt;XML format&lt;/strong&gt; as shown below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;User&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;Ayush&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;age&amp;gt;&lt;/span&gt;25&lt;span class="nt"&gt;&amp;lt;/age&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;email&amp;gt;&lt;/span&gt;ayush@example.com&lt;span class="nt"&gt;&amp;lt;/email&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/User&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Troubleshooting Common Issues&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;✅ &lt;strong&gt;Error: XML Response Not Showing?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ensure that the &lt;code&gt;jackson-dataformat-xml&lt;/code&gt; dependency is added.&lt;/li&gt;
&lt;li&gt;Check if &lt;code&gt;produces = MediaType.APPLICATION_XML_VALUE&lt;/code&gt; is correctly set in the controller.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;Postman&lt;/strong&gt; and check the &lt;code&gt;Accept&lt;/code&gt; header; set it to &lt;code&gt;application/xml&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;XML Response Showing as JSON?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spring Boot defaults to JSON; explicitly request XML by setting the &lt;code&gt;Accept&lt;/code&gt; header to &lt;code&gt;application/xml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Make sure the model class is correctly annotated with &lt;code&gt;@XmlRootElement&lt;/code&gt; and &lt;code&gt;@XmlAccessorType&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Summary&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;✅ &lt;strong&gt;Added Jackson XML dependency&lt;/strong&gt; to support XML serialization.&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Created a DTO class&lt;/strong&gt; with &lt;code&gt;@XmlRootElement&lt;/code&gt; to define the XML structure.&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Developed a REST API&lt;/strong&gt; that returns XML response using &lt;code&gt;produces = MediaType.APPLICATION_XML_VALUE&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Ran and tested the API&lt;/strong&gt; to verify XML response output.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Using XML in Spring Boot REST APIs is straightforward and useful when working with applications that require XML data exchange. With proper configuration, we can seamlessly switch between JSON and XML responses depending on the client’s request.&lt;/p&gt;

</description>
      <category>java</category>
      <category>ayshriv</category>
      <category>xml</category>
      <category>springboot</category>
    </item>
    <item>
      <title>Setting Up a Development Environment for Java: A Beginner's Guide</title>
      <dc:creator>Ayush Shrivastava</dc:creator>
      <pubDate>Thu, 23 Jan 2025 18:22:56 +0000</pubDate>
      <link>https://forem.com/masteringbackend/setting-up-a-development-environment-for-java-a-beginners-guide-288a</link>
      <guid>https://forem.com/masteringbackend/setting-up-a-development-environment-for-java-a-beginners-guide-288a</guid>
      <description>&lt;p&gt;Java is one of the most popular programming languages in the world. Whether you're a student, a professional, or someone stepping into the world of programming, setting up the right development environment is the first step. Here’s a step-by-step guide to help you get started with Java development.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Install the Java Development Kit (JDK)
&lt;/h2&gt;

&lt;p&gt;The Java Development Kit (JDK) contains everything you need to write, compile, and run Java programs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Steps to Install JDK:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Download the JDK&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Go to the official &lt;a href="https://www.oracle.com/java/technologies/javase-downloads.html" rel="noopener noreferrer"&gt;Oracle Java Downloads&lt;/a&gt; page. Alternatively, you can use &lt;a href="https://openjdk.org/" rel="noopener noreferrer"&gt;OpenJDK&lt;/a&gt; (an open-source version of JDK).&lt;/li&gt;
&lt;li&gt;Choose the latest version of JDK for your operating system (Windows, macOS, or Linux).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Install the JDK&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Run the downloaded installer.&lt;/li&gt;
&lt;li&gt;Follow the instructions on the screen to complete the installation.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Set the Environment Variable&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On &lt;strong&gt;Windows&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Search for &lt;strong&gt;Environment Variables&lt;/strong&gt; in the Start menu.&lt;/li&gt;
&lt;li&gt;Under “System Variables,” find &lt;code&gt;Path&lt;/code&gt; and add the &lt;code&gt;bin&lt;/code&gt; folder of the JDK installation (e.g., &lt;code&gt;C:\Program Files\Java\jdk-XX\bin&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;On &lt;strong&gt;macOS/Linux&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Open the terminal and edit the &lt;code&gt;.bashrc&lt;/code&gt;, &lt;code&gt;.zshrc&lt;/code&gt;, or &lt;code&gt;.bash_profile&lt;/code&gt; file, adding the following:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export JAVA_HOME=/path/to/jdk
export PATH=$JAVA_HOME/bin:$PATH
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Restart your terminal or system to apply the changes.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Verify Installation&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Open your terminal or command prompt and type:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;java -version
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;If Java is installed correctly, you’ll see the version number displayed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 2: Install an Integrated Development Environment (IDE)
&lt;/h2&gt;

&lt;p&gt;An IDE makes writing, debugging, and managing Java projects much easier.&lt;/p&gt;

&lt;h3&gt;
  
  
  Popular IDEs for Java:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Eclipse&lt;/strong&gt;: Free, beginner-friendly, and highly customizable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IntelliJ IDEA&lt;/strong&gt;: A powerful IDE with a free Community edition and a paid Ultimate edition.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NetBeans&lt;/strong&gt;: Another free IDE, good for developing Java applications.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Installing an IDE:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Download the IDE from its official website. For example:

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.eclipse.org/" rel="noopener noreferrer"&gt;Eclipse&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.jetbrains.com/idea/" rel="noopener noreferrer"&gt;IntelliJ IDEA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://netbeans.apache.org/" rel="noopener noreferrer"&gt;NetBeans&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Run the installer and follow the setup instructions.&lt;/li&gt;
&lt;li&gt;Launch the IDE and configure it for Java development (most IDEs will automatically detect the JDK installed on your system).&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Step 3: Write and Run Your First Java Program
&lt;/h2&gt;

&lt;p&gt;Let’s create a simple Java program to test your setup.&lt;/p&gt;

&lt;h3&gt;
  
  
  Using an IDE:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open your IDE and create a new &lt;strong&gt;Java Project&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Create a new &lt;strong&gt;Java Class&lt;/strong&gt; file (e.g., &lt;code&gt;HelloAyush&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Write the following code:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HelloAyush&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello, Ayush!"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click &lt;strong&gt;Run&lt;/strong&gt; or &lt;strong&gt;Execute&lt;/strong&gt; in the IDE toolbar. You should see &lt;code&gt;Hello, Ayush!&lt;/code&gt; printed on the console.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How to Install IntelliJ IDEA
&lt;/h2&gt;

&lt;h2&gt;
  
  
  IntelliJ IDEA is a powerful and user-friendly IDE widely used for Java development. It offers a free Community edition and a paid Ultimate edition.
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Steps to Install IntelliJ IDEA:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Download IntelliJ IDEA&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Visit the official website: &lt;a href="https://www.jetbrains.com/idea/" rel="noopener noreferrer"&gt;IntelliJ IDEA Downloads&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Choose the &lt;strong&gt;Community edition&lt;/strong&gt; (free) or the &lt;strong&gt;Ultimate edition&lt;/strong&gt; (paid).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Install IntelliJ IDEA&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Run the downloaded installer.&lt;/li&gt;
&lt;li&gt;Follow the on-screen instructions to complete the installation.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configure IntelliJ IDEA&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Launch IntelliJ IDEA and choose the default settings during the initial setup.&lt;/li&gt;
&lt;li&gt;Ensure that the IDE detects the JDK installed on your system. If not, manually add the JDK path under &lt;strong&gt;File &amp;gt; Project Structure &amp;gt; SDKs&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Install Plugins (Optional)&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;IntelliJ IDEA supports various plugins to enhance your productivity. You can install them via &lt;strong&gt;File &amp;gt; Settings &amp;gt; Plugins&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Write and Run Your First Java Program Using IntelliJ IDEA
&lt;/h2&gt;

&lt;p&gt;Let’s create a simple Java program to test your setup.&lt;/p&gt;

&lt;h3&gt;
  
  
  Using IntelliJ IDEA:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open IntelliJ IDEA and create a new &lt;strong&gt;Java Project&lt;/strong&gt;.

&lt;ul&gt;
&lt;li&gt;Select &lt;strong&gt;File &amp;gt; New &amp;gt; Project&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;Java&lt;/strong&gt; and set the JDK.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Create a new &lt;strong&gt;Java Class&lt;/strong&gt; file (e.g., &lt;code&gt;HelloWorld&lt;/code&gt;).

&lt;ul&gt;
&lt;li&gt;Right-click on the &lt;code&gt;src&lt;/code&gt; folder, select &lt;strong&gt;New &amp;gt; Java Class&lt;/strong&gt;, and name it &lt;code&gt;HelloWorld&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Write the following code:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HelloWorld&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello, World!"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run the program:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click the green &lt;strong&gt;Run&lt;/strong&gt; button in the toolbar or right-click the file and select &lt;strong&gt;Run HelloWorld.main()&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;You should see &lt;code&gt;Hello, World!&lt;/code&gt; printed on the console.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;You have successfully set up your Java development environment with IntelliJ IDEA. With the JDK, IntelliJ IDEA, , you are ready to start building Java applications. Practice regularly to improve your skills and create amazing projects!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>What are the key differences between an Interface and an Abstract class?</title>
      <dc:creator>Ayush Shrivastava</dc:creator>
      <pubDate>Mon, 06 Jan 2025 18:26:29 +0000</pubDate>
      <link>https://forem.com/ayshriv/what-are-the-key-differences-between-an-interface-and-an-abstract-class-4665</link>
      <guid>https://forem.com/ayshriv/what-are-the-key-differences-between-an-interface-and-an-abstract-class-4665</guid>
      <description>&lt;h2&gt;
  
  
  Interface vs Abstract Class
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Interface
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;100% abstraction (prior to Java 8).&lt;/li&gt;
&lt;li&gt;Can have default/static methods (Java 8+).&lt;/li&gt;
&lt;li&gt;No constructors.&lt;/li&gt;
&lt;li&gt;Multiple inheritance allowed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Abstract Class
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Partial abstraction.&lt;/li&gt;
&lt;li&gt;Can have constructors and fields.&lt;/li&gt;
&lt;li&gt;Single inheritance only.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Examples
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Interface&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;interface Animal {
    void makeSound(); // Method declaration
}
class Dog implements Animal {
    public void makeSound() {
        System.out.println("Bark");
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Abstract Class
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;abstract class Vehicle {
    abstract void start(); // Abstract method
    void stop() {
        System.out.println("Vehicle stopped"); // Concrete method
    }
}
class Car extends Vehicle {
    void start() {
        System.out.println("Car started");
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;When to Use What?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use Interface When:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need to define a contract for unrelated classes.&lt;/li&gt;
&lt;li&gt;Multiple inheritance of type is required.&lt;/li&gt;
&lt;li&gt;You want to provide default or static methods without affecting the implementing classes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use Abstract Class When:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Classes share a common base and need to share code.&lt;/li&gt;
&lt;li&gt;You want to provide some implemented methods and enforce others to be overridden.&lt;/li&gt;
&lt;li&gt;You need constructors or non-constant fields.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Both interfaces and abstract classes are powerful tools in Java, and choosing between them depends on your application's needs. Use interfaces to define behaviors across unrelated classes and abstract classes for shared code in a class hierarchy.&lt;/p&gt;

&lt;p&gt;By understanding their differences and strengths, you can write cleaner and more maintainable code. Happy coding! 🚀&lt;/p&gt;

</description>
      <category>ayshriv</category>
      <category>java</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
