1. 程式人生 > >通過Spring @PostConstruct 和 @PreDestroy 方法 實現初始化和銷燬bean之前進行的操作

通過Spring @PostConstruct 和 @PreDestroy 方法 實現初始化和銷燬bean之前進行的操作

關於在spring 容器初始化 bean 和銷燬前所做的操作定義方式有三種:

第一種:通過@PostConstruct 和 @PreDestroy 方法 實現初始化和銷燬bean之前進行的操作

第二種是:通過 在xml中定義init-method 和 destory-method方法

第三種是: 通過bean實現InitializingBean和 DisposableBean介面
下面演示通過 @PostConstruct 和 @PreDestory

1:定義相關的實現類:

package com.myapp.core.annotation.init;

import javax.annotation.PostConstruct;
import
javax.annotation.PreDestroy; public class PersonService { private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } @PostConstruct public void init(){ System.out.println("I'm init method using @PostConstrut...."
+message); } @PreDestroy public void dostory(){ System.out.println("I'm destory method using @PreDestroy....."+message); } }

2:定義相關的配置檔案:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<!-- <context:component-scan base-package="com.myapp.core.jsr330"/> --> <context:annotation-config /> <bean id="personService" class="com.myapp.core.annotation.init.PersonService"> <property name="message" value="123"></property> </bean> </beans>

其中告訴spring 容器採用註解配置:掃描註解配置;

測試類:

package com.myapp.core.annotation.init;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainTest {

    public static void main(String[] args) {

        ApplicationContext  context = new ClassPathXmlApplicationContext("resource/annotation.xml");

        PersonService   personService  =  (PersonService)context.getBean("personService");

        personService.dostory();
    }

}

測試結果:

I’m init method using @PostConstrut….123
I’m destory method using @PreDestroy…..123

其中也可以通過申明載入org.springframework.context.annotation.CommonAnnotationBeanPostProcessor

類來告訴Spring容器採用的 常用 註解配置的方式:

只需要修改配置檔案為:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd">

<!-- <context:component-scan  base-package="com.myapp.core.jsr330"/> -->

<!-- <context:annotation-config /> -->


<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />
<bean id="personService" class="com.myapp.core.annotation.init.PersonService">
          <property name="message" value="123"></property>
</bean>



</beans>

第二種是:通過 在xml中定義init-method 和 destory-method方法
在xml中配置 init-method和 destory-method方法

只是定義spring 容器在初始化bean 和容器銷燬之前的所做的操作

基於xml的配置只是一種方式:

直接上xml中配置檔案:


   <bean id="personService" class="com.myapp.core.beanscope.PersonService" scope="singleton"  init-method="init"  destroy-method="cleanUp">

   </bean>

定義PersonService類:

package com.myapp.core.beanscope;


public class PersonService  {
   private String  message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }



    public void init(){
        System.out.println("init");
    }
    //  how  validate the  destory method is  a question
    public void  cleanUp(){
        System.out.println("cleanUp");
    }
}

相應的測試類:

package com.myapp.core.beanscope;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainTest {
  public static void main(String[] args) {

      AbstractApplicationContext  context =new  ClassPathXmlApplicationContext("SpringBeans.xml");

    PersonService  person = (PersonService)context.getBean("personService");

    person.setMessage("hello  spring");

    PersonService  person_new = (PersonService)context.getBean("personService");

    System.out.println(person.getMessage());
    System.out.println(person_new.getMessage());
    context.registerShutdownHook();


}
} 

測試結果:

init
hello spring
hello spring
cleanUp

可以看出 init 方法和 clean up方法都已經執行了。
context.registerShutdownHook(); 是一個鉤子方法,當jvm關閉退出的時候會呼叫這個鉤子方法,在設計模式之 模板模式中 通過在抽象類中定義這樣的鉤子方法由實現類進行實現,這裡的實現類是AbstractApplicationContext,這是spring 容器優雅關閉的方法。

第三種是: 通過bean實現InitializingBean和 DisposableBean介面
1:定義相應類實現InitializingBean ,DisposableBean 介面

package com.myapp.core.annotation.init;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

public class PersonService  implements InitializingBean,DisposableBean{

    private String  message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    @Override
    public void destroy() throws Exception {
        // TODO Auto-generated method stub
        System.out.println("I'm  init  method  using implements InitializingBean interface...."+message);

    }

    @Override
    public void afterPropertiesSet() throws Exception {
        // TODO Auto-generated method stub
        System.out.println("I'm  init  method  using implements DisposableBean interface...."+message);

    }


}

2:定義相應的配置檔案:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd">

<!-- <context:component-scan  base-package="com.myapp.core.jsr330"/> -->

<!-- <context:annotation-config /> -->


<!-- <bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />
<bean id="personService" class="com.myapp.core.annotation.init.PersonService">
          <property name="message" value="123"></property>
</bean>
 -->

<bean id="personService" class="com.myapp.core.annotation.init.PersonService">
          <property name="message" value="123"></property>
</bean>

</beans>

3:測試類:

package com.myapp.core.annotation.init;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainTest {

    public static void main(String[] args) {

        AbstractApplicationContext  context = new ClassPathXmlApplicationContext("resource/annotation.xml");

        PersonService   personService  =  (PersonService)context.getBean("personService");

             context.registerShutdownHook();
    }

}

4:輸出測試結果:

I'm  init  method  using implements DisposableBean interface....123
三月 16, 2013 5:06:34 下午 org.springframework.context.support.AbstractApplicationContext doClose
INFO: Closing org[email protected]205756: startup date [Sat Mar 16 17:06:30 CST 2013]; root of context hierarchy
I'm  init  method  using implements InitializingBean interface....123

相關推薦

通過Spring @PostConstruct @PreDestroy 方法 實現初始銷燬bean之前進行操作

關於在spring 容器初始化 bean 和銷燬前所做的操作定義方式有三種: 第一種:通過@PostConstruct 和 @PreDestroy 方法 實現初始化和銷燬bean之前進行的操作 第二種是:通過 在xml中定義init-method 和 d

Java類成員變數、普通成員變數、初始塊、構造方法初始執行順序

 序言   關於類的static成員變數初始化、static初始化塊、例項的普通成員變數初始化、例項的普通初始化塊以及建構函式的執行順序,我一直不是十分明確地知道,今天專門花了幾個小時的時間參考網上資料設計出了比較明瞭的測試程式碼,有程式碼有結果有真相。總體而言,sta

java成員變數區域性變數的初始記憶體中的執行機制

成員變數:   當系統載入類或建立類的例項時,系統會自動為成員變數分配記憶體空間,並在分配記憶體空間後,自動為成員變數指定初始值。 eyeNum是類屬性。name是例項屬性 所有person例項訪問eyeNum都將訪問person類的eyeNum屬性。訪問的是同一塊記憶

Spring bean 通過實現 InitializingBean ,DisposableBean 介面實現初始方法銷燬操作

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-inst

@PostConstruct @PreDestroy 指定初始銷毀方法

fig 關閉 pri class text 調用 銷毀對象 int post 通過實現 @PostConstruct 和 @PreDestroy 註解,也可以指定 bean 的初始化和銷毀方法 一、Student 類 public class Student{

Spring_Spring bean 通過實現 InitializingBean ,DisposableBean 介面實現初始方法銷燬操作

via: http://blog.csdn.net/topwqp/article/details/8681573 Spring bean 通過實現 InitializingBean ,DisposableBean 介面實現初始化方法和銷燬前操作 關於在spring  容器初始化 bean 和銷燬前所做的

Spring-Kafka XML配置方法實現生產消費

  Spring-Kafka XML配置方法實現生產和消費  1. 生產者配置xml Step1:producerProperties:設定生產者公產需要的配置 ; Step2:producerFactory:定義了生產者工廠構造方法

spring系列】之6:bean初始銷燬方法

bean的生命週期:bean建立---初始化----銷燬的過程 容器管理bean的生命週期:我們可以自定義初始化和銷燬方法;容器在bean進行到當前生命週期的時候來呼叫我們自定義的初始化和銷燬方法 構造(物件建立): 單例項:在容器啟動的時候建立物件 多例項:在每次獲

Spring學習筆記】4:三種做屬性連線的Annotation,指示初始銷燬方法的Annotation

屬性連線 屬性連線是指配置DI的方式,之前學了可以在<bean ...></bean>裡面使用<constructor-arg .../>和<property .../> 元素做屬性連線。 Spring裡還可以

Spring】【Bean的scope屬性】【Bean初始銷燬方法

Bean的scope屬性 在Spring容器中的物件,預設是單例的.如dao,service.單例可以提高效能 但是也需要每次獲取都要new一次Bean物件.如Struts2的 Action物件,每

Spring註解驅動開發】如何使用@Bean註解指定初始銷燬方法?看這一篇就夠了!!

## 寫在前面 > 在【[String註解驅動開發專題](https://www.cnblogs.com/binghe001/category/1780611.html)】中,前面的文章我們主要講了有關於如何向Spring容器中註冊bean的知識,大家可以到【[String註解驅動開發專題](http

scroll()scrollTop()方法——實現電商網站中的電梯導航

窗口 css樣式 ram 每一個 最新 top index hid none 要想實現電商網站的電梯導航效果,首先需要了解以下知識點: jquery 事件 - scroll() 方法 對元素滾動的次數進行計數,當用戶滾動指定的元素時,會發生 scroll 事件。scroll

Spring Boot實戰筆記(三)-- Spring常用配置(Bean初始銷毀、Profile)

div nbsp troy string 實例化 public ive work 初始 一、Bean的初始化和銷毀   在我們的實際開發的時候,經常會遇到Bean在使用之前或之後做些必要的操作,Spring對Bean的生命周期操作提供了支持。在使用Java配置和註解配置下提

@Bean 指定初始銷毀方法

nconf 時機 定義 post spa onf ont Go 實例 bean 的生命周期   bean 的創建 --> 初始化 --> 銷毀 ioc 容器管理 bean 的聲明周期   可以自定義初始化和銷毀方法 構造器( 對象創建 )被調用時機   單實例:

Spring Boot Environment的初始預處理

bst div 方法 ams jdb ram rep ntp table Spring Boot Environment的初始化和預處理實在啟動時完成的, 即SpringApplication的run方法中。 ConfigurableEnvironment environ

防抖節流方法實現

nts timer 是什麽 告訴 for 如果 時間 方法 設置 防抖簡介 resize和scroll等事件操作的時候,會非常頻繁的觸發導致頁面不斷的重新渲染,非常影響性能,加重瀏覽器負擔,導致用戶體驗不好,防抖函數就是當事件持續觸發事件時,debounce函數會把事件合

Mat 的幾種初始賦值方法

cto 轉換 -m mat tro sha 數據 return main 這幾天用到了由cv::Point3f和std::vector<float>到cv::Mat數據類型的轉換。本質上就是換一下容器。今晚做個小總結。 由Point3f 到 Mat 有兩種方法,

Spring Bean初始之後/銷燬之前執行指定方法

關於在spring  容器初始化 bean 和銷燬前所做的操作定義方式有三種: 通過@PostConstruct 和 @PreDestroy 方法 實現初始化和銷燬bean之前進行的操作 通過 在xml中定義init-method 和  destory-metho

Node.js部落格系統--2.專案建立、安裝初始第一個請求的實現

技術框架 專案初始化 開啟vscode,新建一個blog資料夾,在控制檯npm init,除了出現package name:(blog)的時候需要填寫一個blog,其他都只需要回車就可以 接著執行以下命令 分別使用 npm i --save ~;安裝下列包

waitnotify方法實現執行緒間的通訊

    使用wait和notify方法實現執行緒間的通訊需要注意以下兩點: wait和notify必須配合synchronized去使用。 wait可以釋放鎖,notify不釋放鎖。 1.wait和notify的簡單應用   &nbs