SpringBean相關(guān)

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()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市箫攀,隨后出現(xiàn)的幾起案子肠牲,更是在濱河造成了極大的恐慌,老刑警劉巖靴跛,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缀雳,死亡現(xiàn)場離奇詭異,居然都是意外死亡梢睛,警方通過查閱死者的電腦和手機肥印,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門严拒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人竖独,你說我怎么就攤上這事裤唠。” “怎么了莹痢?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵种蘸,是天一觀的道長。 經(jīng)常有香客問我竞膳,道長航瞭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任坦辟,我火速辦了婚禮刊侯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘锉走。我一直安慰自己滨彻,他們只是感情好,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布挪蹭。 她就那樣靜靜地躺著亭饵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪梁厉。 梳的紋絲不亂的頭發(fā)上辜羊,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天,我揣著相機與錄音词顾,去河邊找鬼八秃。 笑死,一個胖子當著我的面吹牛肉盹,可吹牛的內(nèi)容都是我干的昔驱。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼垮媒,長吁一口氣:“原來是場噩夢啊……” “哼舍悯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起睡雇,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤萌衬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后它抱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秕豫,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了混移。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片祠墅。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖歌径,靈堂內(nèi)的尸體忽然破棺而出毁嗦,到底是詐尸還是另有隱情,我是刑警寧澤回铛,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布狗准,位于F島的核電站,受9級特大地震影響茵肃,放射性物質(zhì)發(fā)生泄漏腔长。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一验残、第九天 我趴在偏房一處隱蔽的房頂上張望捞附。 院中可真熱鬧,春花似錦您没、人聲如沸鸟召。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽药版。三九已至辑舷,卻和暖如春喻犁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背何缓。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工肢础, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人碌廓。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓传轰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親谷婆。 傳聞我的和親對象是個殘疾皇子慨蛙,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容