使用方法:

我们现在工程中使用的是基于spring的注解来简化配置,springframework 2.5引入了完整的annotaion配置注解,在我们的工程中,到处可以看到@Autowired 和@Resources 的注解,

大家可以看一下在lbc-applicationContext.xml中有这样的定义。

spring也可以通过 <context:annotation-config/>来配置注解,他的作用是式地向 Spring 容器注册AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、

PersistenceAnnotationBeanPostProcessor 以及RequiredAnnotationBeanPostProcessor 这 4 个BeanPostProcessor。这些容器可以来识别我们在代码中定义的各种注解。

但如果我们定义context:compontent-scan 后就不需要再去定义 <context:annotation-config/>,因为他已经被包含进去了。使用scan的好处是我们可以将需要识别注解的类和包包含进去。

官方2.5.6文档这样描述:

使用 compontent-scan之后,我们可以定义自己的filter来include 或者exclude

之后我们就可以使用spring提供的

具体的可以参考spring官方文档http://docs.spring.io/spring/docs/2.5.6/spring-reference.pdf 里面有详细的spring注解的文档。

原理解析

SpringIoC容器对于类级别的注解和类内部的注解分以下两种处理策略:

(1).类级别的注解:如@Component、@Repository、@Controller、@Service以及JavaEE6的@ManagedBean和@Named注解,都是添加在类上面的类级别注解,Spring容器根据注解的过滤规则扫描读取注解Bean定义类,并将其注册到Spring IoC容器中。

(2).类内部的注解:如@Autowire、@Value、@Resource以及EJB和WebService相关的注解等,都是添加在类内部的字段或者方法上的类内部注解,SpringIoC容器通过Bean后置注解处理器解析Bean内部的注解。

Spring2.5.6文档中提供了上图的几种类内部注解类型,不同的注解有不同的使用的方法,比如@Autowired注解可以在属性上,也可以在setter方法上,还可以在构造函数上,在我们的工程中使用的大多数是@ Resources注解,他和Autowired的区别是,Autowired是默认根据type匹配,如果需要按名称进行装配,则需要配合@Qualifier。而Resources默认是根据名称匹配,而且可以指定其名称。

Spring扫描注解文件的类是ClassPathBeanDefinitionScanner

Spring实现@Autowire解析和注入的核心的类是通过AutowiredAnnotationBeanPostProcessor来实现的。

我们可以通过其方法列表看出,其中对字段的注入,对属性的注入,还有选择相应的构造方法来注入。

我们下面结合选择构造方法来看下其实现原理。

主要是如下步骤完成

1,从构造方法的缓存中查询其构造方法

2,若缓存中不存在,则根据反射获取所有构造方法

3,遍历所有构造方法,查询器是否含有@Autowired属性

4,判断Autowired注解中指定了required属性  (required属性就是判断是否强依依赖)若存在required就使用默认构造方法。

5,返回指定的构造方法

注入的时候则是通过inject方法来实现

总结

Spring通过注解的方式简化了我们的配置,我们现在在工程中使用的大多数都是基于注解的方式实现的,关于Spring注解的使用,官方有很详尽的文档,Spring对注解的支持主要都是通过反射来获取相应的注解,来做相应的处理,我们的工程中大部分都是使用@Service 和@Autowired来使用,其实我们还可以使用到其他的注解来加快我们的开发,满足我们的多样性需求。

spring注解原理解析相关推荐

  1. Spring Boot 原理解析—启动类包扫描原理

    为了何更好的理解该篇内容,请先阅读Spring Boot 原理解析-入口SpringApplication. 我们知道在使用Spring Boot时,Spring会自动加载Spring Boot中启动 ...

  2. Spring Ioc原理解析

    Spring Ioc原理解析 IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图1:软件系统中耦 ...

  3. Java注解原理解析 转载至:梅仁

    一.注解(Annotation)简介 用武之地: 我们不拿定义做解释,因为相信看定义是非常枯燥的.注解用在哪?简单一句话就是,注解几乎是作为简化配置使用的技术.注解是jdk1.5以后出现的,它被广泛的 ...

  4. Spring IOC 原理解析

    Spring IOC 原理 ? IOC DI(依赖注入) **DI注入的几种方式** IOC容器 IOC原理 要想理解IOC,就需要知道一下IOC.DI 和IOC容器都是干什么的 IOC spring ...

  5. Spring MVC原理解析

    现在基于请求驱动的Web框架基本都是由单一的Servlet作为整个应用程序的前置处理器(Front Controller),该Servlet接收到具体的Web处理请求之后,会参照预先可配置的映射信息, ...

  6. spring源码分析01-(前期准备)spring核心原理解析和手写简易spring

    1.本文主要介绍内容 本文会把Spring中核心知识点大概解释下.可以对Spring的底层有一个整体的大致了解.主要内容包括: 手写简易spring框架,帮助更好理解spring. 代码点击链接自取 ...

  7. spring ioc原理解析

    概述 Spring IOC控制反转,分为两个方面解释: 控制:对象对于内部成员的控制 反转:将之前对象管理自己内部成员,转变为ioc容器管理,目的是接耦 IOC的好处是: 无需手动创建,拿来就用 享受 ...

  8. Spring @Transactional 原理解析

    项目准备 创建 dao 层 @Repository public class AccountDao {@Autowiredprivate JdbcTemplate jdbcTemplate;publi ...

  9. Spring Boot 原理解析

    文章目录 前言 一.DemoApplication入口类 二.@SpringBootApplication的原理 1.SpringApplication的run方法 三. SpringApplicat ...

  10. Spring: Feign原理解析

    文章目录 简介 一.Why?为什么要使用Feign 二.How?使用 1.Feign原生使用 2.结合SpringCloud 使用 三.原理分析 总结 简介 Feign 是⼀个 HTTP 请求的轻量级 ...

最新文章

  1. Spark累加器(Accumulator)陷阱及解决办法
  2. 集群、分布式、负载均衡区别
  3. php判断三角形类型,C#_C#判断三角形的类型,题目描述: 输入三角形的三 - phpStudy...
  4. AjaxJson笔记(1)
  5. 字符编码解码整合工具
  6. 了解恶意软件和插件!
  7. 数据结构-线性表之顺序表
  8. python 从大到小循环_python算法(3) 插入排序
  9. mac学python_新手小白学Python必备编程利器Pycharm快捷键大全(Win+Mac)
  10. python对矩阵对角线进行赋值
  11. ES6:Rest 参数和参数默认值【转】
  12. 函数和结构(C++)
  13. shiro—登录拦截
  14. 橘子娱乐完成华创资本千万美元B+轮融资
  15. Fast Non-Bayesian Poisson Factorization for Implicit-Feedback Recommendations
  16. 没想到印度年轻人这么惨!我们知足吧!
  17. 秒懂设计模式之原型模式(Prototype Pattern)
  18. [机器学习入门] 李宏毅机器学习笔记-21(Transfer Learning part 1 ; 迁移学习 part 1)
  19. 关于瞬时功率的无功功率和有功功率,在不同坐标系下的验证
  20. 谈谈产品与运营之 - 什么是用户感知

热门文章

  1. 2019-CS224n-Assignment3
  2. CS224N 笔记一
  3. python 组态_西门子组态WinCC自学入门视频教程资源_48讲
  4. 常用的WebService一览表
  5. Linux搭建FTP服务器
  6. 免费机器视觉视频教程halcon-百度网盘
  7. linux下查看tomcat使用的jdk版本
  8. 德国Taufenbach激光打标机电源维修RFE020详解
  9. 软考中级-软件设计师涉及的知识点和笔记
  10. Arduino—— SSD1306 OLED IIC