zoukankan      html  css  js  c++  java
  • 构建后端第2篇之---springb @ComponentScan注解使用

    张艳涛写于2021-2-8日

    构建后端项目的时候遇到一个问题,在zyt-auth项目的依赖定义了@Component类,这个类在项目启动的时候提示没有找到bean

    Field tokenService in com.zyt.zytauth.controller.TokenController required a bean of type 'com.zyt.common.security.service.TokenService' that could not be found.

    问题是:依赖模块没有生成 bean,

    在zyt-auth的main类中

    @SpringBootApplication
    public class ZytAuthApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ZytAuthApplication.class, args);
            System.out.println("(♥◠‿◠)ノ゙  授权认证中心启动成功   ლ(´ڡ`ლ)゙  
    " );
        }
    }

    这里有个@SpringBootApplication注解点开注解

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @SpringBootConfiguration
    @EnableAutoConfiguration
    @ComponentScan(excludeFilters = {
            @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
            @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
    public @interface SpringBootApplication {...}

    这里面就定义了@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 ClassPathScanningCandidateComponentProvider.DEFAULT_RESOURCE_PATTERN;
    
        boolean useDefaultFilters() default true;
    
        Filter[] includeFilters() default {};
    
        Filter[] excludeFilters() default {};
    
        boolean lazyInit() default false;
    
        @Retention(RetentionPolicy.RUNTIME)
        @Target({})
        @interface Filter {
    
            FilterType type() default FilterType.ANNOTATION;
    
            @AliasFor("classes")
            Class<?>[] value() default {};
    
            @AliasFor("value")
            Class<?>[] classes() default {};
    
            String[] pattern() default {};
        }
    
    }

    这里插一腿,看到了黑色标记了吗?

     Filter[] includeFilters() default {};

    这个是是设置默认值的default,看到这里就蒙了:{} 在js中,var a={} 表示新建一个对象,莫非 注解中还用json来解析?NO,这里原来是数组的语法

            String[] menuArray = {};//=new String[0];
            menuArray = new String[]{"new item","item 2"};

    这个是数组初始化的用法={} 等于=new String[0],真是简写害死人

    那么接着研究@ComponentScan 默认的扫描位置为

    Spring源码分析【4】-Spring扫描basePackages注解

    2.1 默认扫描

    创建一个配置类,在配置类上添加 @ComponentScan 注解。该注解默认会扫描该类所在的包下所有的配置类,相当于之前的 <context:component-scan>。

    springboot就是基于此默认扫描该类所在包下的所有的配置类。

    解决方法

    //@ComponentScan("com.zyt") 这个也可以,这个网上提供的方案
    @SpringBootApplication(scanBasePackages ={ "com.zyt" } )//这个是rouyi的方案
    public class ZytAuthApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ZytAuthApplication.class, args);
            System.out.println("(♥◠‿◠)ノ゙  授权认证中心启动成功   ლ(´ڡ`ლ)゙  
    " );
        }
    
    }

    其中第2给SBA(scanBasePackages ={ "com.zyt" })是设置@SpringBootApplication的属性,

  • 相关阅读:
    python3 driver chrome This version of ChromeDriver only supports Chrome version 89
    centos7 conda 安装 tensorflow
    python3 selenium Google浏览器 自动登录
    Fiddler Script
    深夜看了张一鸣的微博,让我越想越后怕(转载)
    OpenCV相关库
    .NET 面试题汇总(带答案)
    Java面试题
    定制化知识图谱 项目介绍
    关于《社会主义经济理论》若干问题的思考《九》
  • 原文地址:https://www.cnblogs.com/zytcomeon/p/14389269.html
Copyright © 2011-2022 走看看