[Spring]04_最小化Spring XML配置
4.1 自动装配 Bean
Spring 装配 bean 时,有时非常明确,就是需要将某个 bean 的引用装配给指定属性。
例如,若应用上下文中只有一个 javax.sql.DataSource 类型的 bean,那么任意一个依赖 DataSource 的其他 bean 就是需要这个 DataSource Bean。
为了应对这种明确的装配场景,Spring提供了自动装配(autowiring)。
4.1.1 四种类型的自动装配
Spring提供了4种自动装配策略
(1)byName——把与 Bean 的属性具有相同名字(或者ID)的其他 Bean 自动装配到 Bean 的对应属性中。如果没有跟属性的名字相匹配的 Bean, 则该属性不进行装配。
(2)byType——把与 Bean 的属性具有相同类型的其他 Bean 自动装配到 Bean 的对应属性中。如果没有跟属性的类型相匹配的 Bean,则该属性不被装配。
(3)constructor——把与 Bean 的构造器入参具有相同类型的其他 Bean 自动装配到 Bean 构造器的对应入参中。
(4)autodetect——首先尝试使用 constructor 进行自动装配。如果失败,再尝试使用 byType 进行自动装配。
在 Spring 中,使用自动装配的方式是在 bean 元素中注明 autowire 属性。
以 byName 为例
假如有一个歌手类,含两个属性,一个是演唱的曲目,一个是演奏的乐器。
<bean id="jack" class="com.spring.demo.Singer"> <property name="song" value="Star" /> <property name="instrument" ref="guitar" /> </bean>
以上,是显示配置 instrument 的方法。
如果,定义定义吉他(Guitar) Bean 时,把 Bean 的 id 属性设置为 instrument:
<bean id="instrument" class="com.spring.demo.Guitar" />
可以发现Guitar Bean的 id 属性和 Singer Bean 的 name 属性的名字是一样的。
Spring 可以通过配置 autowire 属性,将两者自动关联起来,如下:
<bean id="jack" class="com.spring.demo.Singer" autowire="byName"> <property name="song" value="Star" /> </bean>
完成。
其他自动装配类型的使用方式和 byName 差不多,这里不再赘述。
4.1.2 默认自动装配
你是否会觉得给每一个 bean 都设置相同的 autowire 类型过于麻烦?
Spring允许在根元素 <beans> 上使用 fault-autowire 属性来设置所有 bean 的默认自动装配属性。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" default-autowire="byType"> </beans>
在上例中, <beans> 标签下的所有 bean 如果不显示的指定 autowire 属性,那么它们的默认自动装配属性都是 byType 类型。
4.2 使用注解装配
从 Spring2.5 开始,引入了注解,从此可以使用注解自动装配 Bean 的属性。
使用注解方式自动装配与在XML中使用 autowire 属性自动装配并没有太大区别,但是使用注解方式允许更细粒度的自动装配。
Spring3 支持几种不同的用于自动装配的注解:
- Spring自带的 @Autowired 注解
- JSR-330 的 @Inject 注解
- JSR-250 的 @Resource 注解
4.2.1 @Autowired
对方法进行标注
@Autowired 可以标注需要自动装配Bean引用的任意方法(set方法、普通方法、构造方法)。
例
public class Audience {
private Movie movie;
// 标注构造方法
@Autowired
public Audience(Movie movie) {
this.movie = movie;
}
// 标注set方法
@Autowired
public void setMovie(Movie movie) {
this.movie = movie;
}
// 标注构造方法
public void watchMovie(Movie movie) {
this.movie = movie;
System.out.println("Watch " + movie.toString());
}
}
对属性进行标注
可以使用 @Autowired 直接标注属性,并删除 setter 方法。
例
@Autowired private Movie movie;
@Autowired 不会受限于 private 关键字,即使属性是私有的,它仍然可以被自动装配。
可选的自动装配
默认情况下,@Autowired 具有强契约特征,其所标注的属性或参数必须是可装配的。
如果没有 Bean 可以装配到 @Autowired 所标注的属性或参数中,自动装配失败,抛出 NoSuchBeanDefinitionException。
如果,属性不一定非要装配,null 值也是可以接受的。这种情况下,可以通过设置 @Autowired 的 required 属性为 false 来配置自动装配是可选的。
例
@Autowired(required=false) private Movie movie;
注意:require 属性可以用于 @Autowired 所使用的任意地方。
但是,当使用构造器装配时,只有一个构造器可以将 @Autowired 的 required 属性设置为 true,其他的只能置为 false。
@Qualifier
如果有多个 Bean 完全满足装配条件,并且都可以被装配到属性或参数中。在这种情况下,@Autowired 注解没有办法选择哪一个
Bean 才是真正需要的。这时,可以使用 @Qualifier 注解来缩小选择范围。
@Autowired
@Qualifier("cartoon")
private Movie movie;
以上所示,@Qualifier 尝试注入ID为 cartoon 的 Bean。
创建自定义的Qualifier
如下演示了如何自定义一个限定器:
@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface PrivateMovie {
}
有了自定义的注解,就可以用它来代替 @Qualifier:
@Autowired @PrivateMovie private Movie movie;
4.2.2 @Inject
@Inject 注解是 JSR-330 的核心部件。该注解几乎可以完全替换 Spring 的 @Autowired 注解。
和 @Autowired 一样,@Inject 可以用来自动装配属性、方法和构造器。
与 @Autowired 不同的是,@Inject 没有 required 属性。因此,@Inject 注解所标注的依赖关系必须存在,如果不存在,则会抛出异常。
Provider
JSR-330中有个技巧:不直接注入一个引用,而是注入一个 Provider,Provider 接口可以实现 Bean 引用的延迟注入以及注入 Bean 的多个实例等功能。
4.3 自动检测 Bean
<context:annotation-config> 有助于完全消除 Spring 配置的 <property> 和 <constructor-arg> 元素,但是仍然需要使用 <bean> 元素显示定义 Bean。
<context:component-scan> 除了完成与 <context:annotation-config> 一样的工作,还允许 Spring 自动检测 Bean 和定义 Bean。
例
<?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"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <context:component-scan base-packet="com.spring.demo">
</context:component-scan>
</beans>
<context:component-scan> 元素会扫描指定的包及其所有子包,并查找出能够自动注册为 Spring Bean 的类。
base-package 属性标识了 <context:component-scan> 元素所扫描的包。
4.3.1 为自动检测标注 Bean
默认情况下,<context:component-scan> 查找使用构造器注解所标注的类。
这些特殊的注解如下:
- @Component
- @Controller
- @Repository
- @Service
- 使用@Component标注的任意自定义注解
4.3.2 过滤组件扫描
<context:component-scan> 中有两个子元素,可以用来调整扫描行为:
- <context:include-filter>——包含过滤器
- <context:exclude-filter>——排除过滤器
例
<context:component-scan base-packet="com.spring.demo">
<context:include-filter type="assignable" expression="com.spring.demo.Movie" />
</context:component-scan>
上例中的,type 和 expression 属性一起协作来定义组件扫描策略。
type 有五种选择:
|
过滤器类型 |
描述 |
|
annotation |
过滤器扫描使用指定注解所标注的那些类。通过 expression 属性指定要扫描的注解 |
|
assignable |
过滤器扫描派生于 expression 属性所指定类型的那些类 |
|
aspectj |
过滤器扫描与 expression 属性所指定的 AspectJ 表达式所匹配的那些类 |
|
custom |
使用自定义的org.springframework.core.type.TypeFilter 实现类,该类由 expression 属性指定 |
|
regex |
过滤器扫描类的名称与 expression 属性所指定的正则表达式所匹配的那些类 |
参考资料
Spring实战(第3版)
[Spring]04_最小化Spring XML配置的更多相关文章
- Spring声明式事务(xml配置事务方式)
Spring声明式事务(xml配置事务方式) >>>>>>>>>>>>>>>>>>>& ...
- MongoDB和Java(4):Spring Data整合MongoDB(XML配置)
最近花了一些时间学习了下MongoDB数据库,感觉还是比较全面系统的,涉及了软件安装.客户端操作.安全认证.副本集和分布式集群搭建,以及使用Spring Data连接MongoDB进行数据操作,收获很 ...
- 2015年12月10日 spring初级知识讲解(二)最小化Spring XML配置 注解
序,随着Spring容器管理Bean数量增加,XML文件会越来越大,而且纯手工配置XML很繁琐,Spring和JAVA都提供了一些注解方式用以简化XML配置. 目录 一.自动装配(autowiring ...
- 最小化Spring XML配置
Spring提供两种技巧,可以帮助我们减少XML的配置数量. 1.自动装配(autowiring)有助于减少甚至消除配置<property>元素和<constructor-arg&g ...
- spring RedisTemplate的使用(一)--xml配置或JavaConfig配置
1.xml配置 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="h ...
- spring Ioc容器之使用XML配置Bean
1.项目截图 2.创建xml文件 3.打印机接口 package com.example.demo.computerTest; public interface Printer { void init ...
- Spring使用AspectJ注解和XML配置实现AOP
本文演示的是Spring中使用AspectJ注解和XML配置两种方式实现AOP 下面是使用AspectJ注解实现AOP的Java Project首先是位于classpath下的applicationC ...
- Spring 及 SpringMVC的web.xml配置详解
出处http://blog.csdn.net/u010796790 1.spring 框架解决字符串编码问题:过滤器 CharacterEncodingFilter(filter-name) 2.在w ...
- spring启动,spring mvc ,要不要xml配置,基于注解配置
老项目是09-11年搞的,用的是spring+struts2,没有用注解,全xml配置.web.xml中也配置了一大堆. 现在启动新项目,在项目中用spring+springmvc ,主要用注解,也用 ...
随机推荐
- 23种设计模式--观察者模式-Observer Pattern
一.观察者模式的介绍 观察者模式从字面的意思上理解,肯定有两个对象一个是观察者,另外一个是被观察者,观察者模式就是当被观察者发生改变得时候发送通知给观察者,当然这个观察者可以是多个对象,在项 ...
- Performance Monitor4:监控SQL Server的IO性能
SQL Server的IO性能受到物理Disk的IO延迟和SQL Server内部执行的IO操作的影响.在监控Disk性能时,最主要的度量值(metric)是IO延迟,IO延迟是指从Applicati ...
- 多线程 异步 beginInvoke EndInvoke 使用
有许多耗时操作时,还要响应用户操作.这时候就需要用其他线程或者异步来搞.本来是改造公司的日志组件.因为多上了个国外大区的业务到来本系统来.这个系统其他地方都好就是日志,动不动就要死给我们看.有时候寻找 ...
- Hibernate中事务声明
Hibernate中JDBC事务声明,在Hibernate配置文件中加入如下代码,不做声明Hibernate默认就是JDBC事务. 一个JDBC 不能跨越多个数据库. Hibernate中JTA事务声 ...
- jquery.each()
$(selector).each(function(index,element)) index - 选择器的 index 位置 element - 当前的元素(也可使用 "this" ...
- BPM公文管理解决方案分享
一.方案概述 公文作为一种规范性文书,具有法律性.指导性.政令性强的特点,是企事业单位政令上通下达的重要方式.及时.准确.安全地处理.控制和管理公文,方能保障企事业单位正常运转,确保组织权威和政令畅通 ...
- BPM应用开发解决方案分享
一.需求分析企业整体管理是一个完整的体系,如果 把这个体系比做一个拼图,企业信息化通过各个业务系统覆盖了一部分业务. 企业通过采购实施通用软件的方式,覆盖了企业的核心业务和专业化业务然而系统只满足了部 ...
- HotApp小程序服务范围资质查询器
微信小程序提交审核需要选择资质服务范围,如果服务范围不对,审核会不通过, 开发小程序之前,最好先查询所开发小程序的资质范围,否则无法通过微信审核. 小程序的资质范围查询地址,数据同步微信官方 ht ...
- Block解析(iOS)
1. 操作系统中的栈和堆 我们先来看看一个由C/C++/OBJC编译的程序占用内存分布的结构: 栈区(stack):由系统自动分配,一般存放函数参数值.局部变量的值等.由编译器自动创建与释放.其操作方 ...
- TFS 2015 敏捷开发实践 – 看板的使用
看板在现代应用开发过程中使用非常广泛,不管是使用传统的瀑布式开发还是敏捷开发,都可以使用看板管理.因为看板拥有简单的管理方法,直观的显示方式,所以很多软件开发团队选择使用看板进行软件开发管理.本文不在 ...