Close

Spring - Specifying packages to be scanned with basePackages attribute of @ComponentScan

[Last Updated: Mar 27, 2021]

@ComponentScan#basePackages specifies packages to scan for annotated component.

The basePackages attribute is an array of String so we can define multiple packages. e.g.

@ComponentScan(basePackages = {"com.logicbig.example.client", "com.logicbig.example.service"})

Alternatively, we can specify a comma- or semicolon- or space-separated list of packages:

@ComponentScan(basePackages = "com.logicbig.example.client, com.logicbig.example.service")
@ComponentScan(basePackages = "com.logicbig.example.client;com.logicbig.example.service")
@ComponentScan(basePackages = "com.logicbig.example.client com.logicbig.example.service")
@ComponentScan(basePackages = {"com.logicbig.example.client com.logicbig.example.service"})

Example

Creating beans

package com.logicbig.example.service;

import org.springframework.stereotype.Service;

@Service
public class RetailOrderService {

  public void placeOrder(String item) {
      System.out.printf("Retail order placed. Item: %s%n", item);
  }
}
package com.logicbig.example.service;

import org.springframework.stereotype.Service;

@Service
public class WholeSaleOrderService {

  public void placeOrder(String item, int quantity) {
      if (quantity < 10) {
          throw new IllegalArgumentException(
                  "Quantity must be more than 10  for a wholesale order");
      }
      System.out.printf("Wholesale order placed. Item: %s Quantity: %s%n", item, quantity);
  }
}
package com.logicbig.example.client;

import com.logicbig.example.service.RetailOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class Buyer {
  @Autowired
  private RetailOrderService orderService;

  public void buySomething() {
      orderService.placeOrder("Laptop");
  }
}
package com.logicbig.example.client;

import com.logicbig.example.service.WholeSaleOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class Wholesaler {
  @Autowired
  private WholeSaleOrderService wholeSaleOrderService;

  public void buySomethingInBulk() {
      wholeSaleOrderService.placeOrder("Car", 100);
  }
}

Main class

package com.logicbig.example.app;


import com.logicbig.example.client.Buyer;
import com.logicbig.example.client.Wholesaler;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan(basePackages = "com.logicbig.example.client com.logicbig.example.service")
public class OnlineOrderApp {

  public static void main(String... strings) {
      AnnotationConfigApplicationContext context =
              new AnnotationConfigApplicationContext(OnlineOrderApp.class);
      System.out.println("-- Spring container started and is ready --");
      Buyer buyer = context.getBean(Buyer.class);
      buyer.buySomething();

      Wholesaler wholesaler = context.getBean(Wholesaler.class);
      wholesaler.buySomethingInBulk();
  }
}

Output

-- Spring container started and is ready --
Retail order placed. Item: Laptop
Wholesale order placed. Item: Car Quantity: 100

Example Project

Dependencies and Technologies Used:

  • spring-context 4.2.3.RELEASE: Spring Context.
  • JDK 1.8
  • Maven 3.6.3

@ComponentScan#basePackages Example Select All Download
  • spring-component-scanning-base-packages-attribute
    • src
      • main
        • java
          • com
            • logicbig
              • example
                • app
                  • OnlineOrderApp.java
                  • client
                  • service

    See Also