Managing Bean Registration in a Spring Container

Missing Bean Detection

A class marked with @Component may still be unavailable during autowiring if the Spring context does not scan its package. Consider the following class:

@Component
public class Calculator {
    public int add() {
        return 42;
    }
}

Attempting to inject it in a test without proper container configuration will result in a NoSuchBeanDefinitionException:

@RunWith(SpringJUnit4ClassRunner.class)
public class CalculatorTest {

    @Autowired
    private Calculator calculator;

    @Test
    public void verifyAddition() {
        Assert.assertEquals(42, calculator.add());
    }
}

Spring must be told how to discover and register beans. There are three common approaches.

Programmatic Registration

Using @Configuration and Component Scanning

Create a configuration class that instructs Spring where to look for annotated components:

@Configuration
@ComponentScan(basePackages = "com.application.service")
public class AppConfig {

}

The @ComponentScan directive triggers classpath scanning within the specified package, picking up every stereotype-annotated class.

To use it in a test, reference the configuration class:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = AppConfig.class)
public class CalculatorTest {

    @Autowired
    private Calculator calculator;

    @Test
    public void verifyAddition() {
        Assert.assertEquals(42, calculator.add());
    }
}

Explicit Bean Definition with @Bean

Instead of scanning, declare beans individually inside a @Configuration class:

@Configuration
public class AppConfig {

    @Bean
    public Calculator calculatorInstance() {
        return new Calculator();
    }
}

Each @Bean method’s return value is registered as a Spring-managed singleton. This approach avoids classpath scanning entirely and offers precise control over bean instantiation.

XML-Based Wiring

Beans can also be declared in an XML descriptor. Create a configuration file such as context-config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            https://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="com.application.service" />

</beans>

Load this XML resource during test execution:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "/context-config.xml")
public class CalculatorTest {

    @Autowired
    private Calculator calculator;

    @Test
    public void verifyAddition() {
        Assert.assertEquals(42, calculator.add());
    }
}

When the <context:component-scan /> element is present, Spring processes the targeted package identically to the annotation-based scanner. Alternatively, individual <bean> elements can be used for explciit definitions without scanning.

Tags: Spring Bean Dependency Injection configuration XML

Posted on Mon, 05 Oct 2026 16:21:54 +0000 by fighnight