Fork me on GitHub

注解:@ComponentScan 注解

目录

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

DAO 的注解类

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

Service 的注解类

1
2
3
4
5
6
7
8
9
10
11
@Service
public class BusinessService {

@Autowired
private BusinessDAO dao;

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

Controller 的注解类

1
2
3
4
5
6
7
8
9
10
11
12
@Controller
public class BusinessController {

@Autowired
private BusinessService service;

public void request() {
System.out.println(" 调用了 Controller 的 request() 方法...");
service.service();
}

}

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

Java Config 配置类

1
2
3
4
@Configuration
@ComponentScan("me.sjl.*")
public class ScanConfig {
}

结果

@ComponentScan 注解

@ComponentScan 的排除规则

FilterType.ANNOTATION 按注解类型排除

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

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

测试结果

@ComponentScan 注解

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

1
2
3
4
5
6
@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 容器扫描

1
2
3
4
5
6
7
public class MyCustomerFilter implements TypeFilter {

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

相关文章

评论系统未开启,无法评论!