15.5 过滤器
默认情况下,Spring将扫描所有@Component、@Controller、@Service和@Repository标注的类,以及这几个注解所派生出来的注解所标注的类,如之前介绍的自定义的@MyComponent注解,并将它们作为一个bean定义在对应的bean容器中。Spring提供了两个filter定义可以让我们对需要扫描的类进行进一步的过滤,一个是<context:include-filter/>
,一个是<context:exclude-filter/>
。这两个filter的配置基本是一样的,所不同的是它们的功能。<context:include-filter/>
对需要扫描的内容进行过滤,即告诉Spring除了按照默认的逻辑进行扫描以外,还需要对哪些内容进行扫描。而<context:exclude-filter/>
则是用来对不需要进行扫描的内容进行过滤,即告诉Spring应该排除对哪些原本应该扫描的内容进行扫描。它们都是作为<context:component-scan/>
的子元素进行定义的,我们可以在一个<context:component-scan/>
标签下单独同时定义多个<context:include-filter/>
或者是多个<context:exclude-filter/>
,但是如果在一个<context:component-scan/>
标签下同时定义<context:include-filter/>
和<context:exclude-filter/>
则需要先定义<context:include-filter/>
,再定义<context:exclude-filter/>
。
在定义<context:include-filter/>
或<context:exclude-filter/>
时我们必须指定type属性和expression属性。type属性表示按照哪种类型进行过滤,expression则表示需要进行过滤的表达式。
对于type属性而言,我们可选的值有如下五种类型。
- annotation:表示注解,根据注解来扫描目标类,即目标类应该使用哪个注解进行了标注,对应的expression应该是注解的全名称。
- assignable:表示是从哪个类或接口派生的,即目标类继承了哪个类或实现了哪个接口,对应的expression应该是对应接口或类的全名称。
- aspect:表示将使用Aspect类型的表达式来表示目标类。
- regex:表示将使用正则表达式来匹配目标类名称。
- custom:表示将使用自定义的
org.springframework.core.type.TypeFilter
来匹配对应的类。
15.5.1 annotation
如下示例表示我们将排除对使用了@Service注解进行标注的类的扫描,即不将对应的Class加入bean容器中。
<context:component-scan base-package="com.app">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
</context:component-scan>
这里再重申一点,那就是使用Spring在扫描时默认是会扫描base-package指定的所有包及其子孙包下所有使用@Component、@Controller、@Service和@Repository及其其它使用这些注解进行标注的注解,使用这些注解进行标注过的Class都会被加入bean容器中。通过<context:include-filter/>
我们可以将其它不在这些范畴的Class加入到bean容器中,通过<context:exclude-filter/>
我们可以将在这个范畴的Class不纳入到加入bean容器中的范畴。
所以我们也可以通过<context:include-filter/>
来将对使用了某种类型的注解进行标注的Class加入bean容器中。如下示例,我们将之前介绍的@MyComponent定义成一个普通的注解,然后将其纳入到bean容器的范畴即可让Spring将使用@MyComponent进行标注的Class加入到bean容器中。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MyComponent {
public String value() default "";
}
<context:component-scan base-package="com.app">
<context:include-filter type="annotation" expression="com.app.MyComponent"/>
</context:component-scan>
15.5.2 assignable
assignable表示根据继承的类或实现的接口进行扫描。如下表示将扫描所有继承或实现java.lang.Object的类,并将其加入bean容器,通过这种方式我们可以让Spring将某些包下的所有的类都加入Spring的bean容器。
<context:component-scan base-package="com.app">
<context:include-filter type="assignable" expression="java.lang.Object"/>
</context:component-scan>
15.5.3 aspect
当指定type为aspect时表示将以Spring定义切面的形式来指定对应的需要进行匹配的Class。如下示例则表示匹配com.app包及其子孙包下所有名称以Bean开头的Class,并将它们加入bean容器。使用该type时需要将spring-aspects-xxx.jar加入类路径下。
<context:component-scan base-package="com.app">
<context:include-filter type="aspectj" expression="com.app..Bean*"/>
</context:component-scan>
15.5.4 regex
regex表示将采用正则表达式进行匹配。如下示例就表示通过正则表达式匹配所有的Class的名称以Bean开始的类,并将它们加入bean容器中(点“.”在正则表达式中代表任意字符)。
<context:component-scan base-package="com.app">
<context:include-filter type="regex" expression=".*\.Bean.*"/>
</context:component-scan>
15.5.5 custom
custom表示使用自己定义的TypeFilter进行匹配。下面来看一个示例,我们来定义一个自己的TypeFilter,其实现简单的根据Class的名称进行匹配,只要Class的名称中包含Bean即表示匹配成功。
public class MyTypeFilter implements TypeFilter {
public boolean match(MetadataReader metadataReader,
MetadataReaderFactory metadataReaderFactory) throws IOException {
String className = metadataReader.getClassMetadata().getClassName();
return className.contains("Bean");
}
}
之后我们在定义filter时就可以通过type指定为custom,然后对应的expression属性指定我们的自定义TypeFilter即可。
<context:component-scan base-package="com.app">
<context:include-filter type="custom" expression="com.app.MyTypeFilter"/>
</context:component-scan>
(注:本文是基于Spring4.1.0所写)
本文转自:https://elim.iteye.com/blog/2388634
相关推荐
举例来说,使用ClassPathXmlApplicationContext可以从classpath的XML配置文件中读取应用程序上下文,从而初始化Spring IoC容器,并加载应用程序中定义的所有bean。而FileSystemXmlApplicationContext则从文件系统中...
在本篇【框架源码篇 04】中,我们将深入探讨Spring框架的核心概念——Bean定义配置化。Spring是Java领域最广泛使用的依赖注入(Dependency Injection,简称DI)和面向切面编程(Aspect-Oriented Programming,简称...
《Spring源码分析——BeanFactory》 在Java的IoC(Inversion of Control)和DI(Dependency Injection)领域,Spring框架扮演着至关重要的角色。BeanFactory是Spring的核心组件之一,它是容器的基石,负责管理应用...
在本视频教程“Spring MVC + Spring + Hibernate 全注解整合开发视频教程 04”中,我们将深入探讨Java企业级开发中的三大核心技术——Spring、Spring MVC和Hibernate的集成与应用,尤其是通过注解实现的简化配置。...
在本主题中,我们将深入探讨Spring框架的2.5版本引入的一个重要特性——基于注解的Spring MVC配置。Spring MVC是Spring框架的一部分,专门用于构建Web应用程序,它提供了一个模型-视图-控制器(MVC)架构来组织和...
除了基本的`@Component`家族,Spring还提供了一些高级注解,如`@Scope`用于定义Bean的作用域,`@Lazy`用于延迟初始化Bean,`@Qualifier`用于在多个相同类型的Bean中指定特定的一个。 ### **总结** Spring的自动...
本文将深入探讨“Spring AOP——Schema”,这是Spring AOP的一种配置方式,通过XML schema定义切面和通知。 首先,我们需要理解AOP的基本概念。面向切面编程是一种编程范式,旨在提高软件的模块化程度,将关注点...
MyBatis可以使用简单的XML或注解来进行配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。 #### 三、Spring框架简介 Spring框架是用于构建企业级Java应用程序的...
现在,如果项目中有任何bean实现了`SomeInterface`,它们都将自动拥有`SomeService`的实例,而无需显式地在bean定义中声明。这使得我们可以为项目中的多个类添加统一的行为,而无需修改它们的源代码。 需要注意的是...
在本视频教程“Spring MVC + Spring + Hibernate 全注解整合开发 03”中,我们将深入探讨Java企业级开发中的三大核心框架——Spring、Spring MVC和Hibernate的整合应用,尤其是利用注解进行的无XML配置。以下是这些...
3. **@Configuration** 和 **@Bean** 注解:这组注解可以替代XML配置,提供更灵活的bean定义方式。@Configuration 类表示这是一个配置类,而@Bean 方法表示返回的对象应该注册为Spring容器中的一个bean。 ```java @...
### 使用Spring 2.5基于注解驱动的SpringMVC:深入解析与实践 #### 核心知识点概览 在Spring 2.5版本中,框架显著增强了对注解的支持,特别是针对SpringMVC(Model-View-Controller)模块,引入了基于注解的配置...
在本视频教程“Spring MVC + Spring + Hibernate 全注解整合开发 05”中,我们将深入探讨Java企业级开发中的三大核心技术——Spring MVC、Spring和Hibernate的集成应用,特别是如何利用注解进行高效无XML配置的开发...
在Spring 2.5中,无需让Controller继承特定的接口或者在XML配置文件中定义请求和Controller之间的映射关系,仅需通过使用注解即可使一个普通的Java对象(POJO)具备Controller的功能。 #### 注解驱动的重要性 注解...
Spring 3.0引入了基于注解的配置,使得我们不再需要为每个控制器创建单独的bean定义。例如,我们可以使用`@Controller`注解标记一个类作为Spring MVC的控制器: ```java @Controller @RequestMapping("/users") ...
在本篇《Spring注解学习手札(一)构建简单Web应用》中,我们将深入探讨如何使用Spring框架的注解来构建一个基本的Web应用程序。Spring框架是Java开发中的核心工具,尤其在企业级应用中广泛应用。它简化了依赖注入、...
这个过程涉及到`resolveDependency`方法,它会遍历Bean定义,匹配并返回合适的依赖。 ### 五、实践应用 在实际开发中,`@Autowired`和`@Resource`的选择应根据场景来决定。如果依赖主要基于类型,且类型具有唯一性...
Spring-beans模块负责Bean的定义,类的实例化,以及依赖关系的处理;Spring-context模块提供了访问应用程序对象的上下文,它是一个配置文件,用于配置应用程序中的对象,它还集成了Spring AOP的功能;Spring-context...
2. **@Autowired**:如果普通类也是Spring的一部分,即它也被Spring管理,那么可以使用注解`@Autowired`来自动装配bean。这样,Spring会自动找到类型匹配的bean并注入到属性中。例如: ```java @Service public ...