注解-组件注册02-@ComponentScan

摘要:
component scanbase package=“spring_annotation.com.anno”&gt:importorg.springframework.context.annotation.*;

  当需要扫描一个包下的所有注解时,可以在XML文件中进行配置:

<!--包扫描,只要标注了@Controller、@Service、@Reposotory、@Component就可以被加载到spring bean容器-->
<context:component-scan base-package="spring_annotation.com.anno"></context:component-scan>

  也可以使用@ComponentScan来完成,@ComponentScans完成多重注解。

  实例:

package spring_annotation.com.anno.config;
import org.springframework.context.annotation.*;
import spring_annotation.com.anno.bean.Person;
/**
 * @author Millet
 * @date 2020/6/8 20:21
 */
//配置类 == 配置文件
@Configuration //告诉Spring这是一个配置类
//@ComponentScan(value = "spring_annotation.com.anno")//类似于xml配置文件中的context包扫描
//@ComponentScan(value = "spring_annotation.com.anno", includeFilters = {
//   @ComponentScan.Filter(type= FilterType.ANNOTATION,classes = {Controller.class, Service.class})
//},useDefaultFilters = false)//取消使用默认过滤
  //@ComponentScan value:指定要扫描的包
  //excludeFilters = Filter[],指定扫描的时候按照什么规则排除那些组件
  //cludeFilters = Filter[],指定扫描的时候按照什么规则只需要那些组件
//@ComponentScan是可多重注解的,一般使用ComponentScans
@ComponentScans(
        @ComponentScan(value = "spring_annotation.com.anno", includeFilters = {
//        @ComponentScan.Filter(type= FilterType.ANNOTATION,classes = {Controller.class}),
//        @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,classes = {BookService.class}),//按照给定类型
        @ComponentScan.Filter(type = FilterType.CUSTOM,classes = {MyTypeFilter.class})
},useDefaultFilters = false))//使用自定义过滤器
public class MainConfig {
    @Bean("person") //给容器注册一个bean;类型为返回值类型,id默认是方法名或者自定义
    public Person getPerson(){
        return new Person("lisi",20);
    }
}

     @ComponentScan源码

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
    @AliasFor("basePackages")
    String[] value() default {};

    @AliasFor("value")
    String[] basePackages() default {};

    Class<?>[] basePackageClasses() default {};

    Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;

    Class<? extends ScopeMetadataResolver> scopeResolver() default AnnotationScopeMetadataResolver.class;

    ScopedProxyMode scopedProxy() default ScopedProxyMode.DEFAULT;

    String resourcePattern() default "**/*.class";
  //默认使用默认的过滤器,当使用自己要置为false
boolean useDefaultFilters() default true;
  //指定扫描的时候按照什么规则只需要那些组件 ComponentScan.Filter[] includeFilters()
default {};
  //指定扫描的时候按照什么规则排除那些组件 ComponentScan.Filter[] excludeFilters()
default {}; boolean lazyInit() default false; @Retention(RetentionPolicy.RUNTIME) @Target({}) public @interface Filter {
    //FilterType有五种
    //ANNOTATION
    //ASSIGNABLE_TYPE
    //ASPECTJ
    //REGEX
    //CUSTOM
FilterType type()
default FilterType.ANNOTATION; @AliasFor("classes") Class<?>[] value() default {}; @AliasFor("value") Class<?>[] classes() default {}; String[] pattern() default {}; } }

   自定义扫描过滤器

public class MyTypeFilter implements TypeFilter {
    /**
     *
     * @param metadataReader 读取到的当前正在扫描的类
     * @param metadataReaderFactory 可以获取到任何其他类的信息
     * @return
     * @throws IOException
     */
    @Override
    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
        //获取当前类注解的信息
        AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
        //获取当前类的类信息
        ClassMetadata classMetadata = metadataReader.getClassMetadata();
        String className = classMetadata.getClassName();
        //获取当前类的类资源
        Resource resource = metadataReader.getResource();
        System.out.println("--->"+className);
        if(className.contains("er")){
            return true;
        }
        return false;
    }
}

免责声明:文章转载自《注解-组件注册02-@ComponentScan》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇通达OA 11.5 SQL注入漏洞复现Inno setup 简单打包教程下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MyBatis:条件构造器QueryWrapper方法详解

QueryWrapper 说明:      继承自 AbstractWrapper ,自身的内部属性 entity 也用于生成 where 条件及 LambdaQueryWrapper, 可以通过 new QueryWrapper().lambda() 方法获取. 测试用表: 1. eq、ne 说明: eq:等于,ne:不等于 测试: @Test pub...

svg的stroke属性,神奇的描边

1、stroke 定义一条线,文本或元素轮廓颜色 2、stroke-width 定义一条线,文本或元素轮廓厚度 3、stroke-linecap 描边端点表现形式 <svg> <g fill='none' stroke='black' stroke-width='10'> <path stroke-linecap...

GORM高级查询

models nav.go package models type Nav struct { Id int `json:"id"` Title string `json:"title"` Url string `json:"url"` Status int `json:"status"` Sort int...

使用Nginx反向代理进行负载均衡

在这里简单记录一下,我使用Nginx反向代理进行负载均衡,将请求发送到两台tomcat上。 首先解压两个tomcat,解压Nginx,一台tomcat配置可以不用动,但是我为了更方便只是将它的端口改为91: <Connector port="91" protocol="HTTP/1.1" connectionTimeout="20000" redi...

Qt之getOpenFileName,getSaveFileName,getOpenFileNames

1.头文件   #include<QFileDialog> 2.用处   这几个函数都是QFileDialog这个类中的静态函数,可以调用当前系统的文件对话框。具体来讲:   getOpenFileName返回一个被用户选中的文件的路径,前提是这个文件是存在的。   getSaveFileName返回一个被用户选中的文件的路径,这个文件可以是不...

async和await的小结

async 配合 await 使用 1、未使用 async 和 await  <el-button @click="getData">Promise</el-button> import getWeater from '@/app/login.js' methods: { getData() { // 未使用async...