Spring Bean深入剖析(三)

前言

Spring是分層的 Java SE/EE應(yīng)用full- stack輕量級(jí)開源框架祭玉,以IoC(Inversion of Control:反轉(zhuǎn)控制)和AOP( Aspect Oriented Programming:面向切面編程)為內(nèi)核,提供了展現(xiàn)層 Spring MVC和持久層 Spring JDBC以及業(yè)務(wù)層事務(wù)管理等眾多的企業(yè)級(jí)應(yīng)用技術(shù)手销,還能整合開源世界眾多著名的第三方框架和類庫,逐漸成為使用最多的 Java EE企業(yè)應(yīng)用開源框架锣尉。

Spring Bean的初始化

Bean初始化(Initialization)

  • @PostConstruct標(biāo)準(zhǔn)方法
public interface UserFactory {
    default User createUser(){
        return User.createUser();
    }
}
public class DefaultUserFactroy implements UserFactory {
    //1.基于@PostConstruct注解
    @PostConstruct
    public void init(){
        System.out.println("@PostConstruct: UserFactroy 初始化中蹈胡。耙旦。。找都。");
    }
}
@Configuration
public class BeanInitalizationDemo {
    public static void main(String[] args) {
        //創(chuàng)建BeanFactory容器
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
        //注冊Configuration class(配置類)
        applicationContext.register(BeanInitalizationDemo.class);
        //啟動(dòng)Spring應(yīng)用上下文
        applicationContext.refresh();
        //依賴查找UserFactory
        UserFactory userFactory = applicationContext.getBean(UserFactory.class);
        //關(guān)閉Spring應(yīng)用上下文
        applicationContext.close();
    }
    @Bean
    public UserFactory userFactory(){
        return new DefaultUserFactroy();
    }
}
  • 實(shí)現(xiàn)InitialingBean接口的afterPropertiesSet()方法
public class DefaultUserFactroy implements UserFactory, InitializingBean {
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("InitializingBean#afterPropertiesSet(): UserFactroy 初始化中唇辨。。能耻。赏枚。");
    }
}
  • 自定義初始化方法
    • XML配置:<bean init-method="init" .../>
    • Java注解:@Bean(initMethod=“init”)
        @Bean(initMethod = "initUserFactory")
        public UserFactory userFactory(){
            return new DefaultUserFactroy();
        }
    
    • Java API:AbstractBeanDefinition#setInitMethodName(String)
      輸出順序?yàn)椋?/strong>@PostConstruct->InitializingBean->自定義的initUserFactory

Spring Bean的延遲初始化

Bean延遲初始化(Initialization)
非延遲初始化在Spring應(yīng)用上下文啟動(dòng)完成后亡驰,被初始化;延遲初始化在Bean被調(diào)用的時(shí)候饿幅,進(jìn)行初始化隐解;

  • XML配置:<bean lazy-init="true" .../>
  • Java注解:@Lazy(true)
    @Bean(initMethod = "initUserFactory")
    @Lazy
    public UserFactory userFactory(){
        return new DefaultUserFactroy();
    }

Spring Bean的銷毀

Bean銷毀(destory())

  • @PreDestory標(biāo)注方法
    @PreDestroy
    public void perDestroy(){
        System.out.println("@PreDestroy: UserFactroy 銷毀中。诫睬。煞茫。。");
    }
    
  • 實(shí)現(xiàn)DisposableBean接口的destory方法
    public class DefaultUserFactroy implements UserFactory, DisposableBean {
        @Override
        public void destroy() throws Exception {
            System.out.println("DisposableBean#destroy(): UserFactroy 銷毀中摄凡。续徽。。亲澡。");
        }
    } 
    
  • 自定義銷毀方法
    • XML配置:<bean destroy="destroy" .../>
    • Java注解:@Bean(destroy="destory")
          public void doDestroy(){
              System.out.println("自定義doDestroy(): UserFactroy 銷毀中钦扭。。床绪。客情。");
          }
          @Bean(initMethod = "initUserFactory",destroyMethod = "doDestroy")
          public UserFactory userFactory(){
              return new DefaultUserFactroy();
          }
      
    • Java API: AbstractBeanDefinition#setDestroyMethodName(String)

輸出順序?yàn)椋?/strong>@PreDestory->DisposableBean->自定義的doDestroy
垃圾回收(GC())

  • 關(guān)閉spring容器(應(yīng)用上下文)
  • 執(zhí)行GC
  • Spring Bean覆蓋的finalize()方法 被回調(diào)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市癞己,隨后出現(xiàn)的幾起案子膀斋,更是在濱河造成了極大的恐慌,老刑警劉巖痹雅,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仰担,死亡現(xiàn)場離奇詭異,居然都是意外死亡绩社,警方通過查閱死者的電腦和手機(jī)摔蓝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來愉耙,“玉大人贮尉,你說我怎么就攤上這事∑友兀” “怎么了猜谚?”我有些...
    開封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長悯仙。 經(jīng)常有香客問我龄毡,道長,這世上最難降的妖魔是什么锡垄? 我笑而不...
    開封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任沦零,我火速辦了婚禮,結(jié)果婚禮上货岭,老公的妹妹穿的比我還像新娘路操。我一直安慰自己疾渴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開白布屯仗。 她就那樣靜靜地躺著搞坝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪魁袜。 梳的紋絲不亂的頭發(fā)上桩撮,一...
    開封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音峰弹,去河邊找鬼店量。 笑死,一個(gè)胖子當(dāng)著我的面吹牛鞠呈,可吹牛的內(nèi)容都是我干的融师。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼蚁吝,長吁一口氣:“原來是場噩夢啊……” “哼旱爆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起窘茁,我...
    開封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤怀伦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后庙曙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體空镜,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年捌朴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片张抄。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡砂蔽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出署惯,到底是詐尸還是另有隱情左驾,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布极谊,位于F島的核電站诡右,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏轻猖。R本人自食惡果不足惜帆吻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望咙边。 院中可真熱鬧猜煮,春花似錦次员、人聲如沸耻讽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽勘究。三九已至愕撰,卻和暖如春刹衫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背搞挣。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來泰國打工绪妹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人柿究。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓邮旷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蝇摸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子婶肩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

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