<context:component-scan>
package william.annotation;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.stereotype.Controller;
/**
* @Auther: ZhangShenao
* @Date: 2018/9/21 10:15
* @Description:配置类
*/
@Configuration
//使用@ComponentScan,默认扫描MainConfig配置类所在包及其子包下的@Component、@Service、@Controller和@Repository组件
@ComponentScan
public class MainConfig {
}
public class AnnotationMain {
public static void main(String[] args) {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
//打印容器中所有定义的BeanName
Arrays.stream(applicationContext.getBeanDefinitionNames())
.forEach(System.err::println);
}
}
mainConfig
userDao
userController
userService
//指定只扫描哪些组件
Filter[] includeFilters() default {};
//指定不扫描哪些组件
Filter[] excludeFilters() default {};
有了@Filter注解和FilterType过滤类型,我们就可以指定自己的注解扫描过滤规则。
@Configuration
@ComponentScan(includeFilters = {
@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,classes = {UserService.class})
},useDefaultFilters = false)
public class MainConfig {
}
@Configuration
@ComponentScan(excludeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class})
})
public class MainConfig {
}
mainConfig
userDao
userService
public interface TypeFilter {
/**
* 指定类是否匹配组件扫描的过滤规则
* @param metadataReader 目标类的元数据reader
* @param metadataReaderFactory 可以获取其他类元数据reader的工厂
* @return 是否匹配过滤规则
* @throws IOException
*/
boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory)
throws IOException;
}
package william.annotation.filter;
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;
/**
* @Auther: ZhangShenao
* @Date: 2018/9/21 11:14
* @Description:自定义组件扫描过滤器
*/
public class UserDaoTypeFilter implements TypeFilter{
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory){
//获取目标类元信息
ClassMetadata classMetadata = metadataReader.getClassMetadata();
String className = classMetadata.getClassName();
//只扫描UserDao类
return "william.annotation.dao.UserDao".equalsIgnoreCase(className);
}
}
@Configuration
@ComponentScan(includeFilters = {
@ComponentScan.Filter(type = FilterType.CUSTOM,classes = {UserDaoTypeFilter.class})
},useDefaultFilters = false)
public class MainConfig {
}
mainConfig
userDao