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:使用自定义规则 */
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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)