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注解式配置:
ConfigurationBeanDependsOnPrimaryLazyImportImportResourceValue
RequiredAutowiredInjectQualifierResourcePostConstructPreDestroyServiceRepository - 支持加了
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 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 上学时,老师总说:不会你就问,但多数时候都不知道要问什么! 你总会在小傅哥的文章前言 ...
随机推荐
- 《深入理解java虚拟机》笔记(1)运行时数据区域
1.Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来. 2.运行时数据区域划分 java虚拟机在执行java程序的过程中会把它所管理的内存划 ...
- PS基础知识学习
PS学习视频(全) https://ke.qq.com/webcourse/index.html#course_id=28554&term_id=100014572&taid=1349 ...
- shell批量转换iOS和Android图标
icon_ios.sh #!/bin/sh convert icon-1024.png -resize 180x180 icon-180@3x.png convert icon-1024.png -r ...
- 找出指定文件夹中的所有以txt结尾的文件,包括所有嵌套的子文件夹
# coding:utf-8 import os, re for i in os.walk('d:'+os.sep): for txt in i[2]: try: ...
- UVA - 658 It's not a Bug, it's a Feature! (隐式图的最短路,位运算)
隐式的图搜索,存不下边,所以只有枚举转移就行了,因为bug的存在状态可以用二进制表示,转移的时候判断合法可以用位运算优化, 二进制pre[i][0]表示可以出现的bug,那么u&pre[i][ ...
- PLSQL练习-数据共享与整合技术
1.编写一个存储过程,根据输入的工作类型,输出该工作的平均工资. 命令如下: 创建存储过程: create or replace procedure avgsal(v_job in emp.job%t ...
- WPF中窗体调用窗体
在WPF中有时候我们需要在一个窗体中去调用另外的一个窗体,下面给出调用方法. 下面实现在MainWindow中通过点击一个按钮调用另外的一个窗口. 首先创建你要调用的另外一个窗口:点击最上面的项目 ...
- Easier Done Than Said?(应用到的知识)
memset(b,0,sizeof(b)) 对于大块儿内存的分配,例如int arr[100];定义了数组arr,包含100个元素,如果你写成int arr[100]=0;想将数组全部内容初始化为0, ...
- 五. web开发基础
一.HTML 二.CSS 三.JavaScript 四.web框架 1.web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端 ...
- ThinkPHP项目怎么运行?
1.下载ThinkPHP项目 2.安装核心框架framework 3.配置集成开发环境:wamp或者xampp或者phpStudy