`

Spring配置项之<context:component-scan base-package="..."/>

阅读更多
使用 @Component

虽然我们可以通过@Autowired或@Resource在 Bean 类中使用自动注入功能,但是 Bean 还是在 XML 文件中通过 <bean> 进行定义 —— 也就是说,在 XML 配置文件中定义 Bean,通过@Autowired或@Resource为 Bean 的成员变量、方法入参或构造函数入参提供自动注入的功能。能否也通过注释定义 Bean,从 XML 配置文件中完全移除 Bean 定义的配置呢?答案是肯定的,我们通过 Spring 2.5 提供的@Component注释就可以达到这个目标了。

下面,我们完全使用注释定义 Bean 并完成 Bean 之间装配:


清单 20. 使用 @Component 注释的 Car.java


package com.baobaotao;

import org.springframework.stereotype.Component;

@Componentpublic class Car { …}




仅需要在类定义处,使用@Component注释就可以将一个类定义了 Spring 容器中的 Bean。下面的代码将Office定义为一个 Bean:


清单 21. 使用 @Component 注释的 Office.java


package com.baobaotao;

import org.springframework.stereotype.Component;

@Componentpublic class Office {

private String officeNo = "001";



}




这样,我们就可以在 Boss 类中通过@Autowired注入前面定义的Car和Office Bean了。


清单 22. 使用 @Component 注释的 Boss.java


package com.baobaotao;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Required;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component("boss")
public class Boss {
    @Autowired
    private Car car;

    @Autowired
    private Office office;
    …
}




@Component有一个可选的入参,用于指定 Bean 的名称,在 Boss 中,我们就将 Bean 名称定义为“boss”。一般情况下,Bean 都是 singleton 的,需要注入 Bean 的地方仅需要通过 byType 策略就可以自动注入了,所以大可不必指定 Bean 的名称。

在使用@Component注释后,Spring 容器必须启用类扫描机制以启用注释驱动 Bean 定义和注释驱动 Bean 自动注入的策略。Spring 2.5 对 context 命名空间进行了扩展,提供了这一功能,请看下面的配置:


清单 23. 简化版的 beans.xml
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context-2.5.xsd">
    <context:component-scan base-package="com.baobaotao"/>
</beans>

这里,所有通过 <bean> 元素定义 Bean 的配置内容已经被移除,仅需要添加一行 <context:component-scan/> 配置就解决所有问题了——Spring XML 配置文件得到了极致的简化(当然配置元数据还是需要的,只不过以注释形式存在罢了)。<context:component-scan/> 的 base-package 属性指定了需要扫描的类包,类包及其递归子包中所有的类都会被处理。

<context:component-scan/> 还允许定义过滤器将基包下的某些类纳入或排除。Spring 支持以下 4 种类型的过滤方式,通过下表说明:


表 1. 扫描过滤方式
注释假如 com.baobaotao.SomeAnnotation 是一个注释类,我们可以将使用该注释的类过滤出来。类名指定通过全限定类名进行过滤,如您可以指定将 com.baobaotao.Boss 纳入扫描,而将 com.baobaotao.Car 排除在外。正则表达式通过正则表达式定义过滤的类,如下所示: com\.baobaotao\.Default.*AspectJ 表达式通过 AspectJ 表达式定义过滤的类,如下所示: com. baobaotao..*Service+

下面是一个简单的例子:

<context:component-scan base-package="com.baobaotao">
    <context:include-filter type="regex"
        expression="com\.baobaotao\.service\..*"/>
    <context:exclude-filter type="aspectj"
        expression="com.baobaotao.util..*"/>
</context:component-scan>


值得注意的是 <context:component-scan/> 配置项不但启用了对类包进行扫描以实施注释驱动 Bean 定义的功能,同时还启用了注释驱动自动注入的功能(即还隐式地在内部注册了AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor),因此当使用 <context:component-scan/> 后,就可以将 <context:annotation-config/> 移除了。

默认情况下通过@Component定义的 Bean 都是 singleton 的,如果需要使用其它作用范围的 Bean,可以通过@Scope注释来达到目标,如以下代码所示:


清单 24. 通过 @Scope 指定 Bean 的作用范围
package com.baobaotao;
import org.springframework.context.annotation.Scope;

@Scope("prototype")
@Component("boss")
public class Boss {
    …
}


这样,当从 Spring 容器中获取bossBean 时,每次返回的都是新的实例了。


参考:http://hi.baidu.com/blue1255/item/ded2dc155c88b20ad0d66d85

分享到:
评论
3 楼 javadyl 2015-04-15  
简单 易懂
2 楼 wangxiao5530 2013-03-25  
讲的简单易懂,很好
1 楼 chenjinbo1983 2012-12-18  
好,谢谢,对我很有用

相关推荐

    Spring注解详解

    &lt;context:component-scan base-package="com.example"/&gt; ``` 这将扫描指定的类包和其递归子包中的所有类,并将其注册到 Spring 容器中。 Spring支持四种类型的过滤方式: 1. 注解过滤:使用 `@SomeAnnotation` ...

    Spring环境配置

    &lt;context:component-scan base-package="com.example.package"/&gt; &lt;!-- 开启AOP支持 --&gt; &lt;aop:aspectj-autoproxy/&gt; &lt;!-- 数据源配置 --&gt; &lt;bean id="dataSource" class="org.springframework.jdbc.datasource....

    spring与mybatis整合配置文档

    首先,在Spring配置文件中,通过`&lt;context:component-scan&gt;`标签定义了组件扫描的基包为`com.liao`,并排除了带有`@Controller`注解的类,这意味着该扫描主要用于扫描服务层等非控制器组件。 ```xml &lt;context:...

    SSM三大框架的整合.docx

    &lt;context:component-scan base-package="com.example.controller" /&gt; ``` #### 补充一 以上介绍了 SSM 框架的基本整合流程,但实际项目中还需要考虑许多其他细节,比如异常处理、日志配置、安全性等。对于大型项目...

    SpringMVC知识点.doc

    &lt;context:component-scan base-package="com.yourpackage"/&gt; &lt;mvc:annotation-driven/&gt; &lt;!-- 配置视图解析器 --&gt; &lt;bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"&gt; ...

    (代码)SpringMVC第1讲:HelloWorld

    &lt;context:component-scan base-package="com.yourpackage"/&gt; &lt;mvc:annotation-driven/&gt; &lt;bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"&gt; &lt;property name="prefix" value="/...

    maven搭建SSM框架

    &lt;context:component-scan base-package="com.example.ssm.controller" /&gt; ``` 3. **Web.xml 配置**: - 配置`ContextLoaderListener`和`DispatcherServlet`。 - 示例代码如下: ```xml &lt;listener&gt; &lt;listener...

    ssm整合redis1

    &lt;context:component-scan base-package="com.aaa.ssm.dao"&gt;&lt;/context:component-scan&gt; &lt;!-- 初始化Jedis连接池--&gt; &lt;bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"&gt; &lt;!--最大连接数, 默认8个--...

    java 小型环境搭建 SpringMVC

    &lt;context:component-scan base-package="com.yourcompany.springmvc.controller" /&gt; &lt;mvc:annotation-driven /&gt; &lt;bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"&gt; ...

    Springboot项目整合JSP页面

    &lt;context:component-scan base-package="com.cloud.JspDemo"/&gt; &lt;mvc:annotation-driven/&gt; &lt;!-- 添加视图解析器 --&gt; &lt;bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"&gt; ...

    maven搭建springMVC环境

    &lt;context:component-scan base-package="com.yourcompany.testSpringMVC" /&gt; &lt;mvc:annotation-driven /&gt; &lt;!-- 配置视图解析器 --&gt; &lt;bean class="org.springframework.web.servlet.view....

    使用Eclipse构建Maven的SpringMVC项目

    &lt;context:component-scan base-package="com.example.springmvc" /&gt; &lt;mvc:annotation-driven /&gt; &lt;!-- 配置视图解析器 --&gt; &lt;bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"&gt;...

    spring mvc 项目源码实例 + 完整环境配置详细说明

    &lt;context:component-scan base-package="com.example.yourpackage" /&gt; &lt;mvc:annotation-driven /&gt; &lt;bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"&gt; &lt;property name="prefix...

    SpringMvc HelloWorld

    &lt;context:component-scan base-package="com.yourpackage"/&gt; &lt;mvc:annotation-driven/&gt; &lt;bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"&gt; &lt;property name="prefix" value="/...

    spring包扫描配置的项目

    在Spring中,包扫描是通过`&lt;context:component-scan&gt;`标签实现的,该标签位于XML配置文件中。这个标签告诉Spring去指定的包及其子包下查找标记为`@Component`、`@Service`、`@Repository`和`@Controller`的类,这些...

    springMVC整合DWR3.0 实例

    &lt;context:component-scan base-package="com.pfxt.controller"/&gt; &lt;!-- 开启注解驱动 --&gt; &lt;mvc:annotation-driven/&gt; &lt;!-- 静态资源映射 --&gt; &lt;mvc:resources mapping="/resources/**" location="/WEB-INF/...

    Spring 3.1.1 与 JPA2 (Hibernate 4.0.0.Final)整合-DWP

    &lt;context:component-scan base-package="com.example.myapp"/&gt; &lt;mvc:annotation-driven/&gt; &lt;bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"&gt; &lt;property name="prefix" value=...

    使用Swagger自动生成API说明文档

    &lt;context:component-scan base-package="cn.itrip.controller"&gt; &lt;context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/&gt; &lt;context:include-filter type=...

    jeecg3.6.5/3.6.6(非maven)MyEclipse配置方法

    &lt;context:component-scan base-package="com.jeecg.*"&gt; &lt;context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/&gt; &lt;/context:component-scan&gt; ``` - 复制这段配置...

    spring_MVC框架

    &lt;context:component-scan base-package="com.lym.control"/&gt; &lt;/beans&gt; ``` - **InternalResourceViewResolver**: 配置视图解析器,设置视图前缀和后缀。 - **context:component-scan**: 扫描指定包下的组件,...

Global site tag (gtag.js) - Google Analytics