• @Autowired

@Autowired市按照类型匹配进行依赖注入的,它可以标注于类定义的多个位置:

  1. 域或属性
  2. 构造方法定义
  3. 方法定义  @Autowired不仅可以标注在传统的setter方法之上,而且还可以标注于任意名称的方法定义,只要该方法定义了需要被注入的参数就行。

为了给容器中定义的每个bean定义对应的实例注入依赖,需要遍历所有bean,然后通过反射,检查每个bean定义对应的类上各种可能位置上的@Autowired,如果存在,就可以从当前容器管理的对象中获取符合条件的对象,设置给@Autowired所标注的属性域/构造方法或方法定义。AutowiredAnnotationBeanPostProcessor是Spring提供的用于这个目的的BeanPostProcessor实现,所以只要在IoC容器的配置文件中追加

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

就可以让整个应用开始运作了。

  • @Qualifier

@Qualifier是byName自动绑定的注解版,IoC容器无法从多个同一类型的实例中选取我们真正想要的,那就用@Qualifier直接点名。

  • @Resource

IoC容器根据@Resource所制定的名称,到容器中查找beanName与之对应的实例,然后将查找到的对象实例注入给@Resource所标注的对象。例如

public class FXNewsProvider {@Resource(name="djNesListener")private IFXNewsListener newsListener;@Resource(name="djNesPersister")private IFXNewsPersister newsPersister;
}

@Resource和@Autowired标注的地方大致相同,都可以标注在属性域或方法上,也可以在构造方法或普通方法上标注。

  • @PostConstruct 和 @PreDestory

这两个注解并不是服务于依赖注入的,主要用于标注对象生命周期管理相关方法,与Spring的InitializingBean和DisposableBean接口,以及配置中的init-method和destroy-method起到类似作用。

只使用@Resource, @PostConstruct和@PreConstruct,并不能立马起作用。就像@Autowired需要AutowiredAnnotationBeanPostProcessor一样,这些注解也需要一个BeanPostProceesor,即CommonAnnotationBeanPostProcessor,这样这些注解才能发挥作用。

<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/>

既然不管是@Autowired还是@Resource都需要添加相应的BeanPostProcessor到容器,那我们可以在基于XSD的配置文件中使用一个<context:annotation-config> 配置搞定义上所有的BeanPostProcessor。

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> <context:annotation-config/><bean id="newsProvider" class="..FXNewsProvider"/><!--其他bean定义-->...
</beans>

  Spring提供的@Autowired加上@Qualifier和JSR250提供的@Resource等注解属于不同派系,如果要实现依赖注入的话,使用一个派别的注解就可以了。

  • classpath-scanning

  不仅依赖关系可以用注解,不用xml配置,Bean的定义也可以不用配置。这就需要classpath-scanning功能了。

  使用相应的注解对组成应用程序的相关类进行标注后,classpath-scanning功能可以从某一顶层包(base package)开始扫描。当扫描到某个类标注了相应注解后,就会提取该类的相关信息,构建对应的BeanDefinition,然后把构建完的BeanDefinition注册到容器。

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"            xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
    <context:component-scan base-package="org.spring21"/>
</beans>

  如果要扫描的类定义在不同的包下面,也可以为base-package指定多个以逗号分隔的扫描路径。

  <context:component-scan>默认扫描的注解类型是@Component,不过在@Component语义基础上细化后的@Repository,@Servicce和@Controller也同样可以被扫描到。

  <context:component-scan>在扫描相关类定义并将它们添加到容器的时候,会使用一种默认的命名规则,来生成那些添加到容器的bean定义的名称(beanName)。这种命名规则就是类名称首字母小写后就是该类bean的beanName。如下例,如果使用默认名称就是如果想自定义一个名称,可以这样写:

@Component("djNewsListener")
public class DowJonesNewsListener implements IFXNewsListener

  <context:component-scan>不仅把注册bean的功能完成了,甚至把<context:annotation-config>的任务也完成了,所以只用<context:component-scan>就可以扫描到bean, 并把它们的依赖关系也注册到了容器中。除此之外,<context:component-scan>的嵌套配置项可以对默认的扫描结果进行过滤以排除某些类。

<context:component-scan base-package="org.spring21"><context:include-filter type="annotation" expression="cn.spring21.annotation.FXService"/><context:exclude-filter type="aspectj" expression=".."/>
</context:component-scan>

转载于:https://www.cnblogs.com/IvySue/p/6524632.html

《Spring》(十一) ---- 基于注解的依赖注入相关推荐

  1. Spring IoC是如何进行依赖注入的

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 依赖注入(DI) DI(Dependency Injection) ...

  2. Wiring in Spring: @Autowired, @Resource and @Inject 三种注解实现依赖注入

    原文链接:Wiring in Spring: @Autowired, @Resource and @Inject 1. Overview 概述 In this Spring Framework tut ...

  3. Spring使用注解配置依赖注入

    大部分情况下,使用Spring配置依赖注入时,都是使用注解来进行配置,因为注解比xml要方便和简单.不过类似于数据源对象这种配置信息容易变更的对象除外,这种对象使用xml文件来进行配置会更适合,方便于 ...

  4. Spring 基于构造函数的依赖注入

    当容器调用带有一组参数的类构造函数时,基于构造函数的依赖注入就完成了,其中每个参数代表一个对其他类的依赖. 看个例子: TextEditor的源代码: public class TextEditor ...

  5. Spring源码系列:依赖注入(二)createBean

    在Spring源码系列:依赖注入(一)(AbstractBeanFactory-getBean)最后说道getBean是依赖注入的起点,bean的创建都是通过createBean来完成具体的创建的.c ...

  6. 【IOC 控制反转】Android 事件依赖注入 ( 事件三要素 | 修饰注解的注解 | 事件依赖注入步骤 )

    文章目录 总结 一.Android 事件设置三要素 二.修饰注解的注解 三.Android 事件依赖注入步骤 总结 Android 依赖注入的核心就是通过反射获取 类 / 方法 / 字段 上的注解 , ...

  7. spring源码分析第三天------spring核心IOC容器和依赖注入原理

    基于XML的依赖注入 1.依赖注入发生的时间 当 Spring IOC 容器完成了 Bean 定义资源的定位.载入和解析注册以后,IOC 容器中已经管理类 Bean 定义的相关数据,但是此时 IOC ...

  8. java @around,Spring AOP基于注解的Around通知

    是一种建议类型,可确保方法执行前后的通知可以运行. 以下是通知的语法: 语法 @Pointcut("execution(* com.yiibai.Student.getAge(..))&qu ...

  9. SSM框架—Spring基础—控制反转和依赖注入(概念)

    控制反转: 控制反转(IoC)是面向对象编程的一个设计原则,用于降低代码耦合度 在传统面向对象编程中,获取对象的方式是用关键字"new"主动创建一个对象,也就是说,应用程序掌握着对 ...

  10. 【转载】详解 Spring 3.0 基于 Annotation 的依赖注入实现

    转载自:http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-iocannt/ Spring 的依赖配置方式与 Spring 框架的 ...

最新文章

  1. Asp.Net编码模型
  2. 字节跳动面试题:用归并排序判断冒泡排序的轮数
  3. 英语口语(每日更新)
  4. 推荐系统中的召回算法--协同过滤
  5. linux c语言 readline,Linux C代码实现读取配置文件示例
  6. P2495-[SDOI2011]消耗战【虚树,dp】
  7. java实现儿时的超级玛丽游戏
  8. 【软件测试】验收测试是以最终用户为主的测试
  9. Codeforces Round #533 (Div. 2) 部分题解A~D
  10. DataTable数据导出到Excel
  11. Jug 并行处理框架
  12. IDEA使用技巧--在文件导航栏中屏蔽指定后缀名的文件
  13. 知更鸟begin主题常见问题
  14. 报价管理:用VBA开发灵活的报价系统
  15. 《浪潮之巅》11~14章
  16. 分而治之,大型文件分片上传
  17. 小鸟云服务器FTP上传中断是什么原因?解决方法总结
  18. 案例|全球蛙,如何从山西“跳”到全国?
  19. 激光SLAM建图过程中的问题MessageFilter [target=odom_combined ]:Dropped 100.00% of messages so far.,解决方案
  20. go 安装gin(使用git clone)

热门文章

  1. 微软提出Layout,多模态任务也有预训练模型啦
  2. 关系抽取之远程监督算法:别再跟我提知识图谱(下篇)
  3. 【Linux】用户必须知道的常用终端快捷键
  4. 【资源】领域自适应相关论文、代码分享
  5. 4.2 文本特征抽取的两种方式CountVectorizer与TfidfVectorizer
  6. python基础9-常见难点
  7. 李宏毅自然语言处理——成分句法分析
  8. C# where()筛选方法
  9. 深入C++“准”标准库,Boost你的力量
  10. 《变革中的思索》连载九:放飞的爱;母亲和我