1. 程式人生 > >Spring容器初始化完之後執行某個方法

Spring容器初始化完之後執行某個方法

initializingBean介面是spring提供的,子類要實現afterPropertiesSet()方法,init-method是使用者可以通過屬性檔案配置的。從這裡可以看出實現initializingBean介面是要和spring耦合的,而init-method則不會。但afterPropertiesSet()方法spring可以直接呼叫執行,init-method指定的方法卻需要通過反射來執行,從效率來上講沒有afgerPropertiesSet()快。InitializingBean和init-method可以一起使用,Spring會先處理InitializingBean再處理init-method。
下面是一個小例子,initializingBean介面和init-method都實現了,可以自己隨便改。
試驗用的bean:
package researchspring.beanfactory;

import org.springframework.beans.factory.InitializingBean;

public class LifeCycleBean implements InitializingBean{
    
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void afterPropertiesSet() throws Exception {
        System.out.println("Implements initializing start.....");
        if(name == null)
            System.out.println("configuration failed!");
        System.out.println("Implements initializing end!");
    }
    
    public void init() {
        System.out.println("init() initializing start.....");
        if(name == null)
            System.out.println("configuration failed!");
        System.out.println("init() initializing end!");
    }
}
applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
    
    <bean id="lifeBean" class="researchspring.beanfactory.LifeCycleBean"
        init-method="init" >
    <property name="name" value="apple"></property>
    </bean>
</beans>
測試類:

public class Test {
    public static void main(String[] args) {
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        LifeCycleBean lifeBean = (LifeCycleBean)ac.getBean("lifeBean");
    }

}

×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
另外,從網上找了這麼一段
org.springframework.beans.factory.support. AbstractAutowireCapableBeanFactory完成一個Bean初始化方法的呼叫工作。 AbstractAutowireCapableBeanFactory是XmlBeanFactory的超類,再 AbstractAutowireCapableBeanFactory的invokeInitMethods方法中實現呼叫一個Bean初始化方法: org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.java:
//……
//在一個bean的合作者裝置完成後,執行一個bean的初始化方法。
protectedvoid invokeInitMethods(String beanName, Object bean, RootBeanDefinition mergedBeanDefinition)
 throws Throwable {
//判斷bean是否實現了InitializingBean介面
if (bean instanceof InitializingBean) {
if (logger.isDebugEnabled()) {
logger.debug("Invoking afterPropertiesSet() on bean with name '"+ beanName +"'");
}
//呼叫afterPropertiesSet方法

((InitializingBean) bean).afterPropertiesSet();
}
//判斷bean是否定義了init-method
if(mergedBeanDefinition!=null&&mergedBeanDefinition.getInitMethodName() !=null) {
//呼叫invokeCustomInitMethod方法來執行init-method定義的方法

invokeCustomInitMethod(beanName, bean, mergedBeanDefinition.getInitMethodName());
}
}
//執行一個bean定義的init-method方法
protectedvoid invokeCustomInitMethod(String beanName, Object bean, String initMethodName)
throws Throwable {
if (logger.isDebugEnabled()) {
logger.debug("Invoking custom init method '"+ initMethodName +"' on bean with name '"+ beanName +"'");
}
//使用方法名,反射Method物件

Method initMethod = BeanUtils.findMethod(bean.getClass(), initMethodName, null);
if (initMethod ==null) {
thrownew NoSuchMethodException(
"Couldn't find an init method named '"+ initMethodName +"' on bean with name '"+ beanName +"'");
}
//判斷方法是否是public
if (!Modifier.isPublic(initMethod.getModifiers())) {
//設定accessible為true,可以訪問private方法。
                     initMethod.setAccessible(true);
}
try {
//反射執行這個方法

initMethod.invoke(bean, (Object[]) null);
}
catch (InvocationTargetException ex) {
throw ex.getTargetException();
}
}
//………..

相關推薦

Spring容器初始之後執行某個方法

initializingBean介面是spring提供的,子類要實現afterPropertiesSet()方法,init-method是使用者可以通過屬性檔案配置的。從這裡可以看出實現initializingBean介面是要和spring耦合的,而init-method則不會。但afterProperti

最佳實踐--Spring容器初始完成之後執行某個方法

在做javaweb專案的時候,當用戶訪問的時候需要從資料庫載入資料,現在要在容器初始化完成之後直接把資料放入快取,當用戶訪問的時候提高速度。 查閱相關spring文件,找到了一個最佳實踐(best p

spring 容器初始完成後執行某個方法

一下內容來自internet,後面會整理在做web專案開發中,尤其是企業級應用開發的時候,往往會在工程啟動的時候做許多的前置檢查。比如檢查是否使用了我們組禁止使用的MySQL的group_concat函式,如果使用了專案就不能啟動,,在Spring容器將所有的Bean都初始化

spring 容器初始完成後執行某個方法

在做web專案開發中,尤其是企業級應用開發的時候,往往會在工程啟動的時候做許多的前置檢查。 比如檢查是否使用了我們組禁止使用的Mysql的group_concat函式,如果使用了專案就不能啟動, 並指出哪個檔案的xml檔案使用了這個函式。而在Spring的

spring容器初始bean之後或銷燬bean之前,能做的操作

通過 <bean> 標籤 init-method  初始化bean之後呼叫的方法 destroy-method  銷燬bean之前呼叫的操作方法 <bean id="initQuartzJob" class="com.upinc

Spring容器初始執行某個指定的方法

1.配置springmvc.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://ww

spring容器初始之後執行某些系統初始動作

最近自己所在的專案中出現此種情形:專案啟動後,需要做一些初始化動作,如,讀取配置檔案、查詢資料庫資料存入快取等。參考前人寫的程式碼的實現方式如下: 思路:編寫一個系統初始化類,該類實現ServletContextListenner介面,並實現contextInitializ

Spring容器初始過程

https://blog.csdn.net/xingxing513234072/article/details/78247480 一、Spring 容器高層檢視   Spring 啟動時讀取應用程式提供的Bean配置資訊,並在Spring容器中生成一份相應的Bean配置登錄檔,

Spring原始碼閱讀】 Spring容器初始流程

文章目錄 refresh方法原始碼 prepareRefresh實現 obtainFreshBeanFactory實現 refreshBeanFactory方法實現 prepareBeanFactory方法實現 invokeBeanFa

Spring容器初始過程都做了哪些事兒

1.ClassPathXmlApplicationContext為入口構造方法中有個refresh()方法用來初始化Spring refresh執行的大致流程: Configurab

spring容器初始時候遇到的死鎖問題

最近啟動spring專案的時候遇到一個死鎖問題,使用jstack獲取執行緒堆疊的時候,可以看到2個執行緒出現了死鎖: DefaultSingletonBeanRegistry.getSinglet

Spring核心探索與總結(二):Spring容器初始原始碼探索

Spring容器概述 容器是spring的核心,Spring容器使用DI管理構成應用的元件,它會建立相互協作的元件之間的關聯,負責建立物件,裝配它們,配置它們並管理它們的生命週期,從生存到死亡(在這裡,可能就是new 到 finalize())。 Sprin

spring容器初始bean的過程中的時間週期

知識點介紹 1、 init-method方法,初始化bean的時候執行,可以針對某個具體的bean進行配置。init-method需要在 applicationContext.xml配置文件中bean的定義裡頭寫明。例如:<bean id="TestBean" cla

mybatis-spring容器初始

1 引言 使用 MyBatis-Spring 模組,我們可以在Spring中使用mybatis,讓Spring容器來管理sqlSessionFactory單例的建立。如以下程式碼 <bean id="sqlSessionFactory" class

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

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

SpringIOC容器初始之後,和銷燬之前幾種方法執行順序

1.搭建一個簡單的Spring環境 2.定義一個介面及其實現類 package com.roger.service; public interface SpringLifeCycleService { void springLifeCycle(); } package co

Spring Bean初始之後執行指定方法

轉載:https://blog.csdn.net/forever7107/article/details/76446544 常用的設定方式有以下三種: 通過實現 InitializingBean/DisposableBean 介面來定製初始化之後/銷燬之前的操作方法; 通過 <bean&g

spring boot容器加載執行特定操作

文件中 code buck 線程 private tor tope gets send 有時候我們需要在spring boot容器啟動並加載完後,開一些線程或者一些程序來幹某些事情。這時候我們需要配置ContextRefreshedEvent事件來實現我們要做的事情

Spring源碼分析總結(一)-IOC容器初始

Spring源碼分析總結一、IOC容器的初始化過程 IOC容器的初始化是由refresh()方法啟動。經常使用的ApplicationContext 有:ClassPathXmlApplicationContext和FileSystemXmlApplicationContext、XmlWebApp

03.Spring IoC 容器 - 初始

itl ret num servlet fontsize eat 圖片 number sources 基本概念 Spring IoC 容器的初始化過程在監聽器 ContextLoaderListener 類中定義。 具體由該類的的 configureAndRefreshWe