MyException - 我的异常网
当前位置:我的异常网» 开源软件 » Spring(16)——使用注脚进行bean定义(二)

Spring(16)——使用注脚进行bean定义(二)

www.MyException.Cn  网友分享于:2013-08-16  浏览:0次
Spring(16)——使用注解进行bean定义(二)

16.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来匹配对应的类。

16.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>

16.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>

16.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>

16.5.4 regex

regex表示将采用正则表达式进行匹配。如下示例就表示通过正则表达式匹配所有的Class的名称以Bean开始的类,并将它们加入bean容器中(点“.”在正则表达式中代表任意字符)。

<context:component-scan base-package="com.app">	
	<context:include-filter type="regex" expression=".*\.Bean.*"/>
</context:component-scan>

16.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所写)

 

文章评论

60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
鲜为人知的编程真相
鲜为人知的编程真相
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
每天工作4小时的程序员
每天工作4小时的程序员
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
10个调试和排错的小建议
10个调试和排错的小建议
程序员都该阅读的书
程序员都该阅读的书
中美印日四国程序员比较
中美印日四国程序员比较
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
我是如何打败拖延症的
我是如何打败拖延症的
旅行,写作,编程
旅行,写作,编程
漫画:程序员的工作
漫画:程序员的工作
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
代码女神横空出世
代码女神横空出世
程序员的鄙视链
程序员的鄙视链
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
程序员必看的十大电影
程序员必看的十大电影
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
总结2014中国互联网十大段子
总结2014中国互联网十大段子
那些争议最大的编程观点
那些争议最大的编程观点
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
Java程序员必看电影
Java程序员必看电影
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
如何成为一名黑客
如何成为一名黑客
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
为什么程序员都是夜猫子
为什么程序员都是夜猫子
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
 程序员的样子
程序员的样子
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
程序员和编码员之间的区别
程序员和编码员之间的区别
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
一个程序员的时间管理
一个程序员的时间管理
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有