@ComponentScan#basePackageClasses is a type-safe alternative to basePackages() for specifying the packages to scan for annotated components. The whole package of each class specified will be scanned.
Spring recommends to create a special no-op marker class or interface in each package that serves no purpose other than being referenced by this attribute.
Example
Creating beans in package com.logicbig.example.service
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);
}
}
Creating beans in package com.logicbig.example.client
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 Consumer {
@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);
}
}
Creating marker interface in both packages
package com.logicbig.example.service;
public interface OnlineOrderService {
}
package com.logicbig.example.client;
public interface OnlineOrderClient {
}
Main class
package com.logicbig.example.app;
import com.logicbig.example.client.Consumer;
import com.logicbig.example.client.OnlineOrderClient;
import com.logicbig.example.client.Wholesaler;
import com.logicbig.example.service.OnlineOrderService;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackageClasses = {OnlineOrderClient.class, OnlineOrderService.class})
public class OnlineOrderApp {
public static void main(String... strings) {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(OnlineOrderApp.class);
System.out.println("-- Spring container started and is ready --");
Consumer consumer = context.getBean(Consumer.class);
consumer.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
In above example if we don't create and specify special marker interfaces in each packages and just specify bean classes for basePackageClasses, that will work too and will produce the same output:
@Configuration
@ComponentScan(basePackageClasses = {RetailOrderService.class, Consumer.class})
public class OnlineOrderApp {
...
}
Example ProjectDependencies and Technologies Used: - spring-context 6.1.2 (Spring Context)
Version Compatibility: 3.2.9.RELEASE - 6.1.2 Version compatibilities of spring-context with this example: Versions in green have been tested.
- JDK 17
- Maven 3.8.1
|