java组件自动注册_组件注册@ComponentScan的自动扫描和指定扫描规则

本文详细介绍了Java中使用@ComponentScan进行组件自动注册时的扫描规则,包括value参数的包扫描,excludeFilters和includeFilters的过滤规则。通过示例代码展示了如何按注解、指定类型以及自定义规则进行组件排除和包含。

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

扫描组件@ComponentScan可以自动扫描包以内的含有@Service,@Controller,@Repository,@Component的组件到IOC容器里面去

@ComponentScan有几个重要的参数

1.value:填写要扫描的包(会级联扫描内部所有子包)

2.excludeFilters(排除扫描组件的规则)

里面装的是Filter的数组

Filter有2个属性:

①type:type是枚举类,里面有以下几种属性:

ANNOTATION, 注解,

ASSIGNABLE_TYPE, ANNOTATION:指定的类型,按照给定的类型,不管是子类还是实现类

ASPECTJ, 按照Aspectj的表达式,基本上不会用到按照

REGEX, 按照正则表达式

CUSTOM 自定义规则

②value(或者classes): 类类型的数组

按照前面的type定义的规则来找到对应的类进行排除

3.includeFilters,它的属性和excludeFilters是一样的,不同的是,它需要关闭ComponentScan里面的属性(useDefaultFilters = false)

示例代码:

ANNOTATION:

import org.springframework.context.annotation.ComponentScan;

import org.springframework.context.annotation.FilterType;

import org.springframework.stereotype.Controller;

import java.util.ArrayList;

import java.util.concurrent.LinkedTransferQueue;

import java.util.concurrent.TransferQueue;

@ComponentScan(value = "com.debuggg",excludeFilters = {

@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class}),

},useDefaultFilters = false)

ASSIGNABLE_TYPE:指定的类及其所有子类,实现类扫描

import org.springframework.context.annotation.ComponentScan;

import org.springframework.context.annotation.FilterType;

import org.springframework.stereotype.Controller;

import java.util.ArrayList;

import java.util.concurrent.LinkedTransferQueue;

import java.util.concurrent.TransferQueue;

@ComponentScan(value = "com.debuggg",excludeFilters = {

@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,classes = {UserService.class})

},useDefaultFilters = false)

public class TransferQueueTest {

CUSTOM: 自定义扫描规则

import org.springframework.context.annotation.ComponentScan;

import org.springframework.context.annotation.FilterType;

import java.util.ArrayList;

import java.util.concurrent.LinkedTransferQueue;

import java.util.concurrent.TransferQueue;

@ComponentScan(value = "com.debuggg",excludeFilters = {

@ComponentScan.Filter(type = FilterType.CUSTOM,classes = {MyTypeFilter.class})

},useDefaultFilters = false)

public class TransferQueueTest {

MyTypeFilter.java

package com.debuggg.test1.main3;

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;

public class MyTypeFilter implements TypeFilter {

@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();

System.out.println("----> " + className);

//如果扫描到的类里面包含er就加入到ioc容器里面

if(className.contains("er")){

return true;

}

return false;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值