[Spring]04_最小化Spring XML配置

本文内容纲要:

- 4.1 自动装配 Bean

- 4.1.1 四种类型的自动装配

- 4.1.2 默认自动装配

- 4.2 使用注解装配

- 4.2.1 @Autowired

- 对方法进行标注

- 对属性进行标注

- 可选的自动装配

- @Qualifier

- 4.2.2 @Inject

- Provider

- 4.3 自动检测 Bean

- 4.3.1 为自动检测标注 Bean

- 4.3.2 过滤组件扫描

- 参考资料

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 为例

假如有一个歌手类,含两个属性,一个是演唱的曲目,一个是演奏的乐器。

以上,是显示配置 instrument 的方法。

如果,定义定义吉他(Guitar) Bean 时,把 Bean 的 id 属性设置为 instrument:

可以发现Guitar Bean的 id 属性和 Singer Bean 的 name 属性的名字是一样的。

Spring 可以通过配置 autowire 属性,将两者自动关联起来,如下:

完成。

其他自动装配类型的使用方式和 byName 差不多,这里不再赘述。

4.1.2 默认自动装配

你是否会觉得给每一个 bean 都设置相同的 autowire 类型过于麻烦?

Spring允许在根元素 上使用 fault-autowire 属性来设置所有 bean 的默认自动装配属性。


在上例中, 标签下的所有 bean 如果不显示的指定 autowire 属性,那么它们的默认自动装配属性都是 byType 类型。

4.2 使用注解装配


从 Spring2.5 开始,引入了注解,从此可以使用注解自动装配 Bean 的属性。

使用注解方式自动装配与在XML中使用 autowire 属性自动装配并没有太大区别,但是使用注解方式允许更细粒度的自动装配。

注意:Spring默认禁用注解装配,所以要使用它,必须先使用 context:annotation-config 来启用注解配置。

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 配置的 元素,但是仍然需要使用 元素显示定义 Bean。

context:component-scan 除了完成与 context:annotation-config 一样的工作,还允许 Spring 自动检测 Bean 和定义 Bean。

<context:component-scan base-packet="com.spring.demo">

</context:component-scan>

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版)

本文内容总结:4.1 自动装配 Bean,4.1.1 四种类型的自动装配,4.1.2 默认自动装配,4.2 使用注解装配,4.2.1 @Autowired,对方法进行标注,对属性进行标注,可选的自动装配,@Qualifier,4.2.2 @Inject,Provider,4.3 自动检测 Bean,4.3.1 为自动检测标注 Bean,4.3.2 过滤组件扫描,参考资料,

原文链接:https://www.cnblogs.com/jingmoxukong/p/4532600.html

以上是 [Spring]04_最小化Spring XML配置 的全部内容, 来源链接: utcz.com/z/296103.html

回到顶部