SpringBean相關(guān)

Spring Bean 相關(guān)

BeanDefinition

概念

BeanDefinition 是Spring Framework 中定義Bean 的配置元信息接口,包含:

  • Bean的類名
  • Bean 行為配置元素,如作用域、自動(dòng)綁定的模式,生命周期回調(diào)等
  • 其他Bean 引用,又可稱作合作者(collaborators)或者依賴(dependencies)
  • 配置設(shè)置,比如Bean 屬性(Properties)
BeanDefinition 創(chuàng)建方式
  • 通過BeanDefinitionBuilder
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(User.class);
  • 通過AbstractBeanDefinition 以及派生類
Spring Bean 注冊(cè)
  • 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 // 定義當(dāng)前類作為 Spring Bean(組件)
    public static class Config {

        // 1. 通過 @Bean 方式定義

        /**
         * 通過 Java 注解的方式,定義了一個(gè) 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)
    
     /**
     * 通過命名方式注冊(cè)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ù)存在時(shí)
        if (StringUtils.hasText(beanName)) {
            // 注冊(cè) BeanDefinition
            registry.registerBeanDefinition(beanName, beanDefinitionBuilder.getBeanDefinition());
        } else {
            // 非命名 Bean 注冊(cè)方法
            BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinitionBuilder.getBeanDefinition(), registry);
        }
    }
    
    /***
     * 通過非命名方式注冊(cè)Bean
     * @param registry
     */
    public static void registerUserBeanDefinition(BeanDefinitionRegistry registry) {
        registerUserBeanDefinition(registry, null);
    }
    

    3.配置類方式:

    AnnotatedBeanDefinitionReader#register(Class...)
    
Spring Bean實(shí)例化
常規(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 標(biāo)注方法
  • 實(shí)現(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的作用

默認(rèn)為true,
當(dāng)設(shè)置 為false時(shí)候,非延遲初始化在 Spring 應(yīng)用上下文啟動(dòng)完成后,被初始化。

Bean 銷毀
  • @PreDestroy 標(biāo)注方法
  • 實(shí)現(xiàn)DisposableBean 接口的destroy() 方法
  • 自定義銷毀方法
    1.XML 配置:<bean destroy=”destroy” ... />
    2.Java 注解:@Bean(destroy=”destroy”)
    3.Java API:AbstractBeanDefinition#setDestroyMethodName(String)
    銷毀的順序: @PreDestroy -> DisposableBean 的destroy() 方法 -> 自定義的方法 destroyMethod()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容