Spring注解驱动开发(一):@Configuration、@Bean、@ComponentScan注解介绍与使用

本文详细介绍了Spring Boot和Spring Cloud中常用的@Configuration、@Bean、@ComponentScan注解的原理及使用。通过示例展示了如何使用注解简化配置,并探讨了@ComponentScan的excludeFilters和includeFilters参数。此外,还分享了如何创建自定义过滤规则,以实现特定类的扫描过滤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我是 ABin-阿斌:写一生代码,创一世佳话。 如果小伙伴们觉得我的文章有点 feel ,那就点个赞再走哦。
在这里插入图片描述

前言

  • 如今我们这个行业领域的各大中小型公司大部分都使用了 SpringBoot、SpringCloud 的技术架构来开发项目,这些基础也是当前最火热的技术,作为Spring之上的框架,他们大量使用到了Spring的一些底层注解、原理,比如@Conditional、@Import、@EnableXXX等。如果掌握这些底层原理、注解,那么我们对这些高层框架就能做到高度定制,在实际开发当中我们会使用的游刃有余。

@Configuration

说明: 改注解加到任何一个类上,那么这个类就表明是一个配置类。这个配置类就好比我们以前的 xml 文件。

@Bean

说明: 该注解表示给容器中注入一个 Bean,类型为返回值的类型,id 默认用方法名作为 id

未使用注解之前配置:
在这里插入图片描述
使用注解之后:在这里插入图片描述
在这里插入图片描述
运行结果:
在这里插入图片描述

@ComponentScan

说明: 指定要扫描的包路径,value:指定扫描的包路径

其它参数介绍:

  • excludeFilters = Filter[] :指定扫描的时候过滤掉哪些注解
  • includeFilters = Filter[] :指定扫描的时候只扫描哪些注解
  •  	1.FilterType.ANNOTATION:按照注解
    
  •      2.FilterType.ASSIGNABLE_TYPE:按照给定的类型;
    
  •      3.FilterType.ASPECTJ:使用ASPECTJ表达式
    
  •      4.FilterType.REGEX:使用正则指定
    
  •      5.FilterType.CUSTOM:使用自定义规则
    
  •    useDefaultFilters:用来指示是否自动扫描带有 @Component、@Repository、@Service和 @Controller的类。默认为 true,即默认扫描。
    

未使用注解:
在这里插入图片描述
使用注解:
在这里插入图片描述
创建一个自定义过滤规则类:

package com.mangobin.config;

import org.springframework.core.io.Resource;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.ClassMetadata;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.core.type.filter.TypeFilter;

import java.io.IOException;

/**
 * @author ABin-阿斌
 *
 * 自定义类型过滤器:
 *      match 方法:
 *      参数一:MetadataReader:表示读取当前正在扫描的类信息
 *      参数二:MetadataReaderFactory:表示获取所有扫描到的类信息
 */
public class MyTypeFilter implements TypeFilter {

    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {

        //获取当前类注解的信息
        AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();

        //获取当前正在扫描的类信息
        ClassMetadata classMetadata = metadataReader.getClassMetadata();

        String className = classMetadata.getClassName();
        System.out.println("======================="+className);
        //判断扫描类是否包含 er 如何包含则进行输出
        if(className.contains("er")){
            return true;
        }

        //获取当前类的资源引用信息(类的路径)
        Resource resource = metadataReader.getResource();
        return false;
    }
}

运行结果

输出结果请结合上方代码来和注解理论说明来观看

在这里插入图片描述
补充: 其它三个类的输出应为我们上方代码写了一个判断:看这是否有包含 er 字母的类,如果有那么就返回 true,所以这三个类都有 er。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值