Bean的名称
每个 Bean 拥有一个或多个标识符(identifiers),这些标识符在 Bean 所在的容器必须是唯一的。通常一个 Bean 仅有一个标识符,如果需要额外的,可考虑使用别名(Alias)来扩充。
在基于 XML 的配置元信息中,开发人员可用 id 或者 name 属性来规定 Bean 的 标识符。通常Bean 的标识符由字母组成,允许出现特殊字符。如果要想引入Bean的别名的话,可在 name 属性使用半角逗号(“,”)或分号(”;”) 来间隔。
Bean的id或name属性并非必须制定,如果留空的话,容器会为 Bean 自动生成一个唯一的名称。Bean的命名尽管没有限制,不过官方建议采用驼峰的方式,更符合 Java 的命名约定。
Bean 名称生成器
由 Spring Framework 2.0.3 引入,框架內建两种实现:
DefaultBeanNameGenerator:默认通用 BeanNameGenerator 实现
AnnotationBeanNameGenerator:基于注解扫描的 BeanNameGenerator 实现,起始于 Spring
Framework 2.5,关联的官方文档:
Bean 注册
XML 配置元信息
<bean name=”...” ... />
• Java 注解配置元信息
• @Bean
• @Component
• @Import
Java API 配置元信息
• 命名方式:BeanDefinitionRegistry#registerBeanDefinition(String,BeanDefinition)
• 非命名方式:
BeanDefinitionReaderUtils#registerWithGeneratedName(AbstractBeanDefinition,BeanDe
finitionRegistry)
• 配置类方式:AnnotatedBeanDefinitionReader#register(Class…)
Version:0.9 StartHTML:0000000105 EndHTML:0000000799 StartFragment:0000000141 EndFragment:0000000759
外部单例对象注册
• Java API 配置元信息
• SingletonBeanRegistry#registerSingleton
实例化
• 常规方式
• 通过构造器(配置元信息:XML、Java 注解和 Java API )
• 通过静态工厂方法(配置元信息:XML 和 Java API )
• 通过 Bean 工厂方法(配置元信息:XML和 Java API )
• 通过 FactoryBean(配置元信息:XML、Java 注解和 Java API )
• 特殊方式
• 通过 ServiceLoaderFactoryBean(配置元信息:XML、Java 注解和 Java API )
• 通过 AutowireCapableBeanFactory#createBean(java.lang.Class, int, boolean)
• 通过 BeanDefinitionRegistry#registerBeanDefinition(String,BeanDefinition)
初始化
Bean 初始化(Initialization)
• @PostConstruct 标注方法
• 实现 InitializingBean 接口的 afterPropertiesSet() 方法
• 自定义初始化方法
• XML 配置:
• Java 注解:@Bean(initMethod=”init”)
• Java API:AbstractBeanDefinition#setInitMethodName(String)
延迟初始化
Bean 延迟初始化(Lazy Initialization)
• XML 配置:
• Java 注解:@Lazy(true)
Bean 销毁(Destroy)
• @PreDestroy 标注方法
• 实现 DisposableBean 接口的 destroy() 方法
• 自定义销毁方法
• XML 配置:
• Java 注解:@Bean(destroy=”destroy”)
• Java API:AbstractBeanDefinition#setDestroyMethodName(String)
Bean 垃圾回收(GC)
- 关闭 Spring 容器(应用上下文)
2. 执行 GC
3. Spring Bean 覆盖的 finalize() 方法被回调