原文地址:https://blog.csdn.net/aa1215018028/article/details/80644562

Spring容器框架包org.springframework.stereotype下Controller注解接口源代码如下:

@Target({java.lang.annotation.ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Component

public @interface Controller

{

public abstract String value();

}

@Target({java.lang.annotation.ElementType.Type})表是注解使用在类上;

@Retention(RetentionPolicy.RUNTIME)表示注解在程序运行状态下还有效;

@Component表示该类对象以默认单例模式存放在spring容器框架中;

@Documented无关重要,略;

这个注解在程序运行状态下还有效。再看其他的注解@Respository,@Ser vice等,这两个注解的源代码和Controller的源代码一样,除了接口名,都共有一个value抽象函数。

这些所有的注解都会被component注解接口注解,所有“继承”了component注解接口的注解修饰用户的类会被spring中的注解处理器获取(getAnonations()),判定存在component注解后,注解处理器会在spring容器框架中根据用户类的全限定名通过java的反射机制创建这个用户类的对象,并放到spring容器框架中进行管理。

以上这些描述是我基于对注解系统的理解而描述的。
       bean创建的几个重要步骤:

1) 创建bean实例,也就是bean的实体化,创建过程不仅仅只有java的反射机制,还结合了动态代理的方式

2) 记录创建bean的objectFactory

3) 属性注入

4) 初始化bean

5) 注册disposablebean

Spring bean的生命周期:

说完bean的创建过程,那spring是如何找到这些bean的类文件的呢?

我们在spring的配置文件中,有这样一个标签节点<context:component-scan>,在这个标签的属性base-package中设置要扫描的包。那么可以推断,spring框架中肯定有根据base-package属性扫描得到所有需要管理的bean对象,这个节点中的所有属性会被放入扫描模块对象工具中去,结果就是将所有的bean对象放到spring的容器中去。

注意:spring容器框架额注解都会在running状态下的,所以运行时加载的文件都是已经编译后的class文件.所以使用的是asm技术读取class文件的字节码转化成MetadataReader中的AnnotationMetadataReadingVisitor结构.

标签<context:component-scan>的解析总结如下:

1)根据配置利用asm技术扫描.class文件,并将包含@Component及元注解为@Component的注解@Controller、@Service、@Repository或者还支持Java EE 6的@link javax.annotation.ManagedBean和jsr - 330的 @link javax.inject.Named,如果可用。的bean注册到beanFactory中

2)注册注解后置处理器,主要是处理属性或方法中的注解,包含:

注册@Configuration处理器ConfigurationClassPostProcessor,

注册@Autowired、@Value、@Inject处理器AutowiredAnnotationBeanPostProcessor,

注册@Required处理器RequiredAnnotationBeanPostProcessor、在支持JSR-250条件下注册javax.annotation包下注解处理器CommonAnnotationBeanPostProcessor,包括@PostConstruct、@PreDestroy、@Resource注解等、支持jpa的条件下,注册org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor处理器,处理jpa相关注解注册@EventListener处理器EventListenerMethodProcessor

注解处理器的的实例化和处理器的注册时同步的,实例化后放入到beanFactory的beanProcessors列表中去。

Spring框架的核心就是IOC,通过controller一类注解的bean的实例化过程可以大体总结spring注解的工作原理:

1)利用asm技术扫描class文件,转化成Springbean结构,把符合扫描规则的(主要是是否有相关的注解标注,例如@Component)bean注册到Spring 容器中beanFactory

2)注册处理器,包括注解处理器

4)实例化处理器(包括注解处理器),并将其注册到容器的beanPostProcessors列表中

5)创建bean的过程中,属性注入或者初始化bean时会调用对应的注解处理器进行处理。

举例注解@Autowired 。对于这个注解,您需要在xml中配置这个注解的处理器

AutowiredAnnotationBeanPostProcessor,这个处理器会扫描容器中所有的bean对象,发现bean中拥有@Autowired注解的时候会自动去找到容器中和这个注解修饰类型匹配的bean对象,并注入到对应的地方去。

那为什么AutowiredAnnotationBeanPostProcessor这个处理器对象我怎么在配置文件中没有看到设置呢?   那是因为在spring解析<context:component>标签的时候默认这个注解被隐示配置了,还有其他的注解处理器,如CommonAnnoationBeanPostProcessor。

Spring注解注入原理相关推荐

  1. Java程序员进阶——Spring依赖注入原理分析

    Spring依赖注入原理分析 下面谈谈Spring是如何实现反转模式IOC或依赖注入模式DI: 平时,我们需要生成一个对象,使用new语法,如一个类为A public class A{public v ...

  2. JAVA_OA管理系统(四)番外篇:使用Spring注解注入属性

    本文介绍了使用Spring注解注入属性的方法.使用注解以前,注入属性通过类以及配置文件来实现.现在,注入属性可以通过引入@Autowired注解,或者@Resource,@Qualifier,@Pos ...

  3. spring依赖注入原理(转载)

    关于spring依赖注入原理的文章在网络上已经有很多,我要写的这篇文章原文出自http://taeky.iteye.com/blog/563450,只所以再一次写下来只是为了一为自己收藏,方便以后的复 ...

  4. spring依赖注入原理详解(转载)

    spring依赖注入原理详解----转载 所谓依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到组件中.当spring容器启动后,spring容器初始化,创建并管理bean对象,以及销毁它.所 ...

  5. Spring Setter注入原理

    本文内容如有错误.不足之处,欢迎技术爱好者们一同探讨,在本文下面讨论区留言,感谢.欢迎转载,转载请注明出处(https://blog.csdn.net/feng_xiaoshi/article/det ...

  6. Spring注解注入

    spring注入方式-----注解注入 (1)操作: 首先在要注入的类前面加上: @Component(与后面三个是等价的)@Repository(持久层),@Service业务层,@Controll ...

  7. spring注解注入详解

    1.Spring配置 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="ht ...

  8. spring依赖注入原理详解

    所谓依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到组件中.当spring容器启动后,spring容器初始化,创建并管理bean对象,以及销毁它.所以我们只需从容器直接获取Bean对象就行, ...

  9. 3、spring注解注入

    1.写需要注解注入的类: Propertie.java package study; public class Propertie { public void show() { System.out. ...

  10. Spring自动注入原理

    我的博客 spring的属性注入属于spring bean的生命周期一部分,bean的生命周期首先记住两个概念: spring bean:最终存在spring容器当中的对象 对象:实例化出来的对象,但 ...

最新文章

  1. 一个架构师的缓存修炼之路
  2. 迪士尼“新顶流”,火不到娱乐圈
  3. 化生政组合能选计算机专业吗,化生政这个组合好不好? 适合哪些人报考
  4. mysql中group by 的用法解析
  5. P2831-愤怒的小鸟【状压dp】
  6. linux安装nvidia黑屏,GTX 550 Ti 安装Linux遇到的问题 黑屏 显示器休眠
  7. 2020 年区块链最具影响力人物 Top 20,孙宇晨也上榜了
  8. 深入研读Cache存储的计算
  9. jQuery-点击按钮插入视频
  10. c当中extern详解
  11. 鸿蒙轻内核源码分析:文件系统LittleFS
  12. Android SDK Android NDK 官方下载地址(zt)
  13. 接口里面可以写实现方法吗【可以】 、接口可以多继承吗【可以】
  14. 程序员有前途吗?出路在哪里?
  15. 小孢子的神奇之旅——如何阅读MindSpore报错信息系列(1)
  16. 74ls161芯片介绍和使用方法(不讲原理)
  17. 驳eva的《有关主动防御》
  18. 从零开始做3D地图编辑器(六)(基于QT与OGRE)
  19. offset函数的使用方法_有点麻烦:使用Excel OFFSET函数
  20. vue打印组件v-print强制分页

热门文章

  1. 利用lnmp一键安装的php环境忘记mysql,root用户密码解决方法
  2. Python实现中英文翻译方法总结
  3. Centos7下载安装教程【图文详解】
  4. 微信小程序实现上传图片的功能
  5. Html转Word解决转存图片时候的跨域问题、默认打开视图问题
  6. 解决联想硬盘保护系统忘记密码问题,重新安装Windows10系统
  7. 分享数百个 HT 工业互联网 2D 3D 可视化应用案例之 2019
  8. Arch Linux stc-isp-wine AUR 包
  9. 【转】推荐系统算法总结(一)
  10. php聊天功能界面,php实现聊天室功能完整代码