Spring中Bean的基本概念
一、Bean的定义
<beans…/>元素是Spring配置文件的根元素,<beans…/>元素可以包含多个<bean…/>子元素,每个<bean…/>元素可以定义一个Bean实例,每一个Bean对应Spring容器里的一个Java实例定义Bean时通常需要指定两个属性。
Id:确定该Bean的唯一标识符,容器对Bean管理、访问、以及该Bean的依赖关系,都通过该属性完成。Bean的id属性在Spring容器中是唯一的。
Class:指定该Bean的具体实现类。注意这里不能使接口。通常情况下,Spring会直接使用new关键字创建该Bean的实例,因此,这里必须提供Bean实现类的类名。
Spring容器集中管理Bean的实例化,Bean实例可以通过BeanFactory的getBean(String beanid)方法得到。BeanFactory是一个工厂,程序只需要获取BeanFactory引用,即可获得Spring容器管理全部实例的引用。程序不需要与具体实例的实现过程耦合。大部分Java EE应用里,应用在启动时,会自动创建Spring容器,组件之间直接以依赖注入的方式耦合,甚至无须主动访问Spring容器本身。
当我们在配置文件中通过<bean id=”xxxx” class=”xx.XxClass”/>方法配置一个Bean时,这样就需要该Bean实现类中必须有一个无参构造器。
二、容器中Bean的作用域
当通过Spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域。
Spring支持5种作用域:
Singleton:单例模式。在整个SpringIoC容器中,使用singleton定义的Bean将只有一个实例,这是默认的配置。
Prototype:原型模式。每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例。
request:对于每次HTTP请求,使用request定义的Bean都将产生一个新的实例,即每次HTTP请求都会产生不同的Bean实例。当然只有在WEB应用中使用Spring时,该作用域才真正有效。
session:对于每次HTTPSession,使用session定义的Bean都将产生一个新的实例时,即每次HTTP Session都将产生不同的Bean实例。同HTTP一样,只有在WEB应用才会有效。
global session:每个全局的HTTPSession对应一个Bean实例。仅在portlet Context的时候才有效。
比较常用的singleton和prototype。如果一个Bean实例被设置为singleton,那么每次请求该Bean时都会获得相同的实例。容器负责跟踪Bean实例的状态,负责维护Bean实例的生命周期行为。如果一个Bean实例被设置为prototype,那么每次请求该di的Bean,Spring都会创建一个新的Bean实例返回给程序,在这种情况下,Spring容器仅仅使用new关键字创建Bean实例,一旦创建成功,容器将不会再跟踪实例,也不会维护Bean实例的状态。
如果我们不指定Bean的作用域,则Spring会默认使用singleton作用域。设置Bean的作用域是通过scope属性来指定。可以接受Singleton、prototype、request、session、global session 5个值。
最新文章
- Access restriction: The type &#39;FileURLConnection&#39; is not API
- java学习之接口、多态和内部类
- 前端自动构建工具@gulp入门
- 获取DataTable选择第一行某一列值
- Sales_item
- 面试题_31_to_47_JVM 底层与GC(Garbage Collection)的面试问题
- Tomcat线程池,更符合大家想象的可扩展线程池
- Google maps API开发(二)(转)
- Linux下查看显示器输出状态以及修改显示器工作模式(复制 or 扩展)
- csu1306: Manor
- POJ 2773 Happy 2006(欧几里德算法)
- .net core版 文件上传/ 支持批量上传,拖拽以及预览,bootstrap fileinput上传文件
- Code::Blocks出现64-Bit mode not compled in解决方法
- Calendar 类 案例 和 闰年的计算
- This project is not a myeclipse hibernate project . Assuming Hibernate 3 capabilities configuration editor
- Laravel 中使用支付宝、银联支付、微信支付进行支付
- 【Codeforces 815C】Karen and Supermarket
- Servlet----------在使用doGet()和doPost()是如何处理中文乱码
- 外键的约束(Mysql、PostgreSQL)
- 44(function pointer 2)
热门文章
- flask 实现最简单的登录功能
- ESXi6.5上的Ubuntu虚机在远程SSH时宕机
- Linux 常用操作和命令
- TeslaManage 运行日志
- Java 枚举使用总结
- 怎么又出错了?盘点java中最容易出现的错误
- java-统计一段句子中各单词出现的次数
- Word2016经常复制公式卡死无响应如何解决?
- This view is not constrained, it only has designtime positions, so it will jump to (0,0) unless you
- Callable+Future