Following example shows how to use @ComponentScan#excludeFilters attribute along with @ComponentScan.Filter=FilterType.ANNOTATION to exclude component classes from scanning based on user defined annotation. The annotation class is specified by @Filter#classes attribute.
Example
The annotation
package com.logicbig.example.app;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface ExcludeFromScan {
String value () default "";
}
Using the annotation on component classes
package com.logicbig.example.service;
import com.logicbig.example.app.ExcludeFromScan;
import org.springframework.stereotype.Service;
@Service
@ExcludeFromScan
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.app.ExcludeFromScan;
import com.logicbig.example.service.WholeSaleOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
@ExcludeFromScan
public class Wholesaler {
@Autowired
private WholeSaleOrderService wholeSaleOrderService;
public void buySomethingInBulk() {
wholeSaleOrderService.placeOrder("Car", 100);
}
}
Other component classes
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.client;
import com.logicbig.example.service.RetailOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class RetailBuyer {
@Autowired
private RetailOrderService orderService;
public void buySomething() {
orderService.placeOrder("Laptop");
}
}
Main configuration class
package com.logicbig.example.app;
import com.logicbig.example.client.RetailBuyer;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
@Configuration
@ComponentScan(basePackages = "com.logicbig.example.client;com.logicbig.example.service",
excludeFilters = @ComponentScan.Filter(
type = FilterType.ANNOTATION,
classes = ExcludeFromScan.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 --");
RetailBuyer retailBuyer = context.getBean(RetailBuyer.class);
retailBuyer.buySomething();
boolean wholeSaleOrderServiceRegistered =
context.containsBean("wholeSaleOrderService");
System.out.println("WholeSaleOrderService registered: " + wholeSaleOrderServiceRegistered);
boolean wholesaler =
context.containsBean("wholesaler");
System.out.println("Wholesaler registered: " + wholesaler);
}
}
Output-- Spring container started and is ready -- Retail order placed. Item: Laptop WholeSaleOrderService registered: false Wholesaler registered: false
Example ProjectDependencies and Technologies Used: - spring-context 6.1.2 (Spring Context)
Version Compatibility: 4.2.0.RELEASE - 6.1.2 Version compatibilities of spring-context with this example: Versions in green have been tested.
- JDK 17
- Maven 3.8.1
|