ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

一、【注解】Spring注解@ComponentScan

2020-09-23 08:34:02  阅读:178  来源: 互联网

标签:Spring springframework class context org 注解 ComponentScan public


@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

标签:Spring,springframework,class,context,org,注解,ComponentScan,public
来源: https://www.cnblogs.com/zhangjianbing/p/13716124.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有