Spring注解——使用@ComponentScan自动扫描组件

1.创建一个配置类,在配置类上添加 @ComponentScan 注解。该注解默认会扫描该类所在的包下所有的配置类,相当于之前的 <context:component-scan>。

package io.mieux.config;import org.springframework.context.annotation.ComponentScan;@ComponentScan
public class BeanConfig {}

2.使用 ApplicationContext 的 getBeanDefinitionNames() 方法获取已经注册到容器中的 bean 的名称。

import io.mieux.config.BeanConfig;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class App02 {public static void main(String[] args) {ApplicationContext applicationContext =new AnnotationConfigApplicationContext(BeanConfig.class);String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();for (String beanName : beanDefinitionNames) {System.out.println("beanName: " + beanName);}}
}

运行效果:

beanName: org.springframework.context.annotation.internalConfigurationAnnotationProcessor
beanName: org.springframework.context.annotation.internalAutowiredAnnotationProcessor
beanName: org.springframework.context.annotation.internalRequiredAnnotationProcessor
beanName: org.springframework.context.annotation.internalCommonAnnotationProcessor
beanName: org.springframework.context.event.internalEventListenerProcessor
beanName: org.springframework.context.event.internalEventListenerFactory
beanName: beanConfig

除了 spring 本身注册的一些 bean 之外,可以看到最后一行,已经将 BeanConfig 这个类注册进容器中了。

3.指定要扫描的包(使用@ComponentScan 的 valule 属性来配置),创建一个controller 包,并在该包下新建一个 AppController 类。

package io.mieux.controller;import org.springframework.stereotype.Controller;@Controller
public class AppController {
}

在类上加了@Controller注解,说明该类是一个 Component。在 BeanConfig 类中修改:

package io.mieux.config;import org.springframework.context.annotation.ComponentScan;@ComponentScan(value = "io.mieux.controller")
public class BeanConfig {}

在 @ComponentScan 注解中指定了要扫描的包。

运行效果:

beanName: org.springframework.context.annotation.internalConfigurationAnnotationProcessor
beanName: org.springframework.context.annotation.internalAutowiredAnnotationProcessor
beanName: org.springframework.context.annotation.internalRequiredAnnotationProcessor
beanName: org.springframework.context.annotation.internalCommonAnnotationProcessor
beanName: org.springframework.context.event.internalEventListenerProcessor
beanName: org.springframework.context.event.internalEventListenerFactory
beanName: beanConfig
beanName: appController

AppController 已经被注册进容器了。

4.excludeFilters 和 includeFilters 的使用

使用 excludeFilters 来按照规则排除某些包的扫描。

package io.mieux.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.FilterType;
import org.springframework.stereotype.Controller;@ComponentScan(value = "io.mieux",excludeFilters = {@Filter(type = FilterType.ANNOTATION,value = {Controller.class})})
public class BeanConfig {}

excludeFilters 的参数是一个 Filter[] 数组,然后指定 FilterType 的类型为 ANNOTATION,也就是通过注解来过滤,最后的 value 则是Controller 注解类。配置之后,在 spring 扫描的时候,就会跳过 io.mieux 包下,所有被 @Controller 注解标注的类。

使用 includeFilters 来按照规则只包含某些包的扫描。

在创建一个 service 的包,并创建一个 AppService 类,再加上一个 @Service 注解。

package io.mieux.service;import org.springframework.stereotype.Service;@Service
public class AppService {
}

修改 BeanCofig 类:

package io.mieux.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.FilterType;
import org.springframework.stereotype.Controller;@ComponentScan(value = "io.mieux", includeFilters = {@Filter(type = FilterType.ANNOTATION, classes = {Controller.class})})
public class BeanConfig {}

运行效果:

beanName: org.springframework.context.annotation.internalConfigurationAnnotationProcessor
beanName: org.springframework.context.annotation.internalAutowiredAnnotationProcessor
beanName: org.springframework.context.annotation.internalRequiredAnnotationProcessor
beanName: org.springframework.context.annotation.internalCommonAnnotationProcessor
beanName: org.springframework.context.event.internalEventListenerProcessor
beanName: org.springframework.context.event.internalEventListenerFactory
beanName: beanConfig
beanName: appController
beanName: appService

配置里面,应该是只包含 @Controller 注解的类才会被注册到容器中,为什么 @Service 注解的类也被注册了呢?这里涉及到 @ComponentScan 的一个 useDefaultFilters 属性的用法,该属性默认值为 true,也就是说 spring 默认会自动发现被 @Component、@Repository、@Service 和 @Controller 标注的类,并注册进容器中。要达到只包含某些包的扫描效果,就必须将这个默认行为给禁用掉(在 @ComponentScan 中将 useDefaultFilters 设为 false 即可)。

package io.mieux.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.FilterType;
import org.springframework.stereotype.Controller;@ComponentScan(value = "io.mieux", includeFilters = {@Filter(type = FilterType.ANNOTATION, classes = {Controller.class})},useDefaultFilters = false)
public class BeanConfig {}

运行效果:

beanName: org.springframework.context.annotation.internalConfigurationAnnotationProcessor
beanName: org.springframework.context.annotation.internalAutowiredAnnotationProcessor
beanName: org.springframework.context.annotation.internalRequiredAnnotationProcessor
beanName: org.springframework.context.annotation.internalCommonAnnotationProcessor
beanName: org.springframework.context.event.internalEventListenerProcessor
beanName: org.springframework.context.event.internalEventListenerFactory
beanName: beanConfig
beanName: appController

5.添加多种扫描规则

1、如果使用的 jdk8,则可以直接添加多个 @ComponentScan 来添加多个扫描规则,但是在配置类中要加上 @Configuration 注解,否则无效。

package io.mieux.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;@ComponentScan(value = "io.mieux.controller")
@ComponentScan(value = "io.mieux.service")
@Configuration
public class BeanConfig {}

2、也可以使用 @ComponentScans 来添加多个 @ComponentScan,从而实现添加多个扫描规则。同样,也需要加上 @Configuration 注解,否则无效。

package io.mieux.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScans;
import org.springframework.context.annotation.Configuration;@ComponentScans(value = {@ComponentScan(value = "io.mieux.controller"),@ComponentScan(value = "io.mieux.service")})
@Configuration
public class BeanConfig {}

6.添加自定义过滤规则

在前面使用过 @Filter 注解,里面的 type 属性是一个 FilterType 的枚举类型:

public enum FilterType {ANNOTATION,ASSIGNABLE_TYPE,ASPECTJ,REGEX,CUSTOM}

使用 CUSTOM 类型,就可以实现自定义过滤规则。

1、 首先创建一个实现 TypeFilter 接口的 CustomTypeFilter 类,并实现其 match 方法。

package io.mieux.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;public class CustomTypeFilter implements TypeFilter {@Overridepublic boolean match(MetadataReader metadataReader,MetadataReaderFactory metadataReaderFactory) throws IOException {// 获取当前扫描到的类的注解元数据AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();// 获取当前扫描到的类的元数据ClassMetadata classMetadata = metadataReader.getClassMetadata();// 获取当前扫描到的类的资源信息Resource resource = metadataReader.getResource();if (classMetadata.getClassName().contains("Co")) {return true;}return false;}
}

这里简单对扫描到的类名进行判断,如果类名包含”Co“的就符合条件,也就会注入到容器中。

2、对 BeanConfig 进行修改,指定过滤类型为 Custom 类型,并指定 value 为 CustomTypeFilter.class。

package io.mieux.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.FilterType;@ComponentScan(value = "io.mieux",includeFilters = {@ComponentScan.Filter(type = FilterType.CUSTOM, value = {CustomTypeFilter.class})},useDefaultFilters = false)
public class BeanConfig {}

运行效果:

beanName: org.springframework.context.annotation.internalConfigurationAnnotationProcessor
beanName: org.springframework.context.annotation.internalAutowiredAnnotationProcessor
beanName: org.springframework.context.annotation.internalRequiredAnnotationProcessor
beanName: org.springframework.context.annotation.internalCommonAnnotationProcessor
beanName: org.springframework.context.event.internalEventListenerProcessor
beanName: org.springframework.context.event.internalEventListenerFactory
beanName: beanConfig
beanName: appController

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/556268.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python io多路复用_Python之IO多路复用

一、IO模型介绍​ 同步(synchronous) IO和异步(asynchronous) IO&#xff0c;阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么&#xff0c;到底有什么区别&#xff1f;这个问题其实不同的人给出的答案都可能不同&#xff0c;比如wiki&#xff0c;就认为asynchronous IO和…

MySQL中TEXT数据类型的最大长度___MySQL VARCHAR字段最大长度究竟是多少

MySQL TEXT数据类型的最大长度 TINYTEXT256 bytesTEXT65,535 bytes~64kbMEDIUMTEXT16,777,215 bytes~16MBLONGTEXT4,294,967,295 bytes~4GB MySQL中VARCHAR字段最大长度究竟是多少 varchar(n)&#xff0c;n表示什么&#xff1f; MySQL5.0.3之前varchar(n)这里的n表示字节数 …

python自动化_Python 实现Excel自动化办公上

今天的文章分享Python 如何轻松操作Excel 这款office 办公软件的&#xff0c;在Python 中你要针对某个对象进行操作&#xff0c;是需要安装与其对应的第三方库的&#xff0c;这里对于Excel 也不例外&#xff0c;它也有对应的第三方库&#xff0c;即xlrd 库。什么是xlrd库Python…

utf8编码为什么这么普遍,优势在哪里?

为什么需要字符集 计算机存储的和认识的东西就是0和1&#xff0c;我们存储的任何东西最后都会转为0和1的组合计算机才能处理&#xff0c;更贴切的说是我们看到的英文、中文等都是0和1组合的二进制经过一定规则转换为我们认识的字符&#xff0c;这个规则就是字符集。 有哪些字…

SpringBoot默认包扫描机制及@ComponentScan指定扫描路径详解

SpringBoot默认包扫描机制及ComponentScan指定扫描路径详解 SpringBoot默认包扫描机制 标注了Component和Component的衍生注解如Controller,Service,Repository就可以把当前的Bean加入到IOC容器中。那么SpringBoot是如何知道要去扫描Component注解的呢。ComponentScan做的事情…

raid卡组不同raid_RAID 类型介绍

RAID (Redundant Array of Independent/InexpensiveDisks)&#xff0c;独立磁盘冗余阵列&#xff0c;是一种将多块独立的硬盘(物理硬盘)按不同的组合方式形成一个硬盘组(逻辑硬盘)&#xff0c;从而提供比单块硬盘更大的存储容量、更高的可靠性和 更快的读写性能等。该概念最早由…

springboot前端传参date类型后台处理方式

springboot前端传参date类型后台处理方式 先说结论&#xff1a;建议大家直接使用JsonFormat&#xff0c;原因如下&#xff1a; 1、针对json格式&#xff1a;在配置文件中加以下配置 spring.jackson.date-formatyyyy-MM-dd HH:mm:ssspring.jackson.time-zoneGMT82、针对form表…

python2.7 end=号报错_python2 post 上传压缩文件编码报错

python版本是2.7&#xff0c;使用urllib2将文件推送至微信&#xff0c;在上传文件时&#xff0c;碰到这样一个问题&#xff1a;上传未经压缩的文本文件&#xff0c;可以成功&#xff1b;上传经过压缩的二进制文件&#xff0c;则提示编码错误代码如下def upload_tmpfile_old(sel…

python 赚钱 知乎_爬虫实战:抓取知乎问题 “大学生如何赚到一万元”

最近对赚钱的话题很感兴趣&#xff0c;在知乎上关注了很多“赚钱”相关的问题&#xff0c;高质量的有不少&#xff0c;但是夹杂着私货的也不少。不过知乎的数据比较全&#xff0c;我们完全可以用来做文本分析。爬虫的原理我就不细讲了&#xff0c;如果大家对爬虫的原理和相关库…

SpringBoot:解决日期转换问题和日期展示问题

本次我们解决问题&#xff1a;日期展示问题(返回的json中日期的格式是:“birthday”:“1988-08-07T15:00:00.0000000”);需要转化成指定的格式&#xff08;年月日时分秒格式&#xff09; 1、问题如 2、解决方案 在配置中加入 #时间戳统一转换 spring.jackson.date-formatyyy…

13 - java包装类

变量的包装类 八种数据类型 八种包装类 基础数据类型引用数据类型byteByteshortShortintIntegerlongLongfloatFlatdoubleDoublecharCharacterbooleanBoolean 自动装箱 (jdk1.5就有了) Integer i 0; > Integer i new Integer("0"); //> 基础数据类型会自动…

日期格式化时注解@DateTimeFormat无效的问题分析

日期格式化时注解DateTimeFormat无效的问题分析 背景 有时候我们在写接口时&#xff0c;需要把前台传来的日期String类型转为Date类型 这时我们可能会用到DateTimeFormat注解 在请求数据为非JSON格式时&#xff0c;这个注解是没有问题的&#xff0c;可用的&#xff1b; 但…

12 - java 类加载内存图

栈是线程私有的、堆是线程公有的如果不加 static 就是堆里面的属性&#xff0c;加了static 就是元数据区的属性

source code怎么用_code-builder代码生成器

背景本来code-builder是专门为MyBatis Enhance来编写的一块代码生成器code-builder可以用来做什么&#xff1f;code-builder是一款代码生成maven mojo插件&#xff0c;通过简单的配置就可以完成数据库内Table转换Entity或者其他实体类&#xff0c;想怎么生成完全根据你的个人业…

@Transactional注解的失效场景

Transactional注解的失效场景 引言 Transactional 注解相信大家并不陌生&#xff0c;平时开发中很常用的一个注解&#xff0c;它能保证方法内多个数据库操作要么同时成功、要么同时失败。使用Transactional注解时需要注意许多的细节&#xff0c;不然你会发现Transactional总是…

11 - java构造方法

java构造方法 构造方法 构造方法名与类名一致没有返回值使用 new 其实是在调用构造方法如果一个类里面没有构造方法&#xff0c;会自动创建一个空的构造方法构造方法能传参数&#xff0c;在构造期间就把对象的值赋好一旦有了新的有参数的构造方法&#xff0c;空的构造函数就不…

python无限循环的关键字_零基础学python-12.2 关键字pass,else,break,continue

关键字pass,else,break,continuepass&#xff1a;不做任何事情&#xff0c;只占位else&#xff1a;当正常跳出循环时执行break&#xff1a;满足某些条件跳出循环&#xff0c;不再执行任何东西continue&#xff1a;满足某些条件跳出本次循环&#xff0c;然后继续执行循环里面的东…

python中迭代器有哪些_Python迭代器:什么是Python中的迭代器以及如何使用它?

Python编程语言已经扩展了创新的每一个方面&#xff0c;包括机器学习、数据科学、人工智能等&#xff0c;这些概念是Python作为编程语言取得成功的基石。在本文中&#xff0c;我们将通过以下概念来理解PythoPython编程语言已经扩展了创新的每一个方面&#xff0c;包括机器学习、…

Spring 事务方法与非事务方法相互调用 @Transactional 注解失效不回滚?

写这篇文章的初衷呢就是最近遇到了一个Spring事务的大坑。与其说是坑&#xff0c;还不如说是自己事务这块儿太薄弱导致的&#xff08;自嘲下&#xff09;。 项目环境 Spring Boot 下面开始问题描述&#xff0c;发生的过程有点长&#xff0c;想直接看方案的直接跳过哦~&#x…

10 - java 权限修饰符

java权限修饰符 作用域当前类同package子孙类其他packagepublic√√√√protected√√√friendly(defult)√√private√ 为什么要时候用权限修饰符&#xff1f; 对自己而言&#xff0c;保护代码不受污染对别人而言&#xff0c;给别人一个干净的类