最小化Spring XML配置

本文介绍了Java配置下Spring框架中的依赖注入方式,包括@Inject和@Autowired的区别及使用场景,Provider接口的功能,@Value注解的应用,以及如何使用<context:component-scan>进行组件扫描和Bean的自动检测。

@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

转载于:https://my.oschina.net/u/1442577/blog/484641

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值