Bean基于注解的配置

下面是一个使用注解定义一个DAO的Bean:

import org.springframework.stereotype.Component;

@Component("bookDao")
public class BookDao {
}

它相当于:

<bean id="bookDao" class="com.dao.bookDao" />

@Component可以被Spring容器识别,自动的将该pojo转换为容器管理的Bean.
除了@Component外,Spring还定义了三个功能和@Component一样的注解,分别对DAO,Service及Web层的Controller进行注解:

@Repository:用于对DAO实现类进行注解
@Service:用于对Service实现类进行注解
@Controller:用于对Controller实现类进行注解

这些虽然功能和@Component相同,但可以标识特定的bean,方便认出该bean的实际作用。

扫描注解定义的Bean

Spring提供了一个context命名空间,它提供了扫描类包以应用注解定义Bean的方式,如下代码:

<context:component-scan base-package="com.libiary.dao" />

Spring会扫描这个包下的所有类,并从注解中获取Bean的定义信息。

如果希望扫描特定的类,而不是整个包,那么可以使用resource-pattern属性过滤出特定的类:

<context:component-scan base-package="com.library" 
resource-pattern="books/*.class" />

这里将resource-pattern设置为books/*.class,Spring仅会扫描这个com.library.books子包中的类。

不过你可能需要更多的需求,比如仅需扫描实现某个特定类的类等。
这种可以通过context:component-scan及其过滤子类实现:

<context:component-scan base-package="com.smart">
        <context:include-filter type="regex" expression="com\.smart\.anno.*" />
        <context:exclude-filter type="aspectj" expression="com.smart..*Controller+" />
</context:component-scan>

context:include-filter 表示要包含的过滤类。
context:exclude-filter表示要排除的目标类。

可以有若干个context:exclude-filter和context:exclude-filter。这两个过滤元素支持多种类型的过滤表达式。
支持的类型如下:

1、type=annotation,如
org.springframework.stereotype.Component;
org.springframework.stereotype.Controller;
org.springframework.stereotype.Repository;
org.springframework.stereotype.Service;
将对目标类是否标注了某个注解进行过滤。

2、type=assignable,如com.library.XxxService。
表示所有继承或扩展XxxService的类,将对目标类是否继承或扩展了某个特定类进行过滤

3、type=aspectj,过滤器扫描与指定的AspectJ表达式所匹配的那些类。

4、type=regex,过滤器扫描类的名称指定的正则表达式所匹配的那些类。

5、type=custom,该类必须实现org.springframework.core.type.TypeFilter接口。

在所有这些过滤类型中,除了custom类型外,aspectj的过滤表达能力最强。

context:component-scan还有一个use-default-filters属性,默认是true,表示默认会对上面提到的四种注解都进行扫描。如果仅需要扫描@Controller的Bean,必须将这个属性设为false。

所以,context:component-scan先根据exclude-filter列出不需要扫描的,再通过include-filter列出需要扫描的,再根据use-default-filters的值是否扫描特定注解的类。

以上是bean的注解配置,以及扫描注解定义的Bean。

猜你喜欢

转载自blog.csdn.net/RebelHero/article/details/79681589