目录

​一、自动扫描 @ComponentScan 注解​

​1.1 标准方式​

​1.2 自定义过滤规则​

​二、例子​

​2.1 例1:普通的自动扫描组件例​

​2.1.1 项目目录​

​2.1.2 实现代码​

​2.1.3 运行结果​

​2.2 例2:添加过滤条件​

​2.3 例3:自定义过滤器​


本章将讲  @ComponentScan (自动扫描)  注解。

@ComponentScan相当于XML的<context:component-scan>

 

一、自动扫描 @ComponentScan 注解

@ComponentScan注解和XML的<context:component-scan>功能是相同的,只不过是使用注解方式而已。

@ComponentScan有几种方式

1.1 标准方式

@ComponentScan(value = "扫描指定的包")

ps:如果和XML配置一起使用可以使用

如:

@ComponentScan(value = "com.hualinux.beans")

还可以带过滤功能,还有其它几个参数可选 

excludeFilters = Filter[ ] : 指定扫描的时候按照什么规则排除那些组件
includeFilters = Filter[] : 指定扫描的时候只需要包含哪些组件|

如:

@ComponentScan(value = "com.hualinux",excludeFilters = {@ComponentScan.Filter(
type = FilterType.ANNOTATION,classes={Controller.class, Service.class})}, useDefaultFilters = false)

也可以使用复数

@ComponentScans(
value = {
@ComponentScan(value = "com.hualinux.beans",includeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {
BookService.class
})
},useDefaultFilters = false)
}
)

 

1.2 自定义过滤规则

可以使用  @ComponentScan.Filter(type = FilterType.CUSTOM 

如:

@ComponentScan(value = "com.hualinux",excludeFilters = {@ComponentScan.Filter(type = FilterType.CUSTOM,
classes={MyTyperFilter.class})}, useDefaultFilters = false)

注:上面class必须是TyperFilter的实现类,如上面自定义的 classes={MyTyperFilter.class}

查看TyperFilter类,看到参数的使用方式一

按着Ctrl键盘不放点上面 FilterType.CUSTOM的CUSTOM,鼠标会成变手形,点一下即会进入该类

hualinux spring 4.5:@ComponentScan自动扫描_hualinux

hualinux spring 4.5:@ComponentScan自动扫描_自动扫描_02

hualinux spring 4.5:@ComponentScan自动扫描_自动扫描_03

metadataReader:读取到的当前正在扫描的类的信息
metadataReaderFactory :可以获取到其他任何类信息的

 

二、例子

2.1 例1:普通的自动扫描组件例

我就简单的在前一章建立的spring-annotation项目的基础上建立了,建立简单的MVC三层,分别用到了@Repository、@Service、@Controller这3个注解,什么都不用写

2.1.1 项目目录

hualinux spring 4.5:@ComponentScan自动扫描_hualinux spring_04

2.1.2 实现代码

src-->com.hualinux.beans.dao.BooDao.java

package com.hualinux.beans.dao;

import org.springframework.stereotype.Repository;

@Repository
public class BooDao {
}

com.hualinux.beans.service.BookService.java

package com.hualinux.beans.service;

import org.springframework.stereotype.Service;

@Service
public class BookService {
}

com.hualinux.beans.controller.BookController.java

package com.hualinux.beans.controller;

import org.springframework.stereotype.Controller;

@Controller
public class BookController {
}

conf.MainConfAutoScan.java

package conf;


import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@ComponentScan(value = "com.hualinux.beans")
@Configuration
public class MainConfAutoScan {

}

PS:上面加了注解之外,没有写任何东西

com.hualinux.beans.AutoScanMain.java

package com.hualinux.beans;

import conf.MainConfAutoScan;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class AutoScanMain {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx=new AnnotationConfigApplicationContext(MainConfAutoScan.class);
String[] beanDefinitionNames = ctx.getBeanDefinitionNames();
for (String name: beanDefinitionNames){
System.out.println(name);
}

}
}

 

2.1.3 运行结果

运行上面AutoScanMain.java,发现找到了4个组件,连配置类都算进去了

mainConfAutoScan
bookController
booDao
bookService

hualinux spring 4.5:@ComponentScan自动扫描_spring 自动扫描_05

 

2.2 例2:添加过滤条件

例1中默认是搜索所以组件的,在这里我能不能过滤不扫描,控制和服务组件呢,可以的,在配置文件修改一下

conf.MainConfAutoScan.java

package conf;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;


@ComponentScan(value = "com.hualinux",excludeFilters = {@ComponentScan.Filter(
type = FilterType.ANNOTATION,classes={Controller.class, Service.class})})
/*@ComponentScan(value = "com.hualinux.beans")*/
@Configuration
public class MainConfAutoScan {

}

再次运行一下,发现 Controller组件 和 Service组件 都不能使用了

hualinux spring 4.5:@ComponentScan自动扫描_spring 自动扫描_06

 

2.3 例3:自定义过滤器

我在例1的基础上,定义一个过滤器,然后应用它

src-->com.hualinux.beans.MyTyperFilter.java

package com.hualinux.beans;

import org.springframework.core.io.Resource;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.ClassMetadata;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.core.type.filter.TypeFilter;

import java.io.IOException;

public class MyTyperFilter implements TypeFilter {
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
AnnotationMetadata annotationMetadata=metadataReader.getAnnotationMetadata();
ClassMetadata classMetadata=metadataReader.getClassMetadata();
String className = classMetadata.getClassName();
System.out.println("--->"+className);
Resource resource = metadataReader.getResource();

return false;
}
}

修改一下conf.MainConfAutoScan.java

@ComponentScan(value = "com.hualinux",excludeFilters = {@ComponentScan.Filter(type = FilterType.CUSTOM,
classes={MyTyperFilter.class})}, useDefaultFilters = false)
@Configuration
public class MainConfAutoScan {

}

use-default-filters="false"

不使用默认的filters,默认filters为全部的注解包括了@Repository、@Service、@Controller、@Component等

运行之前的com.hualinux.beans.AutoScanMain,结果如下:

hualinux spring 4.5:@ComponentScan自动扫描_hualinux_07