spring中注解灌注context:component-scan的操作说明版权声明

原创
小哥 3年前 (2022-12-26) 阅读数 10 #大杂烩

通常我们在创建spring项目实施时xml此标签将在配置文件中配置。在配置该标签之后,spring它将自动扫描。base-package对应的路径或该路径的子包。java文件,如果扫描到文件@Service,@Component,@Repository,@Controller例如这些带注释的类,注册这些类bean
注:在注释后添加示例。@Component(value=”abc”)当注册的类bean的id就是adc.

     注意:如果您配置那么可以使用标签xml它在中重新配置,因为前者包括后者。此外还提供了两个子标签 

在注释注入之前,还必须spring在配置文件中进行以下配置spring.xml文件内容:



      

                    

        

 

此配置文件必须声明xmlns:context 这个xml命名空间,位于schemaLocation需要在中指定schema:

http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.0.xsd

在本文档中beans根节点下只有一个context:component-scan节点,具有两个属性base-package属性告诉spring要扫描的包,use-default-filters=”false“表示不使用默认筛选器,此处的默认筛选器将扫描包含@Service,@Component,@Repository,@Controller注释装饰类,use-default-filters属性的默认值为true,这意味着将扫描指定的包@Service,@Component,@Repository,@Controller所有注释类,并注册。bean。
所以,如果你只写配置文件。 <context:component-scan base-package="com.sparta.trans"/> Use-default-filter此时为true什么时候,那就对了。base-package全部在包或子包下java要扫描的类,把匹配的java类注册成bean。

因此,可以发现在这种情况下扫描强度相当大,但如果您只想扫描以下指定的包Controller那我该怎么办?此时,子标签 <context:incluce-filter> 可以发挥作用。如下所示



        

                 

 

这将仅扫描。base-package在规定的@Controller下的Java分类并注册bean

注: context:component-scan节点允许有两个子节点和。filter标签的type表达式描述如下:

Filter Type

Examples Expression

Description

annotation

org.example.SomeAnnotation

符合SomeAnnoation的target class

assignable

org.example.SomeClass

指定class或interface的全名

aspectj

org.example..*Service+

AspetJ语法

regex

org.example.Default.*

Regelar Expression

custom

org.example.MyTypeFilter

Spring3新增自订Type,称作org.springframework.core.type.TypeFilter

在我们的示例中,filter的type设置为正则表达式,regex,注意在常规.表示所有字符,以及.这意味着真实。.性格我们的常规代表需要Controller或者Service下课了。
我们还可以使用annotaion符合上述要求。这里我们指定include-filter的type是annotation,expression注释类的全名。

但是因为use-dafault-filter以上未指定,默认值为true,因此,当上述配置更改为以下配置时,将产生与预期相反的结果(注意base-package包值得一换)

  

   

此时,spring不仅扫描。@Controller并扫描指定包所在的子包service包下注解@Service的java类

此时指定的include-filter它不起作用,只要use-default-filter设置成false就这么做。这样,你可以避免base-packeage配置多个包名称以解决此问题。

此外,在实际项目开发中,我们可以发现base-package指定包中的某些子包不包含注释,因此不需要扫描它们。在这种情况下,您可以指定筛选,表示不需要扫描此包。从上面可以看出 use-dafault-filters=”false“:您可以指定不需要扫描的路径以排除扫描这些文件,也可以指定需要扫描才能扫描的路径use-dafault-filters默认值true,所以这一点在实际使用中仍然需要注意。


@Service告诉spring容器,它是Service类,标识持久层Bean组件,默认情况下自动加载到spring容器中。
@Autowried注解告诉spring,此字段需要自动注入
@Scope指定此spring bean的scope是单例
@RepositoryAnnotation指定该类是容器类DA层类的实现。识别持久层Bean组件
@Componet:基本注释,标识主题。Spring管理的Bean组件
@Controller:标识表示层Bean组件

context.component-scan节点

base-package属性告诉spring要扫描的包
use-default-filters=”false“表示不使用默认筛选器,此处的默认筛选器将扫描包含Service,Component,Responsitory,Controller为装饰类添加注释。

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除