zoukankan      html  css  js  c++  java
  • 一、【注解】Spring注解@ComponentScan

    @ComponentScan作用是将标注了@Controller、@Service、@Repository等注解的类放入IOC容器中,统一管理。

    一、基本用法

    Component组件:

    @Controller
    public class UserController {
    
    }
    @Service
    public class UserService {
    
    }
    @Repository
    public class UserDao {
    
    }
    

    配置类:

    @Configuration
    @ComponentScan(value = "com.zhangjianbing.spring.component")
    public class UserConfig {
    
    }
    

    测试:

    public class MainTest {
        @Test
        public void m1() {
            ApplicationContext applicationContext = new AnnotationConfigApplicationContext(UserConfig.class);
            String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();// Bean的定义信息
            for (String beanName : beanDefinitionNames) {
                System.out.println("======" + beanName);
            }
        }
    }
    测试结果:
    ======org.springframework.context.annotation.internalConfigurationAnnotationProcessor
    ======org.springframework.context.annotation.internalAutowiredAnnotationProcessor
    ======org.springframework.context.annotation.internalRequiredAnnotationProcessor
    ======org.springframework.context.annotation.internalCommonAnnotationProcessor
    ======org.springframework.context.event.internalEventListenerProcessor
    ======org.springframework.context.event.internalEventListenerFactory
    ======userConfig
    ======userController
    ======userDao
    ======userService
    

    二、Filter过滤

    排除

    @Configuration
    // 排除UserController类,其它的都要
    @ComponentScan(
        value = "com.zhangjianbing.spring.component", 
        excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {UserController.class})})
    public class UserConfig {
    
    }
    

    只包含

    // 只包含(需要禁用掉默认的过滤规则)
    @ComponentScan(
        value = "com.zhangjianbing.spring.component", 
        useDefaultFilters = false, 
        includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {UserController.class})})
    public class UserConfig {
    
    }
    

    自定义Filter

    自定义Filter实现TypeFilter接口

    /**
     * 自定义实现扫描类型过滤器{@link FilterType}
     *
     * @author zhangjianbing
     * time 2020/09/23
     * https://www.zhangjianbing.com
     */
    public class MyFilterType implements TypeFilter {
    
        /**
         * @param metadataReader        读取当前正在扫描的类的信息
         * @param metadataReaderFactory 获取其它任何类的信息
         */
        @Override
        public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
            // 当前类的注解信息
            AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
            // 当前类信息(类名、父类等等)
            ClassMetadata classMetadata = metadataReader.getClassMetadata();
            // 当前类资源信息(路径等)
            Resource resource = metadataReader.getResource();
            String className = classMetadata.getClassName();
            if (className.contains("con")) {// 将类名包含er的注册到容器中
                return true;
            }
            return false;
        }
    }
    

    配置文件:

    @Configuration
    @ComponentScan(
            value = "com.zhangjianbing.spring.component",
            useDefaultFilters = false,
            includeFilters = {@ComponentScan.Filter(type = FilterType.CUSTOM, classes = {MyFilterType.class})}
            )
    public class UserConfig {
    
    }
    

    测试结果:

    public class MainTest {
        @Test
        public void m1() {
            ApplicationContext applicationContext = new AnnotationConfigApplicationContext(UserConfig.class);
            String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();// Bean的定义信息
            for (String beanName : beanDefinitionNames) {
                System.out.println("======" + beanName);
            }
        }
    }
    测试结果:
    ======org.springframework.context.annotation.internalConfigurationAnnotationProcessor
    ======org.springframework.context.annotation.internalAutowiredAnnotationProcessor
    ======org.springframework.context.annotation.internalRequiredAnnotationProcessor
    ======org.springframework.context.annotation.internalCommonAnnotationProcessor
    ======org.springframework.context.event.internalEventListenerProcessor
    ======org.springframework.context.event.internalEventListenerFactory
    ======userConfig
    ======userController
    
  • 相关阅读:
    软件技术文档撰写要求
    UML需求分析步骤实例解析
    sql 操作重复数据集合
    cookie无法读取的问题
    软件开发中,这些文档你用到了吗?
    软件测试报告[样本]
    一个软件设计的全过程(基于UML)
    命令 状态 职责链 三种模式之间的异同
    PHP的MVC实现(3)
    怎么样整理有用的资料?
  • 原文地址:https://www.cnblogs.com/zhangjianbing/p/13716124.html
Copyright © 2011-2022 走看看