Spring源码从入门到精通---@ComponentScan(二)

简介: Spring源码从入门到精通---@ComponentScan(二)

上篇文章主要介绍了spring通过配置文件和注解获取实例对象:


Spring源码从入门到精通---@Configuration&@Bean(一)


这篇文章主要介绍ComponentScan注解,老规矩,先看项目结构:


image.png


1、配置文件配置扫描路径


传统的在xml配置文件配置路径,配置之后,在此路径下的@Controller,@Service,@Repository,@Component类都能扫描到

<?xml version="1.0" encoding="UTF-8"?>
<beans default-lazy-init="true" xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
       xmlns:context="http://www.springframework.org/schema/context">
    <bean class="com.alibaba.bean.Person" id="person" scope="singleton">
        <property name="age" value="18"></property>
        <property name="name" value="张三"></property>
    </bean>
    <!--包扫描,只要标注:@Controller,@Service,@Repository,@Component都能扫到-->
    <!--1、可以在配置文件配置扫描路径
        2、可以用注解@ComponentScan
    -->
   <!-- <context:component-scan base-package="com.alibaba"></context:component-scan>-->
</beans>


2、注解@ComponentScan配置扫描路径,给配置类加注解



(1)value配置扫描的路径。


(2)可以用excludeFilters来排除不需要扫描的类。


(3)用includeFilters配置必须扫描的类,用此方法需要注意,useDefaultFilters默认是true,表示扫描配置路径下的所有包,所以需要 指定为false,此方法才可生效。


jdk1.8中 新增 Repeatable,ComponentScan是一个重复注解,可以用ComponentScans注解

* FilterType.ANNOTATION :注解名规则,比如Controller

* FilterType.ASSIGNABLE_TYPE : 按照给定的类型,比如当前类型的父子类。

* FilterType.ASPECTJ :使用aspectj表达式

* FilterType.REGEX :使用正则指定

* FilterType.CUSTOM :自定义Filter类代码如下。


先定义MyTypeFilter类实现TypeFilter,重写match方法,用metadataReader获取到定义路径中扫描的pojo,当返回true时候,才会放入容器,拿到这个pojo,若返回false,则拿不到这个pojo。我的代码里写的是过滤controller这个类,只有controller才会放入IOC容器。

/**
 * 扫描包自定义规则
 * metadataReader:读取到当前正在扫描类的信息
 * metadataReaderFactory:可以获取到其他任何类的信息
 *
 * @author keying
 */
public class MyTypeFilter implements TypeFilter {
    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory)
        throws IOException {
        //获取当前类注解信息
        AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
        //获取当前正在扫描类的信息
        ClassMetadata classMetadata = metadataReader.getClassMetadata();
        //获取当前类资源信息 (比如类存在哪个盘,类的路径  )
        Resource resource = metadataReader.getResource();
        String name = classMetadata.getClassName();
        System.out.println("Filter扫描的类名:" + name);
        if(name.contains("controller")){
            return true;
        }
        return false;
    }
}


重点,在ComponentScan注解里,定义@Filter,前面两个type为ANNOTATION,ASSIGNBALE_TYPE先注释掉,用FilterType.CUSTOM指定刚刚写的myTypeFilter类。

/**
 * 配置文件
 * @Configuration 告诉spring这是一个配置类
 *
 * @ComponentScan 扫描路径配置
 * excludeFilters:指定排除扫描的包 ,按照特定的规则排除
 * includeFilters:指定要扫描的包 , useDefaultFilters:默认是true,默认扫描所有包,设置成false
 * jdk1.8中 新增 Repeatable,ComponentScan是一个重复注解,可以用ComponentScans注解
 * FilterType.ANNOTATION :注解名规则
 * FilterType.ASSIGNABLE_TYPE : 按照给定的类型
 * FilterType.ASPECTJ :使用aspectj表达式
 * FilterType.REGEX :使用正则指定
 * FilterType.CUSTOM :自定义
 *
 * @author keying
 * @date 2021/6/24
 */
@Configuration
@ComponentScans(value = {
    @ComponentScan(value = "com.alibaba", includeFilters = {
        /*@Filter(type = FilterType.ANNOTATION,classes  = {Controller.class}),
        @Filter(type = FilterType.ASSIGNABLE_TYPE,classes = {BookService.class})*/
        @Filter(type = FilterType.CUSTOM,classes = {MyTypeFilter.class})
    },useDefaultFilters = false)
})
public class BeanConfig {
    /**
     * @Bean吧对象注入给spring容器
     * 1、id默认是方法名,value方法可以指定方法名
     * @return Person
     */
    @Bean(value = "person")
    public Person getPerson(){
        return new Person("李四",19);
    }
}

最后在junit测试类,因为刚刚在Filter配置的只把controller放在IOC容器里,只能获取到Controller类。

 /**
     * @ComponentScan
     */
    @org.junit.Test
    public void test() {
        AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(
            BeanConfig.class);
        String[] beanNames = annotationConfigApplicationContext.getBeanDefinitionNames();
        for (String beanName : beanNames) {
            System.out.println(beanName);
        }
    }

打印结果如下,只返回了controller,service和dao都没有返回:

image.png

相关文章
|
16天前
|
人工智能 Java API
Spring AI 实战|Spring AI入门之DeepSeek调用
本文介绍了Spring AI框架如何帮助Java开发者轻松集成和使用大模型API。文章从Spring AI的初探开始,探讨了其核心能力及应用场景,包括手动与自动发起请求、流式响应实现打字机效果,以及兼容不同AI服务(如DeepSeek、通义千问)的方法。同时,还详细讲解了如何在生产环境中添加监控以优化性能和成本管理。通过Spring AI,开发者可以简化大模型调用流程,降低复杂度,为企业智能应用开发提供强大支持。最后,文章展望了Spring AI在未来AI时代的重要作用,鼓励开发者积极拥抱这一技术变革。
492 71
Spring AI 实战|Spring AI入门之DeepSeek调用
|
2月前
|
安全 Java 数据库
Spring Security 实战指南:从入门到精通
本文详细介绍了Spring Security在Java Web项目中的应用,涵盖登录、权限控制与安全防护等功能。通过Filter Chain过滤器链实现请求拦截与认证授权,核心组件包括AuthenticationProvider和UserDetailsService,负责用户信息加载与密码验证。文章还解析了项目结构,如SecurityConfig配置类、User实体类及自定义登录逻辑,并探讨了Method-Level Security、CSRF防护、Remember-Me等进阶功能。最后总结了Spring Security的核心机制与常见配置,帮助开发者构建健壮的安全系统。
174 0
|
2月前
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
269 70
|
8天前
|
Java 关系型数据库 MySQL
【Spring】【事务】初学者直呼学会了的Spring事务入门
本文深入解析了Spring事务的核心概念与使用方法。Spring事务是一种数据库事务管理机制,通过确保操作的原子性、一致性、隔离性和持久性(ACID),维护数据完整性。文章详细讲解了声明式事务(@Transactional注解)和编程式事务(TransactionTemplate、PlatformTransactionManager)的区别与用法,并探讨了事务传播行为(如REQUIRED、REQUIRES_NEW等)及隔离级别(如READ_COMMITTED、REPEATABLE_READ)。
72 1
|
2月前
|
存储 安全 Java
Spring Security 入门与详解
Spring Security 是 Spring 框架中的核心安全模块,提供认证、授权及防护功能。本文详解其核心概念,包括认证(Authentication)、授权(Authorization)和过滤器链(Security Filter Chain)。同时,通过代码示例介绍基本配置,如 PasswordEncoder、UserDetailsService 和自定义登录页面等。最后总结常见问题与解决方法,助你快速掌握 Spring Security 的使用与优化。
285 0
|
3月前
|
存储 监控 数据可视化
SaaS云计算技术的智慧工地源码,基于Java+Spring Cloud框架开发
智慧工地源码基于微服务+Java+Spring Cloud +UniApp +MySql架构,利用传感器、监控摄像头、AI、大数据等技术,实现施工现场的实时监测、数据分析与智能决策。平台涵盖人员、车辆、视频监控、施工质量、设备、环境和能耗管理七大维度,提供可视化管理、智能化报警、移动智能办公及分布计算存储等功能,全面提升工地的安全性、效率和质量。
|
6月前
|
存储 安全 Java
Spring Security 入门
Spring Security 是 Spring 框架中的安全模块,提供强大的认证和授权功能,支持防止常见攻击(如 CSRF 和会话固定攻击)。它通过过滤器链拦截请求,核心概念包括认证、授权和自定义过滤器。配置方面,涉及密码加密、用户信息服务、认证提供者及过滤器链设置。示例代码展示了如何配置登录、注销、CSRF防护等。常见问题包括循环重定向、静态资源被拦截和登录失败未返回错误信息,解决方法需确保路径正确和添加错误提示逻辑。
358 2
Spring Security 入门
|
5月前
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
202 7
|
5月前
|
人工智能 自然语言处理 Java
Spring Cloud Alibaba AI 入门与实践
本文将介绍 Spring Cloud Alibaba AI 的基本概念、主要特性和功能,并演示如何完成一个在线聊天和在线画图的 AI 应用。
1010 7
|
6月前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
199 7
Spring Boot 入门:简化 Java Web 开发的强大工具