Nivelle 开拓视野冲破艰险看见世界 身临其境贴近彼此感受生活

spring之注解

2017-05-14
nivelle


spring 之基于注解的依赖注入

  • 注解版的自动绑定(@Autowired)

    1.从自动绑定(autowire)到@Autowired

    @Autowired是基于注解的依赖注入的核心注解,他的存在可以让容器知道需要为当前类注入那些依赖。

    @Autowired 可以标注于类定义的多个位置,包括如下几个:

    • 域(Filed)或者说属性(property).不管申明的访问限制符是private、protected还是public ,只要标注了@Autowired,他们所需要的依赖注入需求就能够被满足。
    public class FXNewsProvider
    {
       @Autowired
       private IFXNewsListener newsListener;
    }
      
    
    • 构造方法定义(Constructor):抢夺原有自动绑定功能中constructor方式的权利,根据构造方法的参数类型,来决定什么样的依赖对象注入给当前对象。
    • 方法定义(Method):不仅可以标注于传统的setter方法之上,而且还可以标注于任意名称的方法定义之上,只要该方法定义了需要的被注入参数。
  • @Autowired 工作原理

    为了给容器中定义的每个bean注入依赖,通过遍历,然后通过反射,检查每个bean定义对应的类上各种可能位置上的@AutoWired.如果存在就从当前容器管理的对象中获取符合条件的对象,设置给@Autowired所标注的属性域、构造方法或者方法定义。逻辑如下实例:

    Object[] beans=...;
    for(Obejct bean:beans)
    {
      if(autowiredExistsOnField(bean))
      {
       Field f= getQulifiedField(bean);
       setAccessiableIfNecessary(f);
       f.set(getBeanByTypeFromContainer());
      } 
          
      if(autowiredExistsOnConstructor(bean))
      {
         
      }   
        
      if(autowiredExistsOnMethod(bean))
      {
         
      }   
    }
      
      
    

    为此,可以通过使用一个Spring的IoC容器使用的BeanPostProcessor自定义实现,让这个BeanPostProcessor在实例化bean定义的过程中,来检查当前对象是否有@Autowired标注的依赖需要注入。Spring提供了默认的实现:org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.

    只需要在原来定义bean的容器配置文件中追加一个AutowiredAnnotationBeanPostProcessor就可以了:

    /<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"></bean>
      
    

    @Autowired是按照类型进行匹配的,@Qualifier是按照name进行匹配的。

    public class FXNewsProvider
    {
       @Autowired
       @Qualifier("reutersNewsListner")
       private IFXNewsListener newsListener;
    }
      
    

JSR250标注的依赖注入关系:

@Resource 遵循的是byName自动绑定形式的行为准则。ioc容器将根据@Resource所指定的名称,到容器中查找beanName与之对应的实例,然后将查找到的对象实例注入给@Resource所标注的对象。

确切的说@PostConstruct和@PreDestroy不是服务于依赖注入的,主要用于标注对象生命周期管理相关方法,与Spring的InitializingBean和DisposableBean接口,以及配置项中的init-mehod和destroy-method起到类似作用。

  public class LifecycleEnabledClass
  {
     @PostConstruct
     public void setUp()
     {
     ...
     }

     @PreDestroy
     public void destroy()
     {
      ...
     }

  }


类似@Autowired需要org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor JSR250提供了org.springframeword.contextt.annotation.CommonAnnotationBeanPostProcessor:

添加如下配置:

 <bean class="org.springframeword.contextt.annotation.CommonAnnotationBeanPostProcessor"

不管是@Autowired还是@Resource都需要添加相应的BeanPostProcessor,此时可以使用一个公用的配置一次搞定

   <context:annotation-config>

一步到位:

classpath-sacnning功能可以从某一个顶层包开始扫描,当扫描到某个类标注了相应的注解之后,就会提取该类相关信息,构建对应的BeanDefinition,把构建完成BeanDefinition注册到容器。

classpath-sacnning 功能的触发是由决定的:

  <context:component-scan base-package="org.spring21"


将扫描遍历org.spring21路径下的所有类型定义,寻找标注相应注解的类,添加到ioc容器。

它同时将org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor 和 org.springframeword.contextt.annotation.CommonAnnotationBeanPostProcessor 一并注册到容器中


文章内容出自:《spring揭秘》–王福强


相关文章

上一篇 spring之bean

下一篇 spring之事件

评论