您的位置:首页 > 编程语言 > Java开发

最小化Spring XML配置

2015-07-28 00:00 323 查看
摘要: spring in action 第三章

@Inject
和@Autowired一样,@Inject可以用来自动装配属性、方法和构造器;与@Autowired不同的是,@Inject没有required属性。
因此,@Inject注解所标注的关系必须存在,如果不存在,则会抛出异常。
@Inject还提供了另一种技巧。与其直接注入一个应用,不如要求@Inject注入一个Provider。Provider接口可以实现Bean应用的
延迟注入以及Bean的多个实例等功能。
例如,我们有一个KnifeJuggler类需要注入一个或多个Knife的实例。假设Knife Bean的作用域声明为prototype,下面的
KnifeJuggler的构造器将获得5个KnifeBean:
private Set<Knife> knives;

public KnifeJuggler(Provider<Knife> knifeProvider){
knives = newHashSet<>();
for(int i = 0;i<5;i++){
knives.add(knifeProvider.get());
}
}

KnifeJuggler将获得一个Provider<Knife>,而不是在构造器中获得以个Knife实例。这个时候,只有provider被注入进去
在调用provider的get()方法之前,实际的knife对象并没有被注入。在这个示例中,get()方法被调用了5次。因为Knife name的作用域
为prototype,所以knife的Set集合将被赋予5个不同的Knife对象

在注解注入中使用表达式@Value
@Value直接标注某个属性、方法或者方法参数,并传入一个String类型的表达式来装配属性,
例如:
@Value("Eruption")
private String song;

实际上,装配简单的值并不是@Value所擅长的,不过,借助SpEL表达式,@Value被赋予了魔力。
例如:
@Value("#{sytemProperties.myFavoriteSong}")
private String song;

自动检测Bean:
1、<contxt:componenet-scan>元素除了完成与<context:annotation-config>一样的工作,还允许Spring自动检测Bean和定义Bean
这意味着Spring应用中的大多数(或者所有)Bean都能够实现定义和装配.

2、过滤组件扫描
事实上,可以通过为<context:componenet-scan>配置<context:include-filter>和/或者<context:exclude-filter>
子元素,我们可以随意调整扫描行为

<context:componenet-scan base-package = "com.springinaction.springidol">
<context:include-filter type="assignable" expression="com.springinaction.springidol.Instruments"/>
</context:componenet-scan>

过滤器类型 描述
annotation 过滤器扫描使用指定注解所标注的哪些类,通过expression属性指定要扫描的注解
assignable 过滤器扫描派生与expression属性所指定雷丁的那些类
aspectj 过滤器扫描与expression属性所指定的AspectJ表达式所匹配的那些类
custom 使用自定义的org.springframework.core.type.TypeFilter实现类,该类由expression属性指定
regex 过滤器扫描类的名称与expression属性所指定的正则表达式所匹配的那些类

除了使用<context:include-filter>告知<context:componenet-scan>哪些类需要注册为Spring Bean以外,我们还可以使用
<context:exclude-filter>来告知<context:componenet-scan>哪些类不需要注册为Spring Bean。
例如,除了自定义的@SkipIt注解的类,其他所有的Instruments实现都需要注册为Spring Bean。

<context:componenet-scan base-package = "com.springinaction.springidol">
<context:include-filter type="assignable" expression="com.springinaction.springidol.Instruments"/>
<context:exclude-filter type="annotation" expression="com.springinaction.springidol.SkipIt"/>
</context:componenet-scan>

定义个一个配置类
在基于java的配置里使用@Configuration注解的java类,就等价于xml配置中的<beans>元素元素。
例如:
package com.springinaction.springidol
import org.springframework.context.annotation.Configuration;

@Configuration
public class SpringIdoIConfig{

//Bean declaration methods go here
}

@Configuration注解会作为一个标识告诉Spring:这个类将包含一个或多个Spring Bean的定义。这些Bean的定义是使用
@Bean注解所标注的方法。让我们看一下如何使用@Bean来装配使用spring基于java的配置所声明的Bean。

@Bean
public Performer duke(){
return new Juggler();
}

这个简单方法就是java配置,他等价于我们之前使用xml所配置的<bean>元素。@Bean告知Spring这个方法将返回一个对象,
这个对象应该被注册为Spring应用上下文中的一个Bean。方法名将作为该Bean的Id。在该方法中所实现的所有逻辑本质上都是为了创建Bean
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: