<?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>DEV Community: Amoghmanoranjith Navade</title>
    <description>The latest articles on DEV Community by Amoghmanoranjith Navade (@amoghmanoranjith).</description>
    <link>https://dev.to/amoghmanoranjith</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%2F2598589%2F86b255d1-ee39-49c3-a026-cc273ed0dbaf.jpg</url>
      <title>DEV Community: Amoghmanoranjith Navade</title>
      <link>https://dev.to/amoghmanoranjith</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/amoghmanoranjith"/>
    <language>en</language>
    <item>
      <title>Without Spring boot</title>
      <dc:creator>Amoghmanoranjith Navade</dc:creator>
      <pubDate>Sat, 30 May 2026 12:34:29 +0000</pubDate>
      <link>https://dev.to/amoghmanoranjith/without-spring-boot-an9</link>
      <guid>https://dev.to/amoghmanoranjith/without-spring-boot-an9</guid>
      <description>&lt;p&gt;For the past four months, I have been exploring the Spring ecosystem, learning about architectures, design patterns, and how large Java backend systems are structured.&lt;br&gt;
Among the many technologies in the ecosystem, one just sat in the backdrop silently making my life easier.&lt;/p&gt;

&lt;p&gt;I already knew what Spring Boot did at a high level. It handles auto-configuration, embedded servers, starter dependencies, and opinionated defaults. But, I never truly appreciated &lt;em&gt;why&lt;/em&gt; those features mattered.&lt;/p&gt;

&lt;p&gt;So I decided to build a Spring MVC application without using Spring Boot.&lt;/p&gt;

&lt;p&gt;The goal was simple: create a simple API.&lt;br&gt;
What I ended up learning was far more valuable than the API itself.&lt;/p&gt;

&lt;p&gt;The first thing I discovered was that Spring applications can actually have two separate configurations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Root Application Context&lt;/li&gt;
&lt;li&gt;Web Application Context&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Root Application Context contains beans shared across the entire application, such as services, repositories, data sources, and infrastructure-related beans.&lt;/p&gt;

&lt;p&gt;The Web Application Context is specific to a &lt;code&gt;DispatcherServlet&lt;/code&gt;.&lt;br&gt;
This means a Spring MVC application can technically have multiple dispatcher servlets, each responsible for handling a different group of routes.&lt;/p&gt;

&lt;p&gt;Each dispatcher servlet can have its own:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Controllers&lt;/li&gt;
&lt;li&gt;View resolvers&lt;/li&gt;
&lt;li&gt;Exception resolvers&lt;/li&gt;
&lt;li&gt;Handler mappings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;while still sharing common resources from the root context.&lt;/p&gt;

&lt;p&gt;Understanding this made me realise something important:&lt;/p&gt;

&lt;p&gt;Spring Boot heavily opinionates this architecture.&lt;/p&gt;

&lt;p&gt;By default, it configures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a single &lt;code&gt;DispatcherServlet&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;a unified application context&lt;/li&gt;
&lt;li&gt;sensible defaults for MVC infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The next part was deployment.&lt;/p&gt;

&lt;p&gt;Without Spring Boot, there are primarily two ways to run a Spring MVC application:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Package the application as a &lt;code&gt;.war&lt;/code&gt; file and deploy it to an external Tomcat server&lt;/li&gt;
&lt;li&gt;Use an embedded Tomcat server directly inside the application&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The first approach made me appreciate how difficult development used to be.&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%2F32pjyw4z1bv4brss69xm.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%2F32pjyw4z1bv4brss69xm.png" alt="Traditional Tomcat deployment architecture" width="800" height="389"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every small change involved:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;packaging the project&lt;/li&gt;
&lt;li&gt;copying the WAR file&lt;/li&gt;
&lt;li&gt;deploying it to Tomcat&lt;/li&gt;
&lt;li&gt;restarting the server&lt;/li&gt;
&lt;li&gt;checking whether the application even started correctly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A runtime error could easily cost several minutes.&lt;/p&gt;

&lt;p&gt;With an embedded server, the application itself controls Tomcat.&lt;br&gt;
Tomcat still hosts the &lt;code&gt;DispatcherServlet&lt;/code&gt; inside its servlet container, but now the server lifecycle becomes part of the application lifecycle itself.&lt;br&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%2F0q342nb80qumu65h7zzq.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%2F0q342nb80qumu65h7zzq.png" alt="Embedded Tomcat architecture in Spring Boot" width="799" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This architectural shift dramatically improves developer experience.&lt;/p&gt;

&lt;p&gt;And then came the thing I probably underappreciated the most before this exercise:&lt;/p&gt;

&lt;p&gt;Spring Boot starter dependencies.&lt;/p&gt;

&lt;p&gt;At first glance, starters seem like simple dependency bundles.&lt;/p&gt;

&lt;p&gt;But after manually configuring Spring MVC, servlet APIs, embedded Tomcat dependencies, and compatible versions, I finally understood their real value.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;dependency compatibility&lt;/li&gt;
&lt;li&gt;version alignment&lt;/li&gt;
&lt;li&gt;transitive dependency management&lt;/li&gt;
&lt;li&gt;boilerplate configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without them, developers would spend a significant amount of time manually resolving library conflicts and configuration issues.&lt;/p&gt;

&lt;p&gt;After building this small project without Spring Boot, I started appreciating Spring Boot far more than before.&lt;/p&gt;

&lt;p&gt;Not because it makes things easy, but because I now understand the complexity it abstracts away.&lt;/p&gt;

&lt;p&gt;I think this is true for many frameworks and tools in software engineering:&lt;br&gt;
you only fully appreciate an abstraction after experiencing life without it.&lt;/p&gt;

&lt;p&gt;references:&lt;br&gt;
&lt;a href="https://tomcat.apache.org/tomcat-5.5-doc/architecture/overview.html" rel="noopener noreferrer"&gt;https://tomcat.apache.org/tomcat-5.5-doc/architecture/overview.html&lt;/a&gt;&lt;br&gt;
&lt;a href="https://medium.com/@dulanjayasandaruwan1998/understanding-spring-boot-architecture-flow-615d209b95f9" rel="noopener noreferrer"&gt;https://medium.com/@dulanjayasandaruwan1998/understanding-spring-boot-architecture-flow-615d209b95f9&lt;/a&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>backend</category>
    </item>
  </channel>
</rss>
