bean容器能力
bean容器能力
对bean容器的最简单的述求
- 能生产bean
- 能注入组装bean: 字段,构造函数
spring bean容器(3.0版本)的能力列表
- 能生产bean
- 能注入组装bean:字段,构造函数的参数(可以按参数类型注入-type,也可以按参数位置注入-index,也可以按参数名字注入),调用指定方法(lookup-method)
- 能支持生产bean的scope:单例,多例,web请求,web session,ThreadLocal级等
- 能引入properties文件作为注入源
- 能支持特殊值注入,诸如null,List,Map,Properties等
- 能在进行注入之前进行值转换,比如数组转成集合,字符串转成数字,字符串转换成resource
需要梳理 能支持哪些转换?
org.springframework.core.convert.converter.Converter<S, T>
文档参见 - 能在进行注入之前进行待条件的值转换,即在满足条件时再触发转换
org.springframework.core.convert.converter.ConditionalGenericConverter
文档参见 - 支持在进行注入之前进行值格式化,同时支持注解 @NumberFormat @DateTimeFormat等
- 支持在进行注入之前进行对值校验, 遵循JSR-303
- 能支持 用户定义生产bean 的工厂
- 能将bean容器与struts,junit等第三方框架对接,作为其bean的产生实现方式
- 容器对接多种规范的容器,诸如servlet容器等
- 支持bean查找,属性字段值设置与获取,方法调用,集合元素按index获取,逻辑数学运算,命名变量等能力的表达式(JSP 2.1 specification的一个扩展)
- 支持 字段值 来自于表达式
private @Value("#{jdbcProperties.url}") String jdbcUrl;
- 兼容 standard JDK PropertyEditors
- 支持字段值转换的自定义实现的SPI
- 支持生产bean时,触发其方法调用,并可以用注解结合表达式编写声明参数值来源
@Value("#{systemProperties.databaseName}")
public void setDatabaseName(String dbName) { … }
- 支持bean metadata注解式配置:
Configuration
Bean
DependsOn
Primary
Lazy
Import
ImportResource
Value
Required
Autowired
Inject
Qualifier
Resource
PostConstruct
PreDestroy
Service
Repository
- 支持加了
Configuration
注解的java类作为容器的描述
ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
- 支持容器的描述文件的import能力,比如在一个application-1的xml中import另一个application-2的xml文件
- 支持bean的name的别名,多系统协同时可以使用,使得bean的命名清晰
- 支持用类的静态方法作为生产该类bean的工厂行为。
- 支持用指定类的指定静态方法生产具体bean的行为
参见文档 - 支持声明式properties注入
jdbc.driver.className=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mydb - 用idref或者ref标签配合local使用,可以达到仅使用本容器中的bean进行注入。
As such, using the local variant is the best choice (in order to know about errors as early as possible) if the target bean is in the same XML file.
- 用idref或者ref标签配合parent使用,可以达到仅使用父容器中的bean进行注入
- 支持在注入时,声明所需要的属性,类似内部类,此处声明的实例是多实例的且不会被其他人ref(因为没有id和name)
<bean id="outer" class="...">
<!-- instead of using a reference to a target bean, simply define the target bean inline -->
<property name="target">
<bean class="com.example.Person"> <!-- this is the inner bean -->
<property name="name" value="Fiona Apple"/>
<property name="age" value="25"/>
</bean>
</property>
</bean>
支持复合属性注入,如对bean的属性字段的子字段进行注入,比如需要主要实例a的字段b是B类型,Bclass有个c字段,那么可以注入a时直接给b的c字段注入。
支持显示声明(描述) bean的依赖,比如a depends-on b,那么在a构造前 会先把b构造好。主要用于一些静态初始化等,诸如数据库的驱动注册。
对于单例bean,支持可选的初始化阶段:容器启动时和bean被用到时。可以用lazy-init标识一个单例bean在被用到时再初始化bean。默认行为是容器启动时初始化bean,因为这样要是缺了什么bean就能立即通过错误知道。
支持整个容器级别的默认延迟初始化行为设置
支持按name,按type自动装配
支持bean和beans粒度的自动装配关闭autowire-candidate
支持bean的普通方法在调用时 用 replaced-method替换入参值 。 待做个demo。
支持自定义容器中bean的生命周期
org.springframework.beans.factory.config.Scope
支持容器生命周期的回调动作插入 afterPropertiesSet(容器注入完成后的回调) init-method(bean的初始化方法) destroy-method(bean销毁时的方法) 容器关闭hook注册 支持bean和beans级别设置
按层级(inheritance)描述bean容器中bean定义。bean a是父实例是抽象的,bean b是子实例,可以将其parent指向bean a,使用bean a的所有配置信息,包括注入的属性字段等等,也可以覆盖字段。而且父实例bean a可以不用指向任何class,只需要设置其abstract为true即可。
bean容器自身支持扩展点 BeanPostProcessor(postProcessBeforeInitialization,postProcessAfterInitialization)
这个值得一看,自身就有很多实现。
BeanFactoryPostProcessor(postProcessBeanFactory)支持bean的id分类
自动装配的component-scan扫描支持include和exclude的filter
支持国际化能力 ResourceBundleMessageSource
容器内建事件支持 ContextRefreshedEvent ContextStartedEvent ContextStoppedEvent ContextClosedEvent RequestHandledEvent
自定义容器事件支持ApplicationEvent
spring DM能力列表
- OSGI bundle的三种状态支持 installed, resolved, starting,stopping,uninstalled or active(OSGI能力)
- 隔离业务逻辑到模块中,在运行期强制模块化(OSGI能力)
- 多版本模块或者库并存(OSGI能力)
- 运行时,动态安装升级与卸载(OSGI能力)
- spring dm应用结构示意图
- 用osgi:service 标签支持接口暴露
- 定制支持OSGI的IO能力
- 支持bundle级别的scope
- 用service与interfaces标签配合使用 将一个bean注册为多个接口的实现
- registration-listener支持注册监听器 也有去注册监听器
- reference标签支持接口引用
bean容器能力的更多相关文章
- JavaEE Tutorials (6) - 使用嵌入式企业bean容器
6.1嵌入式企业bean容器概述826.2开发嵌入式企业bean应用82 6.2.1运行嵌入式应用83 6.2.2创建企业bean容器83 6.2.3查找会话bean引用84 6.2.4关闭企业bea ...
- Ioc及Bean容器(三)
专题一 IoC 接口及面向接口编程 什么是 IoC Spring 的Bean配置 Bean 的初始化 Spring 的常用注入方式 接口 用于沟通的中介物的抽象化 实体把自己提供给外界的一种抽象化说明 ...
- Spring 学习——Bean容器
Bean容器初始化 基础 org.springframework.beans org.springframework.context BeanFactory提供配置结构和基本功能,加载并初始化Bean ...
- STL容器能力一览表和各个容器操作函数异常保证
STL容器能力一览表 Vector Deque List Set Multiset map Multimap 典型内部 结构 dynamic array Array of arrays Doubly ...
- Spring学习二----------IOC及Bean容器
© 版权声明:本文为博主原创文章,转载请注明出处 接口 用于沟通的中介物的抽象化 实体把自己提供给外界的一种抽象化说明,用以由内部操作分离出外部沟通方法,使其能被修改内部而不影响外界其他实体与其交互的 ...
- 手写web框架之实现Bean容器
实现Bean容器 使用ClassHelper可以获取所加载的类,但无法通过类来实例化对象,因此我们需要提供一个反射工具类,让它封装java反射相关的API,对外提供更好用的工具方法.将该类命名为 ...
- Spring——IOC与Bean容器
[IOC] (1)IOC:控制反转,控制权的转移,应用程序本身不负责依赖对象的创建和维护,而是由外部容器负责创建和维护.也就是说由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中 (2)DI: ...
- Bean容器的初始化
Bean容器的初始化
- 《Spring 手撸专栏》第 2 章:小试牛刀(让新手能懂),实现一个简单的Bean容器
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 上学时,老师总说:不会你就问,但多数时候都不知道要问什么! 你总会在小傅哥的文章前言 ...
随机推荐
- 使用SSL配置Nginx反向代理的简单指南
反向代理是一个服务器,它接收通过Web发出的请求,即http和https,然后将它们发送到后端服务器(或服务器).后端服务器可以是单个或一组应用服务器,如Tomcat,wildfly或Jenkins等 ...
- JavaScript 获取浏览器版本
//获取IE版本function GetIEVersions(){ var iejson={ isIE:false,safariVersion:0 }; var ua = navigator.user ...
- 极简的css浮动窗口
<!doctype html> <html> <head> <meta charset="utf-8"> <meta http ...
- ubuntu键盘映射
在sublime下开发习惯把CapsLock和Shift间交换,windows下有很多软件可以修改键盘映射,在ubuntu下可以是哦用xmodmap命令,使用方法如下: 在自己用户的home目录下新建 ...
- PLSQL连接Oracle64监听和服务的配置!
前言: 这里不会涉及到太多关于版本问题的解决,只是简单提一下基本的监听和服务配置问题的解决,让你可以快速的用PLSQL连接上你自己创建的Oracle数据库(这里示例数据库名为ORCL); 版本问题: ...
- CF1072C Cram Time
思路: 首先二分找到使x * (x + 1) / 2 <= a + b最大的x,然后令p = min(a, b), q = max(a, b),按照x,x - 1, ..., 1的顺序选取数字把 ...
- CommonJS与ES6、AMD、CMD比较
Javascript,javascript是一种脚本编程语言,有自己独立的语法与语义,没有javascript,也就没有其他的那些概念了. 关于ES6,可直接理解为javascript的增强版(增加了 ...
- Apache Kafka框架学习
背景介绍 消息队列的比较 kafka框架介绍 术语解释 文件存储 可靠性保证 高吞吐量实现 负载均衡 应用场景 背景介绍: kafka是由Apache软件基金会维护的一个开源流处理平台,由scala和 ...
- springMVC 中 ajax get 请求和 post 请求的坑以及参数传递
1, ajax 请求 无论为 post ,或者 get ,url中带有?形式的参数,后台都能以String类型变量接收,变量名称和参数名称必须一致 前台ajax: $.ajax( "prod ...
- POJ 1739 Tony's Tour (插头DP,轮廓线DP)
题意:给一个n*m的矩阵,其中#是障碍格子,其他则是必走的格子,问从左下角的格子走到右下角的格子有多少种方式. 思路: 注意有可能答案是0,就是障碍格子阻挡住了去路. 插头DP有两种比较常见的表示连通 ...