Spring实战之三:高级装配

处理自动装配的歧义性

标示首选bean

@Primary和@Component组合使用,声明该bean在自动扫描时为首选bean,在遇到歧义时首先使用首选bean

限定自动装配的bean

@Autowired(@Inject)和@Qualifier配合使用,在注入时指定要注入进去的是哪个bean,如@Qualifier(“iceCream”),表明注入ID(确切地讲是限定符,只不过默认限定符和ID是相同的 )为iceCream的bean

创建自定义限定符

@Qualifier和bean声明(@Component或@Bean)一起使用时显示指定该bean的限定符

bean的作用域

在Spring中,bean默认都是单例的,但其实一共有以下几种作用域:

  • Singleton:整个应用范围只创建bean的一个实例
  • Prototype:每次注入或通过应用上下文获取的时候,都会创建一个新的bean的实例
  • Session:在Web应用中,为每个会话创建一个bean实例
  • Request:在Web应用中,为每个请求创建一个bean实例

通过@Scope和@Bean(或@Component)一起使用来指定bean的作用域。

代理模式

使用会话和请求作用域时,@Scope还有一个proxyMode属性,如下所示:

@Scope(value=WebApplicationContext.SCOPE_SESSION,proxyMode=ScopedProxyMode.INTERFACES)

proxyMode指定使用接口的方式实现该bean的代理,如果proxyMode的值设置为:ScopedProxyMode.TARGET_CLASS则表明要使用CGLib来生成基于类的代理。
如果是使用xml的配置方式,要指定使用CGLib的基于类的代理需加上以下元素:

<aop:scoped-proxy/>

如果不使用该元素,默认就是使用基于接口的代理,也可以使用下面方式来显示指定接口方式的代理:

<aop:scoped-proxy proxy-target-class="false"/>

运行时值注入

注入外部的值

使用以下方式可以将文件中的键值对加载到Environment中,然后就可以在Environment中取这些属性。

@Configuration
@PropertySource("classpath:/com/pingan/config.properties")
public class CDPlayerConfig {}

我们还可以将属性定义到外部的属性文件中,并使用占位符值将其插入到Spring bean中。在装配时占位符的形式为”${…}”,这些属性是在配置文件以外的一个源得到的,可以在xml和注解中使用。使用注解方式时,需要配置一个PropertySourcesPlaceholderConfigurer的bean,如下所示:

    @Bean
    public static PropertySourcesPlaceholderConfigurer placeholderConfigurer(){
        return new PropertySourcesPlaceholderConfigurer();
    }

如果使用xml的配置方式,要使用占位符需要加入以下元素:

    <context:property-placeholder/>

我们还可以使用Spring表达式语言(SpEL)来注入属性,SpEL表达式放到#{},使用SpEL表达式的值可以是:

  • 调用方法
  • 字面量
  • 引用其他bean的属性和方法
  • 访问类的静态方法和常量:要依赖T()
  • 使用运算符计算表达式结果
  • 计算正则表达式:matches运算符
  • 计算集合

猜你喜欢

转载自blog.csdn.net/u012124304/article/details/77621721