Spring中bean的管理
Spring 中常见的容器
我们知道spring容器就是spring中bean的驻留场所。spring容器并不是只有一个。spring自带了多个容器实现,可以归为两种不同的类型:bean工厂和应用上下文。bean工厂是最简单的容器,提供了基本的Di支持;而应用上下文是基于beanFactory构建,并提供了应用框架级别的服务,例如从属性文件解析文本信息以及发布应用实践给感性趣的事件监听者。
虽然我们可以在bean工厂和应用上下文之间任选一种,但是bean工厂对于大多数应用来说往往太低级了,因此,应用上下文要比bean工厂更受欢迎。所以下面我们重点讨论的都是应用上下文对bean的管理。
两类容器的区别:
- BeanFactory
BeanFactory采用了工厂设计模式,负责读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的生命周期。BeanFactory在解析配置文件时并不会初始化对象,只有在使用对象getBean()才会对该对象进行初始化
- ApplicationContext(接口)
ApplicationContext除了提供上述BeanFactory所能提供的功能之外,还提供了更完整的框架功能:国际化支持、aop、事务等。而ApplicationContext在解析配置文件时对配置文件中的所有对象都初始化了,getBean()方法只是获取对象的过程,这样可以确保应用不需要等待他们被创建。
spring自带了很多种类型的应用上下文,常见的有如下几种:
1.AnnotationConfigApplicationContext:从一个或多个基于java的配置类中加载spring上下文定义,适用于java注解的方式;
2.ClassPathXmlApplicationContext:从类路径下的一个或多个xml配置文件中加载上下文定义,把应用上下文的定义文件作为类资源。适用于xml配置的方式;
3.FileSystemXmlApplicationContext:从文件系统下的一个或多个xml配置文件中加载上下文定义,也就是说系统盘符中加载xml配置文件;
4.AnnotationConfigWebApplicationContext:从一个或多个基于java的配置类中加载spring web应用上下文。专门为web应用准备的,适用于注解方式;
5.XmlWebApplicationContext:从web应用下的一个或多个xml配置文件加载上下文定义,适用于xml配置方式
Spring如何管理bean
注意:这里我们是以应用上下文管理bean为例的。
以<bean id="airplane" class="spring.Airplane"/>为例,spring在启动的时候,会创建应用上下文容器,而所有的bean都是在创建应用上下文容器的时候进行加载的,大致流程就是,应用上下文对象会根据我们传入的配置文件路径去加载这个配置文件,然后解析配置文件的<beans>标签下的<bean>标签,然后会对每个bean标签进行解析,这时会根据我们在bean标签中配置的属性(这里我们只定义了id和class)给每一个bean实例化一个BeanDefinition,同时会把这些BeanDefinition对象放入到应用上下文中的一个List<BeanDefinition>集合中,接着就是对List<BeanDefinition>进行循环并且通过class的值通过反射,实例化bean,最后将实例化的bean维护到一个map中,map的key就是bean的id,map的value就是bean的实例化对象,最后我们就可以通过id来获取我们想要的bean了,但是这里只是简单的介绍了bean的加载,应用上下文所做的事情远不止这些,还有对懒加载bean的维护,对bean之间依赖关系的维护(就是我们常说的依赖关系,其实也是通过一个Map<String, Set<String>>类型ConcurrentHashMap来维护的)等等。
Spring中bean的管理的更多相关文章
- Spring中Bean的管理问题
首先,配置文件中定义的bean并不是都在启动时实例化. <bean id="accountService" class="com.foo.DefaultAccoun ...
- Spring中Bean的生命周期及其扩展点
原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/6106456.html Spring中Bean的管理是其最基本的功能,根据下面的图来了解Spr ...
- Spring中Bean管理的常用注解
在Spring中,主要用于管理bean的注解分为四大类:1.用于创建对象.2.用于给对象的属性注入值.3.用于改变作用的范围.4.用于定义生命周期.这几个在开发中经常接触到,也可以说每天都会遇见.其中 ...
- Spring中Bean的作用域、生命周期
Bean的作用域.生命周期 Bean的作用域 Spring 3中为Bean定义了5中作用域,分别为singleton(单例).protot ...
- Spring中Bean的实例化
Spring中Bean的实例化 在介绍Bean的三种实例化的方式之前,我们首先需要介绍一下什么是Bean,以及Bean的配置方式. 如果 ...
- JAVA面试题:Spring中bean的生命周期
Spring 中bean 的生命周期短暂吗? 在spring中,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每一个Bean的别名只能维持一 ...
- Spring中的事务管理详解
在这里主要介绍Spring对事务管理的一些理论知识,实战方面参考上一篇博文: http://www.cnblogs.com/longshiyVip/p/5061547.html 1. 事务简介: 事务 ...
- spring对bean的管理细节
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...
- 简:Spring中Bean的生命周期及代码示例
(重要:spring bean的生命周期. spring的bean周期,装配.看过spring 源码吗?(把容器启动过程说了一遍,xml解析,bean装载,bean缓存等)) 完整的生命周期概述(牢记 ...
随机推荐
- 都2019年了,Java为什么还在坚持多线程不选择协程?
都2019年了,Java为什么还在坚持多线程不选择协程? - 知乎 https://www.zhihu.com/question/332042250/answer/734051666
- ubuntu18设置root账号的开机登录
date: 2019-08-20 17:36:49 author: headsen chen notice :个人原创 1,用普通用户登录. su - root 打开终端 vi /etc/pam.d ...
- VS2015 dlib编译 x64 Release .lib生成
VS2015 dlib编译 x64 Release >------ 已启动生成: 项目: ZERO_CHECK, 配置: Release x64 ------ > Checking Bui ...
- 利用VisualSVN修改配置库名称
相信大家都听说过SVN的大名,至于它的用途以及如何安装不在本文范围内,这里主要讲解如何利用VisualSVN来更改配置库的名称,前提是你的SVN服务必须用VisualSVN搭建,网上几乎没有这方面的文 ...
- [LintCode] 619 Binary Tree Longest Consecutive Sequence III 二叉树最长连续序列 III
Given a k-ary tree, find the length of the longest consecutive sequence path. The path could be star ...
- PRECONDITION_FAILED - inequivalent arg 'type' for exchange 'exchange' in vhost '/': received 'direct
最近在搞rabbitmq,把解决问题方法记下 问题1:PRECONDITION_FAILED - inequivalent arg 'type' for exchange 'exchange' in ...
- 什么时候该用readfile() , fread(), file_get_contents(), fgets()?
fread() 和 readfile() fread() 最大一次性能读取 8k长度的字节数,所以不能一次性读取大文件去作下载. 优势在于,操作更加灵活,每次读取指定字节的内容,用于下载时方便控制服务 ...
- Linux下Mongodb安装和启动配置 转载
原文地址:https://www.cnblogs.com/Jimmy104/p/6181899.html 以下文章为转载,感谢网友,原文链接 http://blog.csdn.net/yuwenrul ...
- CF1228D Complete Tripartite
思路: 任选一点a,和a没有边直接相连的点一定和a在同一个集合,由此构造得到一个集合A.用类似的方法再构造一个集合B,并将剩下的点放在集合C中,就得到了三个集合A,B,C.再检查A,B,C是否符合要求 ...
- js复制json对象
var newJson = JSON.parse(JSON.stringify(json对象));