2、spring注解学习(组件注册)——@ComponentScan自动扫描组件、指定扫描规则

1、分别创建一个Person类以及controller、service、dao左测试

 controller、service、dao分别加上注解

 2、在主配置类中使用@ComponentScan指定扫描规则

复制代码
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.stereotype.Controller;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;

import com.atguigu.bean.Person;

//配置类==配置文件
@Configuration        //告诉Spring这是一个配置类
@ComponentScan(value="com.atguigu",        //指定要扫描的包
        excludeFilters= {@Filter(type=FilterType.ANNOTATION,classes= {Controller.class})} //指定以某种规则排除扫描哪些组件
)        

public class MainConfig {
    
    //给容器注册一个Bean;类型为返回值类型(bean的id默认是用方法名作为id)
    //@Bean("")增加内容后指定bean的id
    @Bean("person")
    public Person person() {
        return new Person("张三", 19);
    }
}
复制代码

 3、创建测试类进行测试

  

 在pom.xml中添加junit依赖

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

测试类中写测试方法

复制代码
public class IOCTest {
    
    @Test
    public void test01() {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        //getBeanDefinitionNames获取容器中组件的name(即配置文件中组件的id)
        String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
        for (String name : beanDefinitionNames) {
            System.out.println(name);
        }
    }
}
复制代码

获取组件名字打印得到:(因为在主配置类中排除了对@Controller注解的扫描,所以没有BookController组件

4、再次修改主配置文件进行测试

复制代码
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.stereotype.Controller;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;

import com.atguigu.bean.Person;

//配置类==配置文件
@Configuration        //告诉Spring这是一个配置类
@ComponentScan(value="com.atguigu",        //指定要扫描的包
        //excludeFilters= {@Filter(type=FilterType.ANNOTATION,classes= {Controller.class})} //指定以某种规则排除扫描哪些组件
        includeFilters= {@Filter(type=FilterType.ANNOTATION,classes= {Controller.class})},    //指定以某种规则只扫描哪些组件
        useDefaultFilters = false    //includeFilters必须配合useDefaultFilters = false(默认值是true)来使用
)        
public class MainConfig {
    
    //给容器注册一个Bean;类型为返回值类型(bean的id默认是用方法名作为id)
    //@Bean("")增加内容后指定bean的id
    @Bean("person")
    public Person person() {
        return new Person("张三", 19);
    }
}
复制代码

测试类中再次测试得到的结果为:

此例只是以注解扫描规则举例,还有其他扫描规则可百度查询:

/*扫描规则
    1、FilterType.ANNOTATION:按照注解
    2、FilterType.ASSIGNABLE_TYPE:按照给定类的类型,则该类的子类都会扫描注册
    3、FilterType.ASPECTJ:使用ASPECTJ表达式
    4、FilterType.REGEX:使用正则表达式
    5、FilterType.CUSTOM:使用自定义规则
    */

 

posted @   Arbitrary233  阅读(575)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示