@ComponentScan 注解

在平时的开发,我们会配置 @Controller 、 @Service 、 @Repository 、@Component 注解来声明该类为 Spring IoC容器的组件。 在 xml 中会配置扫描包,那么使用 JavaConfig 的方式,同样可以配置扫描包。

DAO 的注解类

@Repository
public class BusinessDAO {
    public void update() {
        System.out.println("调用了 dao 层的 update 方法....");
    }
}

Service 的注解类

@Service
public class BusinessService {

    @Autowired
    private BusinessDAO dao;
    
    public void service() {
        System.out.println("调用了 service 层的 service() 方法 .....");
        dao.update();
    }
}

Controller 的注解类

@Controller
public class BusinessController {
    
    @Autowired
    private BusinessService service;
    
    public void request() {
        System.out.println(" 调用了 Controller 的 request() 方法...");
        service.service();
    }
    
}

以上三个类是我们平时开发时经常使用的方式,在不同的类上打不同的注解,然后让 Spring 的包扫描自动去扫描这些类。

Java Config 配置类

@Configuration
@ComponentScan("me.sjl.*")
public class ScanConfig {
}

结果


@ComponentScan 注解_第1张图片
Bean 成功的加入到了 Spring IoC容器

@ComponentScan 的排除规则

FilterType.ANNOTATION 按注解类型排除

@Configuration
@ComponentScan(basePackages = "me.sjl.*", excludeFilters = {
        @Filter(type = FilterType.ANNOTATION, classes = Controller.class)
})
public class ScanConfig {
}

excludeFilters 属性表示排除规则, 可以写多个 @Filter 来排除, 上面的代码表示 排除 Controller 注解的类

测试结果


@ComponentScan 注解_第2张图片
IoC 容器中已经不包含 Controller 注解的类了

除了排除,还可以指定只包含的类注解
JavaConfig 配置

@Configuration
@ComponentScan(basePackages = "me.sjl.*", useDefaultFilters = false, includeFilters = {
        @Filter(type = FilterType.ANNOTATION, classes = Controller.class)
})
public class ScanConfig {
}

useDefaultFilters = false 表示禁用默认的过滤规则

FilterType.ASSIGNABLE_TYPE 类型

FilterType.ASPECTJ AspectJ表达式

FilterType.REGEX 正则表示达

FilterType.CUSTOM 自定义规则

自定义过滤规则是需要实现 TypeFilter 接口

自定义扫描规则, 类名中带有 Service 的类,被 Spring IoC 容器扫描

public class MyCustomerFilter implements TypeFilter {

    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
        String className = metadataReader.getClassMetadata().getClassName();
        return className.contains("Service");
    }
}

你可能感兴趣的:(@ComponentScan 注解)