[Spring实战系列](14)Bean的自动检测
来源:互联网 发布:尤利西斯 知乎 编辑:程序博客网 时间:2024/05/11 03:55
即使<context:annotation-config>有助于完全消除Spring注解中的<property>和<constructor-arg>元素,但是还是不能完全消除,仍然需要使用<bean>元素显示定义Bean。因此<context:component-scan>元素出现了,它除了完成<context:annotation-config>一样的工作,还允许Spring自动检测Bean和定义Bean。这就意味着我们不使用<bean>元素,Spring应用中的大多数(或者所有)Bean都能够实现定义和装配。
为了配置Spring自动检测,需要使用<context:component-scan>元素来代替<context:annotation-config>元素:
<?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.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="">
</context:component-scan>
</beans>
<context:component-scan>元素会扫描指定的包以及所有子包,并查找出能够自动注册为Spring Bean的类。base-package属性标示了<context:component-scan>元素所扫描的包。
为自动检测标注Bean
默认情况下,<context:component-scan>查找使用构造型(stereotype)注解所标注的类,这些特殊的注解如下:
标识将该类定义为Spring MVC controller。@Repository
标识将该类定义为数据仓库(例如:Dao层)。@Service标识将该类定义为服务(例如:Service层)。
1. @component
假设我们应用上下文中仅仅包含Student和School两个Bean。我们可以配置<context:component-scan>元素并使用@Component注解标注Student和School类,从而消除显示的<bean>定义。
package com.sjf.bean;
import org.springframework.stereotype.Component;
/**
* 学校实体类
* @author sjf0115
*
*/
@Component
public class School {
private String name;
private String location;
...
}
Spring扫描com.sjf.bean包时,会发现使用Component注解所标注的School,并自动将它注册为Spring Bean。Bean的ID默认为无限定类名(第一个字母小写),School Bean的ID为school。
下面我们标注Student类:
package com.sjf.bean;
import org.springframework.stereotype.Component;
/**
* 学生实体类
* @author sjf0115
*
*/
@Component("studentBean")
public class Student {
private String name;
private int age;
private School school;
...
}
这种场景下,我们指定了一个Bean ID作为@Component注解的参数。该Bean 的ID不会使用默认的类名,而是显示的命名为studentBean。
当使用<context:component-scan>时,基于注解的自动检测只是一种扫描策略。下面让我们来了解其他的扫描策略来查找候选Bean。
2. 过滤组件扫描
在如何扫描来获得候选Bean方面,<context:component-scan>元素非常灵活。通过为<context:component-scan>配置<context:include-filter>和<context:exclude-filter>子元素,我们可以随意调整扫描行为。
假设我们基于注解让<context:component-scan>自动注册所有实现某个接口的类,我们不得不浏览每一个接口实现的类,并使用@Component来标注它们,非常不方便。所以我们替换掉基于注解的组件扫描策略,再增加一个包含过滤器来要求<context:component-scan>注册以及排除类。
<context:component-scan base-package="com.sjf.bean">
<context:include-filter type="" expression=""/>
<context:exclude-filter type="" expression=""/>
</context:component-scan>
<context:include-filter>的type和expression属性一起协作来定义组件扫描策略。我们还可以选择如下任意一种过滤器:
除了使用<context:include-filter>告知<context:component-scan>哪些类需要注册为Spring Bean以外,我们还可以使用<context:exclude-filter>来告知<context:component-scan>哪些类不需要注册为Spring Bean。
我们实现了两个接口,一个是Worker接口(员工),一个是Performer(表演者)。然后根据这两个接口,分别实现了接口的实现类:
package com.sjf.bean;
/**
* 农民实体类
* @author sjf0115
*
*/
public class Farmer implements Worker {
public void work() {
System.out.println("正在辛勤的耕地...");
}
}
我们使用<context:include-filter>告知<context:component-scan>实现了Worker接口的实现类需要注册为Spring Bean,使用<context:exclude-filter>来告知实现了Perfomer接口的实现类不需要注册为Spring Bean。
<context:component-scan base-package="com.sjf.bean">
<context:include-filter type="assignable" expression="com.sjf.bean.Worker"/>
<context:exclude-filter type="assignable" expression="com.sjf.bean.Performer"/>
</context:component-scan>
我们测试一下上述过滤器是否起作用了:
Farmer farmer = (Farmer) context.getBean("farmer");
farmer.work();
运行结果:
正在辛勤的耕地...
Singer singer = (Singer) context.getBean("singer");
singer.perform();
运行结果:
Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'singer' is defined
参考:《Spring实战》
1 0
- [Spring实战系列](14)Bean的自动检测
- (笔记)Spring实战_最小化Spring XML配置(3)_自动检测Bean
- [Spring实战系列](12)Bean的自动装配
- 《Spring3实战》摘要(3-2)--最小化Spring XML配置之自动检测Bean
- spring 自动检测bean
- Spring自动检测Bean
- spring(自动检测bean)
- Spring自动检测Bean
- spring的自动装配Bean与自动检测Bean
- spring的自动装配Bean与自动检测Bean
- [Spring实战系列](6)配置Spring IOC容器的Bean
- Spring自动检测并装配bean
- 【Spring学习16】自动检测Bean
- 《Spring实战》系列之Bean的装配-Days01
- 《Spring实战》系列之Bean的装配-Days02
- Spring学习:类的自动检测及bean的注册(注解)
- 简化Spring的xml文件配置-自动检测bean
- [Spring实战系列](10)初探Bean生命周期
- 【翻译自mos文章】怎么正确的计算一个ip地址的subnet id?
- Android Volley完全解析(一),初识Volley的基本用法
- C语言贪吃蛇代码
- hdu 1005 矩阵快速幂模板题
- 8.1、支持向量机实例
- [Spring实战系列](14)Bean的自动检测
- 1027. 打印沙漏(20)
- 黑马程序员-学习笔记C语言01
- 移动网络
- MPEG-4, moving picture expert group 避免软弱无力的表达
- Codeforces Round #342 (Div. 2)-B. War of the Corporations(模拟)
- 蓝桥杯 算法训练 ALGO-3 K好数
- Codeforces Round #342 (Div. 2)-C. K-special Tables(模拟)
- 18 图形界面