Spring Bean 相關(guān)
BeanDefinition
概念
BeanDefinition 是Spring Framework 中定義Bean 的配置元信息接口耻姥,包含:
- Bean的類名
- Bean 行為配置元素,如作用域有咨、自動綁定的模式琐簇,生命周期回調(diào)等
- 其他Bean 引用,又可稱作合作者(collaborators)或者依賴(dependencies)
- 配置設(shè)置座享,比如Bean 屬性(Properties)
BeanDefinition 創(chuàng)建方式
- 通過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 參數(shù)存在時 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實例化
常規(guī)方式
- 通過構(gòu)造器(配置元信息:XML、Java 注解和Java API )
- 通過靜態(tài)工廠方法(配置元信息: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 標注方法
- 實現(xiàn)InitializingBean 接口的afterPropertiesSet() 方法
- 自定義初始化方法
1.XML 配置:<bean init-method=”init” ... />
2.Java 注解:@Bean(initMethod=”init”)
3.Java API:AbstractBeanDefinition#setInitMethodName(String)
初始化的順序 : @PostConstruct -> afterPropertiesSet() 方法 -> initMethod()
初始化中 @lazy的作用
默認為true,
當設(shè)置 為false時候,非延遲初始化在 Spring 應(yīng)用上下文啟動完成后淳衙,被初始化蘑秽。
Bean 銷毀
- @PreDestroy 標注方法
- 實現(xiàn)DisposableBean 接口的destroy() 方法
- 自定義銷毀方法
1.XML 配置:<bean destroy=”destroy” ... />
2.Java 注解:@Bean(destroy=”destroy”)
3.Java API:AbstractBeanDefinition#setDestroyMethodName(String)
銷毀的順序: @PreDestroy -> DisposableBean 的destroy() 方法 -> 自定義的方法 destroyMethod()