Spring Bean 相关
BeanDefinition
概念
BeanDefinition 是Spring Framework 中定义Bean 的配置元信息接口,包含:
- Bean的类名
- Bean 行为配置元素,如作用域、自动绑定的模式,生命周期回调等
- 其他Bean 引用,又可称作合作者(collaborators)或者依赖(dependencies)
- 配置设置,比如Bean 属性(Properties)
BeanDefinition 创建方式
- 通过BeanDefinitionBuilder
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(User.class);
- 通过AbstractBeanDefinition 以及派生类
Spring Bean 注册
- xml 配置元信息
<bean name=”...” ... /> - Java 注解配置元信息
@Bean
@Component
@Import
@Import(AnnotationBeanDefinitionDemoTest.Config.class)
public class AnnotationBeanDefinitionDemoTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
applicationContext.register(AnnotationBeanDefinitionDemoTest.class);
applicationContext.refresh();
System.out.println(applicationContext.getBeansOfType(User.class));
System.out.println(applicationContext.getBeansOfType(Config.class));
applicationContext.close();
}
// 2. 通过 @Component 方式
@Component // 定义当前类作为 Spring Bean(组件)
public static class Config {
// 1. 通过 @Bean 方式定义
/**
* 通过 Java 注解的方式,定义了一个 Bean
*/
@Bean(name = {"userTest"})
public User user() {
User user = new User();
user.setId(1L);
user.setName("userTest");
return user;
}
}
}
-
Java API 配置元信息
1.命名方式:BeanDefinitionRegistry#registerBeanDefinition(String,BeanDefinition)
2.非命名方式:
BeanDefinitionReaderUtils#registerWithGeneratedName(AbstractBeanDefinition,Be anDefinitionRegistry)
/** * 通过命名方式注册Bean * @param registry * @param beanName */ public static void registerUserBeanDefinition(BeanDefinitionRegistry registry, String beanName) { BeanDefinitionBuilder beanDefinitionBuilder = genericBeanDefinition(User.class); beanDefinitionBuilder .addPropertyValue("id", 2L) .addPropertyValue("name", "小马哥"); // 判断如果 beanName 参数存在时 if (StringUtils.hasText(beanName)) { // 注册 BeanDefinition registry.registerBeanDefinition(beanName, beanDefinitionBuilder.getBeanDefinition()); } else { // 非命名 Bean 注册方法 BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinitionBuilder.getBeanDefinition(), registry); } } /*** * 通过非命名方式注册Bean * @param registry */ public static void registerUserBeanDefinition(BeanDefinitionRegistry registry) { registerUserBeanDefinition(registry, null); }
3.配置类方式:
AnnotatedBeanDefinitionReader#register(Class...)
Spring Bean实例化
常规方式
- 通过构造器(配置元信息: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)
Spring Bean 初始化
- @PostConstruct 标注方法
- 实现InitializingBean 接口的afterPropertiesSet() 方法
- 自定义初始化方法
1.XML 配置:<bean init-method=”init” ... />
2.Java 注解:@Bean(initMethod=”init”)
3.Java API:AbstractBeanDefinition#setInitMethodName(String)
初始化的顺序 : @PostConstruct -> afterPropertiesSet() 方法 -> initMethod()
初始化中 @lazy的作用
默认为true,
当设置 为false时候,非延迟初始化在 Spring 应用上下文启动完成后,被初始化。
Bean 销毁
- @PreDestroy 标注方法
- 实现DisposableBean 接口的destroy() 方法
- 自定义销毁方法
1.XML 配置:<bean destroy=”destroy” ... />
2.Java 注解:@Bean(destroy=”destroy”)
3.Java API:AbstractBeanDefinition#setDestroyMethodName(String)
销毁的顺序: @PreDestroy -> DisposableBean 的destroy() 方法 -> 自定义的方法 destroyMethod()