Bean的前身今世&处理器&Aware
出生: <bean>......</bean>
幼年:BeanDefinition bean的接口定义
小学:GenericBeanDefinition 基础的bean映射
中学:RootBeanDefinition 拥有依赖关系等附加信息等bean
大学:BeanWrapper 内部用
社会:Object 你的bean
BeanDefinition
BeanDefinition是一个接口,在Spring中存在三种实现:RootBeanDefinition、ChildBeanDefinition以及GenericBeanDefinition。三种实现均继承了AbstractBeanDefinition,其中BeanDefinition是配置文件元素标签在容器中的内部表示形式。元素标签拥有class、scope、lazy-init等配置属性,BeanDefinition则提供了相应的beanClass、scope、lazyInit属性,BeanDefinition和中的属性是一一对应的。其中RootBeanDefinition是最常用的实现类,它对应一般性的元素标签,GenericBeanDefinition是自2.5版本以后新加入的bean文件配置属性定义类,是一站式服务类。
在配置文件中可以定义父和子,父用RootBeanDefinition表示,子用ChildBeanDefiniton表示,而没有父的就使用RootBeanDefinition表示。AbstractBeanDefinition对两者共同的类信息进行抽象。
Spring通过BeanDefinition将配置文件中的配置信息转换为容器的内部表示,并将这些BeanDefiniton注册到BeanDefinitonRegistry中。Spring容器的BeanDefinitionRegistry就像是Spring配置信息的内存数据库,主要是以map的形式保存,后续操作直接从BeanDefinitionRegistry中读取配置信息。
Bean的生命周期
IoC容器之中,这个bean的生命周期就会交由容器进行管理,一般担当管理者角色的是BeanFactory或ApplicationContext。(默认是BeanFactory的生命周期)
标红的二选一
Bean的建立
由BeanFactory读取Bean定义文件,并生成各个BeanDefinition。
BeanFactoryPostProcessor的postProcessBeanFactory
容器每一次刷新时(初始化)调用,它是对BeanDefinition进行后处理,具体的作用就是可以修改配置文件的各个bean的配置。
InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation
所有bean对象实例化之前执行,具体点就是执行每个bean类构造函数之前。 Give BeanPostProcessors a chance to return a proxy instead of the target bean instance。返回一个Object,实际上返回一个null即可。如果不为null就不再执行下面bean的实例化,直接返回此时的object。
Bean实例化,调用bean类构造函数
InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation
bean类实例化之后,初始化之前调用。返回类型是boolean,默认是false,你需要更改为true,否则无法注入属性
InstantiationAwareBeanPostProcessor的postProcessPropertyValue
属性注入之前调用。返回类型是PropertyValue,默认返回null,这里需改为返回第一个参数。
Setter注入
执行Bean的属性依赖注入。
BeanNameAware的setBeanName()
属性注入后调用,该方法作用是让bean类知道自己所在的Bean的name或id属性。
BeanFactoryAware的setBeanFactory()
setBeanName后调用,该方法作用是让bean类知道自己所在的BeanFactory的属性(传入bean所在BeanFactory类型参数)。
BeanPostProcessor的postProcessBeforeInitialization()
对bean实例化、初始化做些预处理操作。返回类型为Object,默认返回null,需要返回参数中bean。
InstantiationAwareBeanPostProcessor(本身继承了BeanPostProcessors)的postProcessBeforeInitialization
再次执行,参考上面的描述
InitializingBean的afterPropertiesSet()
bean类实现InitializingBean接口,重写该方法。初始化工作,但实现该接口这种方法和Spring耦合,不推荐(这一点DisposableBean一样)。
Bean定义文件中定义init-method
执行initMethod()方法,注意,这个方法是不带参数的。
BeanPostProcessor的postProcessAfterInitialization()
Bean在初始化之后做些修改。返回类型为Object,默认返回null,需要返回参数中bean。
InstantiationAwareBeanPostProcessor的postProcessAfterInitialization
再次执行,参考上面的描述
程序执行,bean工作
DisposableBean的destroy()
bean销毁前执行。
Bean定义文件中定义destroy-method
执行destroyMethod()方法,注意,这个方法是不带参数的。
Spring的aware
spring框架提供了多个*Aware接口,用于辅助Spring Bean编程访问Spring容器。
通过实现这些接口,可以增强Spring Bean的功能,但是也会造成对Spring框架的绑定。
ApplicationContextAware,ApplicationContext
LoadTimeWeaverAware,加载Spring Bean时织入第三方模块,如AspectJ
BeanClassLoaderAware,加载Spring Bean的类加载器
BootstrapContextAware,资源适配器BootstrapContext,如JCA,CCI
ResourceLoaderAware,底层访问资源的加载器
BeanFactoryAware,声明BeanFactory
PortletConfigAware,PortletConfig
PortletContextAware,PortletContext
ServletConfigAware,ServletConfig
ServletContextAware,ServletContext
MessageSourceAware,国际化
ApplicationEventPublisherAware,应用事件
NotificationPublisherAware,JMX通知
BeanNameAware,声明Spring Bean的名字
Bean的前身今世&处理器&Aware的更多相关文章
- Spring(二)--FactoryBean、bean的后置处理器、数据库连接池、引用外部文件、使用注解配置bean等
实验1:配置通过静态工厂方法创建的bean [通过静态方法提供实例对象,工厂类本身不需要实例化!] 1.创建静态工厂类 public class StaticFactory { private st ...
- Spring的Bean的生命周期以及Bean的后置处理器
Bean的生命周期: Spring IOC 容器可以管理 Bean 的生命周期, Spring 允许在 Bean 生命周期的特定点执行定制的任务. Spring IOC 容器对 Bean 的生命周期进 ...
- Spring中Bean的后置处理器
以下内容引用自http://wiki.jikexueyuan.com/project/spring/bean-post-processors.html: Bean后置处理器 BeanPostProce ...
- BeanPostProcessor bean 的后置处理器
一. 自定 bean 的后置处理器 MyBeanPostProcessor 类.当你在初始化容器中的 bean 之前和之后,都会调用该处理器中的方法 @Component //将该后后置处理器加入到容 ...
- 死磕Spring之IoC篇 - Bean 的“前身”
该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...
- Spring Bean前置后置处理器的使用
Spirng中BeanPostProcessor和InstantiationAwareBeanPostProcessorAdapter两个接口都可以实现对bean前置后置处理的效果,那这次先讲解一下B ...
- [原创]java WEB学习笔记101:Spring学习---Spring Bean配置:IOC容器中bean的声明周期,Bean 后置处理器
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- spring中Bean后置处理器实现总结
BeanPostProcessor接口 bean的后置处理器实现功能主要是 可以在bean初始化之前和之后做增强处理.自定义MyBeanProcessor实现BeanPostProcessor接口,重 ...
- Spring Bean后置处理器
本例子源于:W3CSchool,在此作记录 Bean 后置处理器允许在调用初始化方法前后对 Bean 进行额外的处理. BeanPostProcessor 接口定义回调方法,你可以实现该方法来提供自己 ...
随机推荐
- 用firebug给firefox添加信任链接
在前文“firefox查看微信公众平台的数据分析时就出现不信任链接怎么办?”我们使用了导入证书的方法添加信任链接,有网友反映说证书导入不成功,这里用另外一种方法来实现:用firebug给firefox ...
- 批量删除wordpress垃圾评论留言
wordpress博客的存在,垃圾评论注定会找上门来.大家还可以用Akismet.Bad Behavior.Spam Karma等一些其他的插件或者直接用程序写个验证码函数对留言进行验证来过滤 垃圾评 ...
- ios socket(基础demo)
http://blog.sina.com.cn/s/blog_7a2f0a830101ecv4.html clinetSocket 1.viewcontroller.h @interface View ...
- 推荐一个linux下的web压力测试工具神器webbench
推荐一个linux下的web压力测试工具神器webbench2014-04-30 09:35:29 来源: 评论:0 点击:880 用多了apache的ab工具之后你就会发现ab存在很多问题, ...
- 什么是响应式Web设计?怎样进行?
http://beforweb.com/node/6/page/0/3 开始第一篇.老规矩,先无聊的谈论天气一类的话题.十一长假,天气也终于开始有些秋天的味道,坐在屋里甚至觉得需要热咖啡.话说两年前也 ...
- linux安装setup工具
如果你的Linux系统是最小化安装的,可能会没有setup命令工具,环境是centos 5.8 安装setup命令工具的步骤. 安装setuptool #yum install setuptool 系 ...
- mac os x查看端口命令
`netstat` 命令 a. `netstat -nat | grep <端口号>` 转自: http://my.oschina.net/foreverich/blog/402252
- OpenStack
[官网]http://www.openstack.org/ [视频教程1]http://blog.csdn.net/u010973404/article/details/16841229 [视频教程2 ...
- iOS NSURLConnection 和 dispatch_async 错误的使用方法,导致回调方法无法调用
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ), ^{ NSMutableURLRequest ...
- canvas API ,通俗的canvas基础知识(二)
上文我们讲到了画一条线,画矩形,写文字,总算是有了一个好的开头,如果还没有看的同学出门左转,先看看那篇,这里就不多做叙述了,接下来我们看比较复杂的一些属性和方法! 讲之前呢,我还是想温习一下,毕竟上文 ...