<?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: Phoenix</title>
    <description>The latest articles on Forem by Phoenix (@phoenix_238501d86d417e).</description>
    <link>https://forem.com/phoenix_238501d86d417e</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%2F2105472%2F08677fa2-ad87-48ad-b9d1-33ff0bbb848c.png</url>
      <title>Forem: Phoenix</title>
      <link>https://forem.com/phoenix_238501d86d417e</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/phoenix_238501d86d417e"/>
    <language>en</language>
    <item>
      <title>Proxy - Forward Proxy and Reverse Proxy</title>
      <dc:creator>Phoenix</dc:creator>
      <pubDate>Wed, 22 Apr 2026 15:39:40 +0000</pubDate>
      <link>https://forem.com/phoenix_238501d86d417e/proxy-forward-proxy-and-reverse-proxy-380</link>
      <guid>https://forem.com/phoenix_238501d86d417e/proxy-forward-proxy-and-reverse-proxy-380</guid>
      <description>&lt;p&gt;A proxy server is an intermediary piece of hardware/software acts like a middlemen sitting between the client and the backend server. It receives requests from clients and relays them to the origin servers.&lt;/p&gt;

&lt;p&gt;2 types of Proxy&lt;br&gt;
Forward Proxy -works for clients&lt;br&gt;
Reverse Proxy  works for servers&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Forward Proxy&lt;/strong&gt;&lt;br&gt;
A forward proxy sits in front of clients and internet. It hides the client's identity from the server. When those clients make requests to sites and services on the internet, the proxy server intercepts those requests and then communicates with web servers on behalf of those clients, like a middleman.&lt;br&gt;
Think of a VPN or corporate proxy: the server sees the proxy's IP, not yours. Use cases include privacy, content filtering, and bypassing geo-restrictions.&lt;/p&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%2Ftxoi2t2dp8xhs0n1htmx.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%2Ftxoi2t2dp8xhs0n1htmx.png" alt=" " width="800" height="339"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;-&amp;gt; works at application level(http/https)&lt;/p&gt;

&lt;p&gt;Advantages of a forward proxy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Block access to certain content&lt;/li&gt;
&lt;li&gt;it does security filtering, by stoping from downloading or opening malicious content before it reaches the server&lt;/li&gt;
&lt;li&gt;tracks  monitoring and logging of which websites visited and usage&lt;/li&gt;
&lt;li&gt;Stores copies of frequently visited websites&lt;/li&gt;
&lt;li&gt;Reduces internet usage and speeds things up&lt;/li&gt;
&lt;li&gt;Provides anonymity&lt;/li&gt;
&lt;li&gt;Access blocked content (in some cases)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;VPN:&lt;/strong&gt;&lt;br&gt;
Used to securely and privately route all network traffic through an encrypted tunnel.&lt;/p&gt;

&lt;p&gt;VPN and forward proxy serve different purposes. VPN provides secure encrypted communication, while forward proxy provides control and filtering. They are often used together in enterprise environments&lt;/p&gt;

&lt;p&gt;Reverse Proxy&lt;/p&gt;

&lt;p&gt;A reverse proxy sits in front of servers and internet. It hides the server's identity from the client. this proxy intercepting requests from clients. When clients send requests to the origin server of a website, those requests are intercepted by the reverse proxy server. The client thinks it is talking to one server, but the reverse proxy could be routing requests to dozens of backend servers. &lt;/p&gt;

&lt;p&gt;_A reverse proxy is not just a load balancer, but it can perform load balancing along with other functions like caching, SSL termination, and security.&lt;br&gt;
_&lt;br&gt;
Advantages of a forward proxy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Distributes traffic across multiple servers&lt;br&gt;
Example:&lt;br&gt;
Amazon&lt;br&gt;
Netflix&lt;br&gt;
Millions of users → reverse proxy spreads load&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Security (very important)&lt;br&gt;
Hides real server IPs&lt;br&gt;
Blocks malicious traffic&lt;br&gt;
Acts as first line of defense&lt;br&gt;
Example:&lt;br&gt;
Cloudflare sits in front of websites&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Caching (performance boost)&lt;br&gt;
Stores frequently requested data&lt;br&gt;
Sends it quickly without hitting backend&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;not very data, only public/static content shared across users&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;reduce latency and improve performance&lt;br&gt;
Example:&lt;br&gt;
Homepage loads faster because proxy cached it&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SSL/TLS Termination&lt;br&gt;
Handles HTTPS encryption&lt;br&gt;
Backend servers don’t need to handle it&lt;br&gt;
Example:&lt;br&gt;
NGINX manages HTTPS&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;1. Cloudflare (outer layer)&lt;/strong&gt;&lt;br&gt;
Sits on the internet edge&lt;br&gt;
First point of contact for users worldwide&lt;br&gt;
What it does:&lt;br&gt;
🌍 CDN (serves content from nearest location)&lt;br&gt;
🛡️ DDoS protection&lt;br&gt;
🔒 SSL (HTTPS)&lt;br&gt;
🚫 Blocks malicious traffic&lt;/p&gt;

&lt;p&gt;👉 Think of it as:&lt;br&gt;
Global security + performance layer&lt;/p&gt;

&lt;p&gt;** 2. NGINX (inside your system)**&lt;br&gt;
Runs on your server or infrastructure&lt;br&gt;
What it does:&lt;br&gt;
🔀 Routes requests to backend services&lt;br&gt;
⚖️ Load balancing&lt;br&gt;
🔐 SSL termination (if not handled by Cloudflare)&lt;br&gt;
⚡ Caching&lt;/p&gt;

&lt;p&gt;👉 Think of it as:&lt;br&gt;
Internal traffic manager&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>beginners</category>
      <category>networking</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>JWT vs JWS</title>
      <dc:creator>Phoenix</dc:creator>
      <pubDate>Wed, 22 Apr 2026 10:42:59 +0000</pubDate>
      <link>https://forem.com/phoenix_238501d86d417e/jwt-vs-jws-4ikd</link>
      <guid>https://forem.com/phoenix_238501d86d417e/jwt-vs-jws-4ikd</guid>
      <description>&lt;p&gt;&lt;strong&gt;JWT (JSON Web Token)&lt;/strong&gt; is a compact, URL-safe token format used to securely transmit information between parties as a JSON object.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key points in definition:&lt;/strong&gt;&lt;br&gt;
Compact → small, efficient (xxxxx.yyyyy.zzzzz)&lt;br&gt;
URL-safe → can be sent in headers/URLs&lt;br&gt;
JSON-based → payload is JSON&lt;br&gt;
Claims → contains data like userId, role&lt;br&gt;
Can be signed or encrypted&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JWS (JSON Web Signature)&lt;/strong&gt; is a specification that defines how to digitally sign a payload (such as a JWT) to ensure its integrity and authenticity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key points:&lt;/strong&gt;&lt;br&gt;
Uses digital signature&lt;br&gt;
Ensures:&lt;br&gt;
Integrity (data not modified)&lt;br&gt;
Authenticity (issued by trusted source)&lt;br&gt;
Does not encrypt the payload&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cookies vs JWT</title>
      <dc:creator>Phoenix</dc:creator>
      <pubDate>Wed, 22 Apr 2026 09:57:34 +0000</pubDate>
      <link>https://forem.com/phoenix_238501d86d417e/cookies-vs-jwt-3f6j</link>
      <guid>https://forem.com/phoenix_238501d86d417e/cookies-vs-jwt-3f6j</guid>
      <description>&lt;p&gt;Cookies are small pieces of data stored in the browser, typically set by the server using the Set-Cookie header.&lt;/p&gt;

&lt;p&gt;They can include attributes such as:&lt;br&gt;
&lt;strong&gt;Max-Age / Expires&lt;/strong&gt; → defines how long the cookie is valid&lt;br&gt;
&lt;strong&gt;HttpOnly&lt;/strong&gt; → prevents access from JavaScript (improves security - it cannot be accessed by JS using document.cookie XSS attacks)&lt;br&gt;
&lt;strong&gt;Secure&lt;/strong&gt; → ensures the cookie is only sent over HTTPS&lt;br&gt;
&lt;strong&gt;SameSite&lt;/strong&gt; → controls cross-site request behavior&lt;/p&gt;

&lt;p&gt;🔁 &lt;strong&gt;Authentication flow using cookies (server-side sessions)&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;User logs in with credentials&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server:&lt;/strong&gt;
Creates a session (stored in DB/memory)
Generates a session ID
Sends it to the browser via:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Set-Cookie: session_id=abc123
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;&lt;p&gt;**Browser:&lt;br&gt;
**Stores the cookie&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automatically includes it in future requests:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Cookie: session_id=abc123
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Because they are sent with every request (including images/scripts), large cookies can impact performance&lt;/p&gt;

&lt;p&gt;🌐 &lt;strong&gt;Cookie behavior in requests&lt;/strong&gt;&lt;br&gt;
For same-origin requests → cookies are sent automatically&lt;br&gt;
For cross-origin requests → must explicitly enable:&lt;br&gt;
Frontend: credentials: "include" or withCredentials: true&lt;br&gt;
Backend: Access-Control-Allow-Credentials: true&lt;br&gt;
⏳ &lt;strong&gt;Expiry behavior&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Session cookies (no expiry):&lt;br&gt;
Deleted when browser closes&lt;br&gt;
Persistent cookies (with Max-Age / Expires):&lt;br&gt;
Remain after browser restart&lt;/p&gt;

&lt;p&gt;⚠️** Important distinction**&lt;br&gt;
Cookie expiry and session expiry are separate:&lt;/p&gt;

&lt;p&gt;Cookie expiry → controlled by browser&lt;br&gt;
Session expiry → controlled by server&lt;/p&gt;

&lt;p&gt;Even if a cookie is still valid, the user is logged out if the server session has expired.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key takeaway&lt;/strong&gt;&lt;br&gt;
Cookie = identifier stored in browser&lt;br&gt;
Session = actual user data stored on server&lt;br&gt;
Cookie is automatically sent with requests (with some cross-origin rules&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Challenges&lt;/strong&gt;&lt;br&gt;
In a distributed system with multiple backend servers behind a load balancer, session-based authentication can be harder to scale because sessions are stored on the server side and creates challenges like session sharing, synchronization, and additional database or cache lookups on every request&lt;/p&gt;

&lt;p&gt;If a session is stored on one server and a subsequent request is routed to a different server, that server won’t recognize the session, making the user appear logged out.&lt;/p&gt;

&lt;p&gt;To solve this, systems typically use a shared session store like Redis or a database that all servers can access. However, this introduces additional overhead because every request requires a lookup to fetch session data, which adds latency and increases infrastructure complexity.&lt;/p&gt;

&lt;p&gt;This is why session-based systems are considered stateful and harder to scale compared to stateless approaches like JWT.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CSRF = Cross-Site Request Forgery&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;👉 It’s an attack where:&lt;/p&gt;

&lt;p&gt;A malicious website tricks your browser into making a request to another site where you are already logged in.&lt;/p&gt;

&lt;p&gt;CSRF is an attack where a malicious site tricks a user’s browser into making unintended requests to another site where the user is authenticated. It happens because cookies are automatically sent with requests. CSRF tokens prevent this by adding a secret value that must be validated by the server.&lt;/p&gt;

&lt;p&gt;Browsers automatically send cookies with requests&lt;/p&gt;

&lt;p&gt;That’s the root cause.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JWT&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;JWT (JSON Web Token) is a self-contained token that carries user information and proves authentication.&lt;/p&gt;

&lt;p&gt;it is compact URL-safe means of representing claims to be transferred between two parties”. A JWT leverages Javascript Object Notation (JSON) to represent these claims, resulting in a small and simple token that is used by protocols such as OpenID Connect 1.0 to represent identity to the application and OAuth 2.0 to represent an access token for API authorization.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Structure:&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;header.payload.signature
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Header → algorithm (e.g., HS256)&lt;br&gt;
Payload → user data (userId, role, exp)&lt;br&gt;
Signature → ensures integrity (not tampered)&lt;/p&gt;

&lt;p&gt;🔐 &lt;strong&gt;Signing (Data Integrity)&lt;/strong&gt;&lt;br&gt;
Server signs the token using a secret key&lt;br&gt;
Signature ensures&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Token is issued by server&lt;/li&gt;
&lt;li&gt;Data is not modified&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 If payload changes → signature becomes invalid&lt;/p&gt;

&lt;p&gt;⚠️ &lt;strong&gt;JWT is NOT encrypted by default&lt;/strong&gt;&lt;br&gt;
Payload is base64 encoded (readable)&lt;br&gt;
Anyone can decode it&lt;br&gt;
But cannot modify it (signature protects it)&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Do NOT store sensitive data in JWT&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🔁 JWT Authentication Flow&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User logs in&lt;/li&gt;
&lt;li&gt;Server generates JWT&lt;/li&gt;
&lt;li&gt;Client stores token&lt;/li&gt;
&lt;li&gt;Client sends token in requests:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Authorization: Bearer &amp;lt;token&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Server verifies signature → authenticates user&lt;br&gt;
📦 Where to store JWT&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;localStorage
✅ &lt;strong&gt;Pros:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Easy to use&lt;/li&gt;
&lt;li&gt;Full control in frontend
❌ &lt;strong&gt;Cons:&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Vulnerable to XSS attacks (JS can read token)&lt;/li&gt;
&lt;li&gt;Cookies (HttpOnly)
✅ Pros:&lt;/li&gt;
&lt;li&gt;Protected from XSS (HttpOnly)&lt;/li&gt;
&lt;li&gt;Automatically sent with requests
❌ Cons:&lt;/li&gt;
&lt;li&gt;Vulnerable to CSRF attacks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Storage   Risk&lt;/strong&gt;&lt;br&gt;
localStorage    XSS&lt;br&gt;
Cookies CSRF&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Best practice&lt;/strong&gt;&lt;br&gt;
Store JWT in HttpOnly cookies&lt;br&gt;
Use:&lt;br&gt;
Secure&lt;br&gt;
SameSite&lt;/p&gt;

&lt;p&gt;🚨 &lt;strong&gt;CSRF (Cross-Site Request Forgery)&lt;/strong&gt;&lt;br&gt;
🧾 Example&lt;br&gt;
You are logged into bank.com&lt;/p&gt;

&lt;p&gt;Attacker site triggers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://bank.com/transfer?amount=1000"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Browser sends:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Cookie: session_id=abc123
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Server thinks request is valid&lt;/p&gt;

&lt;p&gt;🛡️** CSRF Protection**&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;CSRF Token (core idea)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;👉 Add a secret token that attacker cannot access&lt;/p&gt;

&lt;p&gt;🔁 &lt;strong&gt;Synchronizer Token Pattern&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Server stores&lt;/li&gt;
&lt;li&gt;session → csrf_token&lt;/li&gt;
&lt;li&gt;Sends token to client&lt;/li&gt;
&lt;li&gt;Client sends it back&lt;/li&gt;
&lt;li&gt;Server validates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔁 &lt;strong&gt;Double Submit Cookie Patter&lt;/strong&gt;&lt;br&gt;
Step 1: Server sends cookies&lt;br&gt;
session_id=abc123   (HttpOnly)&lt;br&gt;
csrf_token=xyz789   (readable by JS)&lt;br&gt;
Step 2: Client sends request&lt;br&gt;
Cookie: session_id=abc123; csrf_token=xyz789&lt;br&gt;
Header: X-CSRF-Token: xyz789&lt;br&gt;
Step 3: Server validates&lt;br&gt;
cookie csrf_token === header csrf_token&lt;br&gt;
✅ Why it works&lt;br&gt;
Attacker cannot:&lt;br&gt;
Read cookie&lt;br&gt;
Set custom headers&lt;/p&gt;

&lt;p&gt;👉 Request is rejected&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;SameSite Cookies
Set-Cookie: session_id=abc123; SameSite=Strict&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;👉 Prevents cookies in cross-site requests&lt;/p&gt;

&lt;p&gt;🔐 Access Token vs Refresh Token&lt;br&gt;
🧾 Access Token&lt;br&gt;
Short-lived (e.g., 15 min)&lt;br&gt;
Used for API requests&lt;br&gt;
Authorization: Bearer &lt;br&gt;
🔁 Refresh Token&lt;br&gt;
Long-lived (e.g., 7 days)&lt;br&gt;
Used to get new access tokens&lt;/p&gt;

&lt;p&gt;⚠️ Important Concepts Summary&lt;br&gt;
Integrity vs Confidentiality&lt;br&gt;
Integrity → data not modified (JWT provides this)&lt;br&gt;
Confidentiality → data hidden (JWT does NOT provide by default)&lt;br&gt;
Sessions vs JWT&lt;br&gt;
Session → server stores data (stateful)&lt;br&gt;
JWT → client carries data (stateless)&lt;br&gt;
CSRF vs XSS&lt;br&gt;
Attack  Target&lt;br&gt;
CSRF    Cookies (auto-sent)&lt;br&gt;
XSS localStorage / JS-accessible data&lt;/p&gt;

</description>
      <category>backend</category>
      <category>beginners</category>
      <category>security</category>
      <category>webdev</category>
    </item>
    <item>
      <title>SAML - Single Sgn On</title>
      <dc:creator>Phoenix</dc:creator>
      <pubDate>Tue, 21 Apr 2026 18:14:36 +0000</pubDate>
      <link>https://forem.com/phoenix_238501d86d417e/saml-single-sgn-on-c7c</link>
      <guid>https://forem.com/phoenix_238501d86d417e/saml-single-sgn-on-c7c</guid>
      <description>&lt;p&gt;*&lt;em&gt;How SAML works *&lt;/em&gt;&lt;br&gt;
SAML (Security Assertion Markup Language) is an XML-based protocol for Single Sign-On. The core idea: instead of every app managing its own login, one trusted system (the IdP) handles authentication and vouches for you to other apps (SPs) via a signed XML token.&lt;br&gt;
There are two flows — SP-initiated (most common — user hits the app first) and IdP-initiated (user starts from an IdP portal). The diagram below shows SP-initiated.&lt;/p&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%2F7nh3lybokawb1ty868u3.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%2F7nh3lybokawb1ty868u3.png" alt=" " width="800" height="644"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Core actors&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;SP (Service Provider) — the app the user wants to access. It trusts the IdP but cannot authenticate users itself.&lt;br&gt;
IdP (Identity Provider) — the central auth system (Okta, Azure AD, Google Workspace). It knows who the user is.&lt;br&gt;
Principal — the end user being authenticated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key messages&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AuthnRequest — XML request from SP to IdP saying "please authenticate this user." Contains an AssertionConsumerServiceURL (where to send the response back).&lt;br&gt;
SAMLResponse — XML sent back from IdP to SP, containing one or more Assertions.&lt;br&gt;
Assertion — the actual claim inside the response. Three types:&lt;/p&gt;

&lt;p&gt;Authentication assertion — "this user logged in at time X"&lt;br&gt;
Attribute assertion — "this user's email is &lt;a href="mailto:x@y.com"&gt;x@y.com&lt;/a&gt;, role is admin"&lt;br&gt;
Authorization assertion — "this user is allowed to do Y" (rare)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Binding types (how messages travel)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;HTTP Redirect binding — used for the AuthnRequest; base64-encoded and sent as a URL query parameter. Small messages only.&lt;br&gt;
HTTP POST binding — used for the SAMLResponse; sent as an HTML form POST. Can carry large XML payloads.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Security concepts&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
Signature — the IdP digitally signs the assertion using its private key. SP validates using IdP's public certificate. This is what prevents forgery.&lt;br&gt;
ACS URL (Assertion Consumer Service URL) — the SP endpoint that receives the SAMLResponse. Must be registered on the IdP to prevent redirect attacks.&lt;br&gt;
Entity ID — unique identifier for the SP or IdP (usually a URL). Used to look up metadata.&lt;br&gt;
Metadata XML — a file exchanged between SP and IdP during setup containing certificates, URLs, and supported bindings.&lt;br&gt;
Relay State — an opaque value that carries where the user originally wanted to go, so SP can redirect them there after login.&lt;br&gt;
NotBefore / NotOnOrAfter — time constraints on the assertion to prevent replay attacks.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>beginners</category>
      <category>security</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Spring AOP</title>
      <dc:creator>Phoenix</dc:creator>
      <pubDate>Mon, 06 Apr 2026 09:03:30 +0000</pubDate>
      <link>https://forem.com/phoenix_238501d86d417e/spring-aop-3khf</link>
      <guid>https://forem.com/phoenix_238501d86d417e/spring-aop-3khf</guid>
      <description>&lt;p&gt;In Spring AOP, a join point represents a point in program execution where an aspect can be applied, typically a method execution.&lt;br&gt;
A pointcut is an expression that selects specific join points where we want to apply additional behavior(advice).&lt;br&gt;
An advice defines what action should be executed at those selected join points, such as before or after a method call.&lt;br&gt;
An aspect is a combination of pointcut and advice, representing a complete cross-cutting concern like logging or transaction management.&lt;/p&gt;

&lt;p&gt;Spring implements AOP using proxy objects, which intercept method calls and apply the defined advice at runtime.&lt;/p&gt;

&lt;p&gt;When a Spring application starts, it scans for beans and also detects classes annotated with &lt;a class="mentioned-user" href="https://dev.to/aspect"&gt;@aspect&lt;/a&gt;.&lt;br&gt;
These aspect classes contain pointcut expressions, which define where the advice should be applied.&lt;br&gt;
Spring then matches these pointcuts against eligible methods in target beans (which are the join points in Spring AOP).&lt;br&gt;
If a match is found, Spring registers this AOP configuration and creates a proxy around the target bean so that the advice can be applied at runtime.&lt;/p&gt;

&lt;p&gt;When a method is invoked on the proxied bean, the call is intercepted by the proxy.&lt;br&gt;
The proxy checks if the method matches any pointcut expressions, and if so, executes the corresponding advice.&lt;br&gt;
After applying the advice, the proxy delegates the call to the actual method in the target object.&lt;/p&gt;

&lt;p&gt;Application Startup:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Scan beans&lt;/li&gt;
&lt;li&gt;Detect &lt;a class="mentioned-user" href="https://dev.to/aspect"&gt;@aspect&lt;/a&gt; classes&lt;/li&gt;
&lt;li&gt;Read pointcuts and advice&lt;/li&gt;
&lt;li&gt;Match pointcuts with target bean methods&lt;/li&gt;
&lt;li&gt;Create proxy for matching beans&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Runtime:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Method call → goes to proxy&lt;/li&gt;
&lt;li&gt;Proxy intercepts&lt;/li&gt;
&lt;li&gt;Executes advice&lt;/li&gt;
&lt;li&gt;Calls actual method&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;How does AOP work using &lt;a class="mentioned-user" href="https://dev.to/aspect"&gt;@aspect&lt;/a&gt; in Spring?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In Spring AOP, when we define a class with &lt;a class="mentioned-user" href="https://dev.to/aspect"&gt;@aspect&lt;/a&gt;, Spring treats it as a container for cross-cutting concerns.&lt;br&gt;
During application startup, Spring scans these aspects and creates proxy objects for the target beans.&lt;br&gt;
When a method is invoked on the target bean, the call goes through the proxy instead of directly to the object.&lt;br&gt;
The proxy intercepts the method call, checks if any pointcut expressions match, and if so, executes the corresponding advice such as @Before, @After, or @Around.&lt;br&gt;
After applying the advice, the proxy delegates the call to the actual target method.&lt;/p&gt;

&lt;p&gt;This proxy-based mechanism allows Spring to add behavior like logging, transactions, or async execution without modifying the actual business logic.&lt;/p&gt;

&lt;p&gt;For example, if I define a @Before advice on all service methods, whenever a service method is called, the proxy will first execute the logging logic and then call the actual method.&lt;/p&gt;

&lt;p&gt;Scan → Create Proxy → Intercept → Match Pointcut → Execute Advice → Call Method&lt;/p&gt;

&lt;p&gt;Spring AOP works by creating proxy objects that intercept method calls, apply advice based on pointcut matching, and then delegate execution to the target object.&lt;/p&gt;

</description>
      <category>backend</category>
      <category>java</category>
      <category>programming</category>
      <category>springboot</category>
    </item>
    <item>
      <title>LLM vs Agentic AI</title>
      <dc:creator>Phoenix</dc:creator>
      <pubDate>Mon, 02 Mar 2026 06:57:11 +0000</pubDate>
      <link>https://forem.com/phoenix_238501d86d417e/llm-vs-agentic-ai-9bc</link>
      <guid>https://forem.com/phoenix_238501d86d417e/llm-vs-agentic-ai-9bc</guid>
      <description>&lt;p&gt;&lt;strong&gt;LLM&lt;/strong&gt;&lt;br&gt;
An LLM (like OpenAI’s GPT models) reads text and predicts what words should come next. It can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Answer questions&lt;/li&gt;
&lt;li&gt;Write emails&lt;/li&gt;
&lt;li&gt;Explain concepts&lt;/li&gt;
&lt;li&gt;Translate languages&lt;/li&gt;
&lt;li&gt;Help with code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But here’s the key thing:&lt;/p&gt;

&lt;p&gt;👉 It only responds when you ask it something.&lt;br&gt;
👉 It doesn’t take actions on its own.&lt;br&gt;
👉 It doesn’t have goals.&lt;/p&gt;

&lt;p&gt;ChatGPT, Claude (in basic chat mode) = LLMs in action&lt;/p&gt;

&lt;p&gt;It’s like a very smart assistant waiting for instructions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agentic AI&lt;/strong&gt;&lt;br&gt;
Agentic AI is more like:&lt;br&gt;
An AI that can act to achieve a goal.&lt;/p&gt;

&lt;p&gt;Instead of just answering, it can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make a plan&lt;/li&gt;
&lt;li&gt;Use tools (search the web, run code, access apps)&lt;/li&gt;
&lt;li&gt;Make decisions without you guiding each step&lt;/li&gt;
&lt;li&gt;Try again if something fails&lt;/li&gt;
&lt;li&gt;Work step-by-step toward a goal&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Claude Code, ChatGPT with plugins doing multi-step tasks = Agentic AI&lt;br&gt;
It behaves more like an independent worker than just a chatbot.&lt;/p&gt;

&lt;p&gt;Most agentic AI systems actually use LLMs inside them.&lt;/p&gt;

&lt;p&gt;Think of it like this:&lt;/p&gt;

&lt;p&gt;LLM = the brain&lt;/p&gt;

&lt;p&gt;Agentic system = the brain + hands + memory + ability to act&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>beginners</category>
      <category>llm</category>
    </item>
    <item>
      <title>Annotation in SpringBoot Web Application</title>
      <dc:creator>Phoenix</dc:creator>
      <pubDate>Mon, 02 Feb 2026 07:29:45 +0000</pubDate>
      <link>https://forem.com/phoenix_238501d86d417e/annotation-in-springboot-web-application-19lh</link>
      <guid>https://forem.com/phoenix_238501d86d417e/annotation-in-springboot-web-application-19lh</guid>
      <description>&lt;p&gt;&lt;strong&gt;Core Spring&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@Component&lt;/code&gt;&lt;br&gt;
Marks a class as a Spring-managed bean so it can be automatically created and injected.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@Service&lt;/code&gt;&lt;br&gt;
Used for business logic classes; it’s a specialized form of @Component.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@Autowired&lt;/code&gt;&lt;br&gt;
Tells Spring to automatically inject a required dependency.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@Bean&lt;/code&gt;&lt;br&gt;
Defines a bean inside a configuration class.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@Configuration&lt;/code&gt;&lt;br&gt;
Marks a class that contains Spring bean definitions.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@Primary&lt;/code&gt;&lt;br&gt;
Marks a bean as the default choice when multiple beans are available.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@Qualifier&lt;/code&gt;&lt;br&gt;
Used when multiple beans exist to specify which one should be injected.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@Repository&lt;/code&gt;&lt;br&gt;
“Used for data access classes and also enables automatic exception translation.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@Controller&lt;/code&gt;&lt;br&gt;
Marks a class as a web controller that handles HTTP requests.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@RestController&lt;/code&gt;&lt;br&gt;
A controller that returns data (usually JSON) instead of views.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spring Boot&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;@SpringBootApplication&lt;/code&gt;&lt;br&gt;
Main annotation that enables auto-configuration, component scanning, and configuration support.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@EnableAutoConfiguration&lt;/code&gt;&lt;br&gt;
Allows Spring Boot to automatically configure beans based on the project setup.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@ComponentScan&lt;/code&gt;&lt;br&gt;
Tells Spring where to look for components.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@Value&lt;/code&gt;&lt;br&gt;
Used to read values from application.properties.&lt;/p&gt;

</description>
      <category>springboot</category>
      <category>spring</category>
      <category>java</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Password Management - SpringBoot</title>
      <dc:creator>Phoenix</dc:creator>
      <pubDate>Mon, 02 Feb 2026 06:12:39 +0000</pubDate>
      <link>https://forem.com/phoenix_238501d86d417e/password-management-springboot-56n3</link>
      <guid>https://forem.com/phoenix_238501d86d417e/password-management-springboot-56n3</guid>
      <description>&lt;p&gt;&lt;strong&gt;Why Password Hashing Is Needed&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Storing passwords in plain text is dangerous.&lt;br&gt;
If a database is leaked, attackers immediately get all user passwords.&lt;/p&gt;

&lt;p&gt;So instead of storing passwords, we store &lt;strong&gt;hashed values.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A hash is a one-way mathematical function that converts a password into an unreadable string.&lt;br&gt;
You cannot reverse it to get the original password.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mypassword → $2a$10$Hf7sd8KJH...3fd2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;How Login Works with Hashed Passwords&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When a user logs in:&lt;/li&gt;
&lt;li&gt;User enters password&lt;/li&gt;
&lt;li&gt;Spring Security hashes the entered password&lt;/li&gt;
&lt;li&gt;It compares the new hash with the stored hash in DB&lt;/li&gt;
&lt;li&gt;If both match → login succeeds&lt;/li&gt;
&lt;li&gt;The original password is never stored or compared&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;PasswordEncoder in Spring Security&lt;/p&gt;

&lt;p&gt;Spring Security uses an interface called:&lt;/p&gt;

&lt;p&gt;PasswordEncoder&lt;/p&gt;

&lt;p&gt;It has two main methods:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;String encode(CharSequence rawPassword);
boolean matches(CharSequence rawPassword, String encodedPassword);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Best Algorithm: BCrypt&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Spring recommends BCrypt because it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uses salt automatically&lt;/li&gt;
&lt;li&gt;Is slow (harder for hackers to brute force)&lt;/li&gt;
&lt;li&gt;Is adaptive (can be made stronger over time)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why Salting Matters&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Without salt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;password → hash

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

&lt;/div&gt;



&lt;p&gt;With salt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;password + randomValue → hash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Even if two users have the same password, their hashes will be different.&lt;/p&gt;

&lt;p&gt;BCrypt handles salting automatically.&lt;/p&gt;

&lt;p&gt;“A salt is a random value added to a password before hashing to make each hash unique and protect against rainbow-table and brute-force attacks.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How Salt Works&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User creates a password&lt;/li&gt;
&lt;li&gt;System generates a random salt&lt;/li&gt;
&lt;li&gt;Password + salt are hashed together&lt;/li&gt;
&lt;li&gt;Both salt and hash are stored in the database&lt;/li&gt;
&lt;/ul&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$2a$10$WERTY...SALT...HASH
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When user logs in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spring Security extracts the salt from the stored hash&lt;/li&gt;
&lt;li&gt;It hashes the entered password using that same salt&lt;/li&gt;
&lt;li&gt;If hashes match → login succeeds&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>java</category>
      <category>security</category>
      <category>springboot</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Tomcat Server - Servlet Container</title>
      <dc:creator>Phoenix</dc:creator>
      <pubDate>Sat, 31 Jan 2026 09:48:55 +0000</pubDate>
      <link>https://forem.com/phoenix_238501d86d417e/tomcat-server-servlet-container-53og</link>
      <guid>https://forem.com/phoenix_238501d86d417e/tomcat-server-servlet-container-53og</guid>
      <description>&lt;p&gt;&lt;strong&gt;Tomcat is the web server that runs your Spring application and connects it to the browser.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is a Servlet?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In Java web development, a Servlet is just a Java class that:&lt;/p&gt;

&lt;p&gt;Receives an HTTP request and returns an HTTP response&lt;/p&gt;

&lt;p&gt;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;Browser  →  Servlet  →  Response (HTML / JSON)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Servlet runs Java code and returns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;h1&amp;gt;Welcome&amp;lt;/h1&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But…&lt;/p&gt;

&lt;p&gt;A servlet cannot run by itself&lt;br&gt;
It needs a Servlet Container&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is a Servlet Container?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A Servlet Container is a software that:&lt;/p&gt;

&lt;p&gt;✔ Starts your servlets&lt;br&gt;
✔ Listens to HTTP requests&lt;br&gt;
✔ Calls the right servlet&lt;br&gt;
✔ Sends the response back&lt;br&gt;
✔ Manages threads, memory, security&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Servlet Container = Runtime environment for servlets&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So we need something that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Opens port 8080&lt;/li&gt;
&lt;li&gt;Accepts browser requests&lt;/li&gt;
&lt;li&gt;Runs your servlet Java code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That “something” is called a &lt;strong&gt;Servlet Container&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is Tomcat?&lt;/strong&gt;&lt;br&gt;
Apache Tomcat is a Servlet Container&lt;/p&gt;

&lt;p&gt;Tomcat’s job is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Browser → Tomcat → Servlet → Response → Tomcat → Browser&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tomcat:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Opens a port (like 8080)&lt;/li&gt;
&lt;li&gt;Understands HTTP&lt;/li&gt;
&lt;li&gt;Runs servlets&lt;/li&gt;
&lt;li&gt;Manages lifecycle of web apps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Without Tomcat, your Spring web app is just Java files — nobody can access it via browser.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Spring is a framework that helps you write Java code.&lt;/p&gt;

&lt;p&gt;So Spring needs Tomcat to run on.&lt;/p&gt;

&lt;p&gt;Think 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;Spring Boot Application
    ↓
Runs inside Tomcat
    ↓
Tomcat runs inside JVM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What happens when you run a Spring Boot app?&lt;/p&gt;

&lt;p&gt;When you click Run on:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Spring Boot:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Starts Tomcat internally&lt;/li&gt;
&lt;li&gt;Registers Spring as a servlet&lt;/li&gt;
&lt;li&gt;Tomcat listens on port 8080&lt;/li&gt;
&lt;li&gt;Requests come in&lt;/li&gt;
&lt;li&gt;Tomcat forwards them to Spring&lt;/li&gt;
&lt;li&gt;Spring runs your controllers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you create a Spring Boot Web project, this dependency is added automatically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;spring-boot-starter-web
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside it is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;spring-boot-starter-tomcat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Spring Boot comes with Tomcat built-in by default&lt;/p&gt;

&lt;p&gt;Spring Boot creates exactly &lt;strong&gt;ONE main servlet&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It is called:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DispatcherServlet

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;This is Spring’s front controller.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is DispatcherServlet?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It is a special servlet written by Spring.&lt;/p&gt;

&lt;p&gt;Tomcat talks only to servlets.&lt;br&gt;
So Spring creates one servlet and tells Tomcat:&lt;/p&gt;

&lt;p&gt;“Send all requests to this servlet.”&lt;/p&gt;

&lt;p&gt;So flow becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser
   ↓
Tomcat
   ↓
DispatcherServlet (Spring)
   ↓
Your @Controller / @RestController

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

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;One DispatcherServlet
        |
        |-- "/login" → login()
        |-- "/register" → register()
        |-- "/products" → products()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So:&lt;/p&gt;

&lt;p&gt;Spring has one servlet but thousands of routes&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happens internally when you hit a URL in Spring Boot?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You type this in browser&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;1️⃣ &lt;strong&gt;Browser sends HTTP request&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Browser sends:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /hello
Host: localhost:8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This goes to…&lt;/p&gt;

&lt;p&gt;2️⃣ &lt;strong&gt;Tomcat (Web Server)&lt;/strong&gt;&lt;br&gt;
Tomcat is running because Spring Boot started it.&lt;/p&gt;

&lt;p&gt;Tomcat:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is listening on port 8080&lt;/li&gt;
&lt;li&gt;Receives the HTTP request&lt;/li&gt;
&lt;li&gt;But Tomcat doesn’t know Spring controllers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It only knows:&lt;/p&gt;

&lt;p&gt;“I must send requests to a servlet”&lt;/p&gt;

&lt;p&gt;Spring registered one servlet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DispatcherServlet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So Tomcat forwards request to it.&lt;/p&gt;

&lt;p&gt;3️⃣&lt;strong&gt;DispatcherServlet (Heart of Spring MVC)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;DispatcherServlet receives:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /hello
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4️⃣ &lt;strong&gt;HandlerMapping&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Spring looks in HandlerMapping&lt;br&gt;
This is just an internal routing table.&lt;/p&gt;

&lt;p&gt;It finds:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/hello → HelloController.hello()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;5️⃣ &lt;strong&gt;Spring calls your method&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your controller runs:&lt;/p&gt;

&lt;p&gt;Now it asks:&lt;/p&gt;

&lt;p&gt;“Which controller method should handle /hello?”&lt;/p&gt;

&lt;p&gt;To answer that, Spring has built a map when app started:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/hello  →  hello()
/login  →  login()
/users  →  getUsers()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Annotation  Returns&lt;br&gt;
@Controller HTML page&lt;br&gt;
@RestController JSON / Text / Data&lt;/p&gt;

&lt;p&gt;@RestController = @Controller + @ResponseBody&lt;/p&gt;

</description>
      <category>spring</category>
      <category>springboot</category>
      <category>backend</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Beans using Autowiring</title>
      <dc:creator>Phoenix</dc:creator>
      <pubDate>Thu, 29 Jan 2026 15:49:32 +0000</pubDate>
      <link>https://forem.com/phoenix_238501d86d417e/beans-using-autowiring-50bg</link>
      <guid>https://forem.com/phoenix_238501d86d417e/beans-using-autowiring-50bg</guid>
      <description>&lt;p&gt;Creating beans alone is not enough.&lt;br&gt;
They must also be wired together.&lt;/p&gt;

&lt;p&gt;That wiring is what Autowiring (DI) does.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does “wiring” mean?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Connecting beans together by injecting one bean into another.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Car → needs → Engine
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Autowired
Engine engine;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Spring injects the dependency for you.&lt;/p&gt;

&lt;p&gt;That is &lt;strong&gt;autowiring.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is @Autowired?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;@Autowired tells Spring to automatically inject a required dependency into a Spring Bean.&lt;/p&gt;

&lt;p&gt;It is Spring’s way of doing Dependency Injection&lt;/p&gt;

&lt;p&gt;When &lt;code&gt;@Autowired&lt;/code&gt; is on a &lt;code&gt;setter&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Component
class Car {

    private Engine engine;

    @Autowired
    public void setEngine(Engine engine) {
        this.engine = engine;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You might wonder:&lt;/p&gt;

&lt;p&gt;“Who calls this setter? I never call it.”&lt;/p&gt;

&lt;p&gt;Spring does.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happens internally?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When Spring starts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spring creates the Car object using its constructor&lt;/li&gt;
&lt;li&gt;Spring looks for any @Autowired methods&lt;/li&gt;
&lt;li&gt;It finds setEngine(...)&lt;/li&gt;
&lt;li&gt;It looks for an Engine bean&lt;/li&gt;
&lt;li&gt;It finds it in the context&lt;/li&gt;
&lt;li&gt;It calls the setter&lt;/li&gt;
&lt;li&gt;car.setEngine(engineBean);&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The dependency is injected&lt;/p&gt;

&lt;p&gt;This happens automatically during bean creation.&lt;/p&gt;

&lt;p&gt;Beans define which objects Spring manages, and autowiring defines how those objects are connected to each other through dependency injection.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>java</category>
      <category>springboot</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Creating Spring Beans</title>
      <dc:creator>Phoenix</dc:creator>
      <pubDate>Thu, 29 Jan 2026 09:42:15 +0000</pubDate>
      <link>https://forem.com/phoenix_238501d86d417e/creating-spring-beans-lf</link>
      <guid>https://forem.com/phoenix_238501d86d417e/creating-spring-beans-lf</guid>
      <description>&lt;p&gt;When you use Spring without Spring Boot, you start by creating something called the &lt;strong&gt;ApplicationContext&lt;/strong&gt;.&lt;br&gt;
This object is the &lt;strong&gt;Spring IoC container&lt;/strong&gt; — it is the place where Spring keeps and manages all the objects it creates.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ApplicationContext context =
        new AnnotationConfigApplicationContext(AppConfig.class);

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

&lt;/div&gt;



&lt;p&gt;Here, you are telling Spring:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“Start your container and use AppConfig as the configuration.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is AppConfig?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AppConfig is a class you write and mark with @Configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Configuration
public class AppConfig {
}

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

&lt;/div&gt;



&lt;p&gt;This tells Spring:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This class contains methods that create objects Spring should manage (factory of Spring Beans)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Inside this class, you write methods marked with &lt;code&gt;@Bean&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Configuration
public class AppConfig {

    @Bean
    public Engine engine() {
        return new Engine();
    }

    @Bean
    public Car car() {
        return new Car(engine());
    }
}

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

&lt;/div&gt;



&lt;p&gt;Each &lt;strong&gt;&lt;a class="mentioned-user" href="https://dev.to/bean"&gt;@bean&lt;/a&gt;&lt;/strong&gt; method:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The object returned by this method should be stored in the Spring context as a Bean.&lt;/li&gt;
&lt;li&gt;And hands it over to Spring&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Spring then takes that object and stores it inside the &lt;strong&gt;ApplicationContext.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;These stored objects are called &lt;strong&gt;Spring Beans&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happens when the context is created?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When this line runs:&lt;/p&gt;

&lt;p&gt;new AnnotationConfigApplicationContext(AppConfig.class);&lt;/p&gt;

&lt;p&gt;Spring does the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reads AppConfig&lt;/li&gt;
&lt;li&gt;Finds all methods marked with &lt;a class="mentioned-user" href="https://dev.to/bean"&gt;@bean&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Calls those methods&lt;/li&gt;
&lt;li&gt;Creates the objects (Engine, Car)&lt;/li&gt;
&lt;li&gt;Stores them inside the context&lt;/li&gt;
&lt;li&gt;Keeps track of their dependencies and lifecycle&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now the IoC container fully controls these objects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do you use them?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of writing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Car car = new Car();

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

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Car car = context.getBean(Car.class);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Spring gives you the object it created and manages.&lt;/p&gt;

&lt;p&gt;That is Inversion of Control:&lt;br&gt;
Spring controls object creation, not you.&lt;/p&gt;

&lt;p&gt;Putting it all together&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;@Configuration&lt;/code&gt; tells Spring where the bean definitions are&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@Bean&lt;/code&gt; tells Spring which objects to create&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;AnnotationConfigApplicationContext&lt;/code&gt; starts the IoC container&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ApplicationContext&lt;/code&gt; stores and manages the beans&lt;/li&gt;
&lt;li&gt;You ask the context for objects instead of using new&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;@Component&lt;/strong&gt; is one of the most important Spring annotations — it’s how you tell Spring:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“Please create and manage an object of this class.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is @Component?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;@Component marks a class as a Spring Bean so that Spring will automatically create and manage its object in the IoC container.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Component
public class Engine {
}

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

&lt;/div&gt;



&lt;p&gt;This tells Spring:&lt;/p&gt;

&lt;p&gt;“When the context starts, create an Engine object and store it.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How Spring finds it&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When the ApplicationContext starts, Spring performs component scanning.&lt;/p&gt;

&lt;p&gt;It looks through your packages and finds classes annotated with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;@Component&lt;/li&gt;
&lt;li&gt;@Service&lt;/li&gt;
&lt;li&gt;@Repository&lt;/li&gt;
&lt;li&gt;@Controller
These are all forms of &lt;code&gt;@Component&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&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%2Fr4gd4crrtmc3cal5v3ur.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%2Fr4gd4crrtmc3cal5v3ur.png" alt=" " width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>spring</category>
      <category>springboot</category>
      <category>java</category>
    </item>
    <item>
      <title>Spring Beans, Context, Spring IoC container</title>
      <dc:creator>Phoenix</dc:creator>
      <pubDate>Thu, 29 Jan 2026 07:16:10 +0000</pubDate>
      <link>https://forem.com/phoenix_238501d86d417e/spring-beans-context-2ijm</link>
      <guid>https://forem.com/phoenix_238501d86d417e/spring-beans-context-2ijm</guid>
      <description>&lt;p&gt;&lt;strong&gt;Spring Beans&lt;/strong&gt;&lt;br&gt;
we hear a lot about beans when we are working with spring&lt;/p&gt;

&lt;p&gt;A Spring Bean is any Java object that is instantiated, configured, and managed by the Spring IoC container.&lt;/p&gt;

&lt;p&gt;a Bean is a POJO(Plain Old Java Object)&lt;br&gt;
But not every POJO is a Bean.&lt;/p&gt;

&lt;p&gt;A Bean = POJO + managed by Spring&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does “managed by Spring” mean?&lt;/strong&gt;&lt;br&gt;
Spring:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creates the object&lt;/li&gt;
&lt;li&gt;Stores it in the container&lt;/li&gt;
&lt;li&gt;Injects its dependencies&lt;/li&gt;
&lt;li&gt;Controls its lifecycle&lt;/li&gt;
&lt;li&gt;Destroys it when the app shuts down&lt;/li&gt;
&lt;li&gt;Only such objects are called Beans.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is  not mandatory that every class inside your application should be beans, like (utilities classes)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How spring knows which needs to be maintained?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;with the help of configurations that we supply either through XML files or Annotations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Context&lt;/strong&gt;&lt;br&gt;
context is like a memory location where we add all the object instances that we want the framework to manage. by default spring doesn't know any of the objects that we define in the application. to enable spring to see your object you need to add them to the context.&lt;/p&gt;

&lt;p&gt;We add classes to the Spring context by annotating them so that Spring can create and manage their objects as beans.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Spring IoC container *&lt;/em&gt;&lt;br&gt;
The Spring IoC Container is the core part of Spring that creates, manages, and injects application objects (beans) and controls their lifecycle.&lt;/p&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%2Fy5zhz0ml13rdzd7v764m.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%2Fy5zhz0ml13rdzd7v764m.png" alt=" " width="800" height="289"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here’s the &lt;strong&gt;big picture&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When a Spring (or Spring Boot) application starts, the first thing it creates is something called the ApplicationContext.&lt;br&gt;
This ApplicationContext is the Spring IoC container.&lt;/p&gt;

&lt;p&gt;You can think of it as Spring’s brain and memory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does this IoC container do?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It looks at your project and searches for classes marked with things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;@Component&lt;/li&gt;
&lt;li&gt;@Service&lt;/li&gt;
&lt;li&gt;@Repository&lt;/li&gt;
&lt;li&gt;@Controller&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These annotations tell Spring:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;“You are allowed to manage this class.”&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Spring then creates objects of those classes and stores them inside the ApplicationContext.&lt;/p&gt;

&lt;p&gt;These objects are called Spring Beans.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bean&lt;/strong&gt;→ the object Spring creates from that class&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Context&lt;/strong&gt; → where Spring stores and manages those objects&lt;/p&gt;

&lt;p&gt;In simple words:&lt;br&gt;
Spring creates a context (IoC container), puts your beans inside it, and then runs your application using those beans.&lt;/p&gt;

</description>
      <category>spring</category>
      <category>springboot</category>
      <category>java</category>
    </item>
  </channel>
</rss>
