DEV Community

Md Jamilur Rahman
Md Jamilur Rahman

Posted on

How Spring Took Back Control from Enterprise Java: A Documentary

In the early 2000s, Java development was painful. Enterprise Java Beans (EJB) required complex XML configurations, excessive boilerplate code, and heavyweight containers. A simple "Hello World" application required multiple files, deployment descriptors, and a steep learning curve.

Then came Spring. It changed everything.

The Problem: J2EE Complexity

Before Spring, Java EE (then J2EE) made simple tasks difficult:

To call a database method with EJB 2.0:

  • Remote interface
  • Home interface
  • Bean implementation
  • Deployment descriptor (XML)
  • JNDI lookup code
  • Exception handling for system exceptions

All to do what should be a simple database call.

The complexity was intentional: It was designed for large-scale enterprise applications. But most developers were not building large-scale enterprise applications. They just wanted to get work done.

The Solution: Rod Johnson and Spring

Rod Johnson, a consultant frustrated with J2EE complexity, wrote "Expert One-on-One J2EE Design and Development" in 2002. The book challenged conventional wisdom. It showed that you could build enterprise applications without EJBs.

The key insight: Plain Old Java Objects (POJOs) were sufficient. You did not need heavyweight containers. You just needed dependency injection and aspect-oriented programming.

Spring Framework was born from this insight.

What Spring Did Differently

1. Dependency Injection

Before Spring, components looked up their dependencies:

// JNDI lookup - complex and fragile
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/MyDB");
Enter fullscreen mode Exit fullscreen mode

With Spring, dependencies were injected:

@Component
public class OrderService {
    private final DataSource dataSource;

    // Spring injects the dependency
    public OrderService(DataSource dataSource) {
        this.dataSource = dataSource;
    }
}
Enter fullscreen mode Exit fullscreen mode

No more JNDI lookups. No more fragile strings. Just constructor injection.

2. Aspect-Oriented Programming

Cross-cutting concerns like logging, transactions, and security were scattered across the codebase. Spring AOP centralized them:

@Aspect
@Component
public class LoggingAspect {
    @Around("execution(* com.example.service.*.*(..))")
    public Object logMethod(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();
        Object result = joinPoint.proceed();
        long duration = System.currentTimeMillis() - start;
        log.info("{} took {} ms", joinPoint.getSignature(), duration);
        return result;
    }
}
Enter fullscreen mode Exit fullscreen mode

No more repetitive logging in every method. One aspect handles it all.

3. Simplified Configuration

XML was the original standard. Then came annotations. Then Java config:

@Configuration
@EnableTransactionManagement
@ComponentScan("com.example")
public class AppConfig {
    @Bean
    public DataSource dataSource() {
        return new HikariDataSource(/* config */);
    }
}
Enter fullscreen mode Exit fullscreen mode

Type-safe. Refactor-friendly. No XML.

4. Integration Testing

Spring made testing easy. Mocking dependencies became straightforward:

@SpringBootTest
class OrderServiceTest {
    @MockBean
    private OrderRepository orderRepository;

    @Autowired
    private OrderService orderService;

    @Test
    void createOrder_savesToDatabase() {
        Order order = new Order("Test Order");
        when(orderRepository.save(any())).thenReturn(order);

        Order result = orderService.createOrder(order);

        assertThat(result.getId()).isNotNull();
        verify(orderRepository).save(order);
    }
}
Enter fullscreen mode Exit fullscreen mode

No complex setup. Just focus on the test.

The Revolution: Spring Boot

Spring Boot took simplicity to the next level. It eliminated configuration:

// No XML. No manual configuration. Just code.
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
Enter fullscreen mode Exit fullscreen mode

Zero configuration. Embedded server. Conventions over configuration.

The Impact

Spring changed Java development:

  1. Productivity skyrocketed: What took hours with J2EE took minutes with Spring.

  2. Adoption exploded: Spring became the de facto standard for Java web development.

  3. Innovation accelerated: Developers focused on business logic, not plumbing.

  4. Community grew: A vibrant ecosystem of Spring projects emerged (Spring Data, Spring Security, Spring Cloud, Spring Batch).

The Documentary

The documentary "Spring: The Documentary" (CultRepo) tells this story through interviews with key figures:

  • Rod Johnson on the original motivation
  • Juergen Hoeller on the early development
  • Spring community members on adoption challenges

It captures the frustration with J2EE, the bold vision of Spring, and the cultural shift it created.

Lessons from Spring

1. Simplicity Wins

Java EE was "correct" but unusable. Spring was "simple" and it won. Developers vote with their productivity.

2. Convention Over Configuration

Defaults matter. Most applications need the same things. Configure what is different, not what is common.

3. Testability is a Feature

If it is hard to test, you will not test. Spring made testing a first-class concern.

4. Community Drives Adoption

Open source is about more than code. It is about documentation, support, and community. Spring built a welcoming community.

5. Evolve or Die

Spring has evolved continuously. From XML to annotations to Java config to Spring Boot. It never stopped improving.

The Legacy

Today, Spring is everywhere:

  • Netflix uses Spring Cloud for microservices
  • Airbnb uses Spring Boot for APIs
  • Walmart uses Spring Data for persistence
  • Millions of developers use Spring daily

The framework that "took back control" from enterprise Java is now the enterprise standard.

What Comes Next?

Spring continues to evolve:

  • Spring Boot 3+ uses Jakarta EE (not Java EE)
  • AOT compilation with GraalVM for faster startup
  • Native images for cloud-native deployment
  • Virtual threads for better concurrency

The philosophy remains the same: make Java development simple, productive, and enjoyable.

Conclusion

Spring succeeded because it respected developers. It acknowledged that complexity is not a feature. It proved that enterprise applications can be built with simple, testable, maintainable code.

The documentary tells a story of rebellion. A group of developers said "no more" to complexity and built something better. They changed the trajectory of Java development forever.


Source

  • YouTube: "How a Group of Developers Took Back Control from Enterprise Java | Spring: The Documentary" by CultRepo
  • Link: https://youtu.be/0Gb1z-2SjHY

Top comments (0)