天天看點

Spring常用接口

1、InitializingBean接口 

InitializingBean接口中隻有一個afterPropertiesSet方法,從方法的名稱上很容易了解,這個方法是在Bean的屬性都設定值後被調用,用于完成一些初始化工作。當然,在Spring的配置檔案中init-method的配置也是在Bean的屬性都設定值後被調用,用于完成一些初始化工作,不過在執行順序上,接口的方法先于配置。值得注意的是,這兩種方式都是用于完成一些初始化工作,是以相應的方法中不要編寫一些複雜且執行時間很長的邏輯。

         當需要在bean的全部屬性設定成功後做些特殊的處理,可以讓該bean實作InitializingBean接口。效果等同于bean的init-method屬性的使用或者@PostContsuct注解的使用。

         三種方式的執行順序:先注解,然後執行InitializingBean接口中定義的方法,最後執行init-method屬性指定的方法。

2、DisposableBean接口 

DisposableBean接口中隻有一個destroy方法,該方法會在Bean被銷毀、生命周期結束之前被調用,用于做一些銷毀的收尾工作。同樣,在Spring的配置檔案中destroy-method配置也完成同樣的工作,不過在執行順序上,接口的方法先于配置。

當需要在bean銷毀之前做些特殊的處理,可以讓該bean實作DisposableBean接口。效果等同于bean的destroy-method屬性的使用或者@PreDestory注解的使用。

      三種方式的執行順序:先注解,然後執行DisposableBean接口中定義的方法,最後執行destroy-method屬性指定的方法。

3、ApplicationContextAware接口 

ApplicationContextAware中隻有一個setApplicationContext方法。實作了ApplicationContextAware接口的類,可以在該Bean被加載的過程中擷取Spring的應用上下文ApplicationContext,通過ApplicationContext可以擷取Spring容器内的很多資訊。

當一個類需要擷取ApplicationContext執行個體時,可以讓該類實作ApplicationContextAware接口。代碼展示如下:

public class Animal implements ApplicationContextAware, BeanNameAware{  

    private String beanName;  

    private ApplicationContext applicationContext;  

  

    public void setBeanName(String name) {  

        this.beanName = name;  

    }  

      

    /** 

     * @param applicationContext 該參數将由Spring容器自動指派 

     */  

    public void setApplicationContext(ApplicationContext applicationContext)throws BeansException {  

        this.applicationContext = applicationContext;  

    }  

  

    public void run(){  

        System.out.println(beanName);  

          

        //釋出自定義事件  

        AnimalEvent event = new AnimalEvent(this, "老虎");  

        applicationContext.publishEvent(event);  

    }  

}             

通過@Autowired注解可以自動裝配一些常用對象執行個體:

@Autowired  

    private MessageSource messageSource;   

    @Autowired  

    private ResourceLoader resourceLoader;   

  

    @Autowired  

    private ApplicationContext applicationContext;            

4、BeanFactoryAware接口 

BeanFactoryAware接口中隻有一個setBeanFactory方法。實作了BeanFactoryAware接口的類,可以在該Bean被加載的過程中擷取加載該Bean的BeanFactory,同時也可以擷取這個BeanFactory中加載的其它Bean。

5、FactoryBean接口 

FactoryBean接口可以實作Bean執行個體化的個性定制,讓Spring容器加載我們想要的Bean。實作了FactoryBean接口的類,可以通過實作getObject方法,實作加載我們想要的Bean。

6、BeanPostProcessor接口 

BeanPostProcessor接口中有兩個方法,分别為postProcessBeforeInitialization和postProcessAfterInitialization。實作了BeanPostProcessor接口的類,會在每個Bean初始化(即調用setter)之前和之後,分别調用這個類中的postProcessBeforeInitialization方法和postProcessAfterInitialization方法,實作初始化的邏輯控制。

7、InstantiationAwareBeanPostProcessor接口 

InstantiationAwareBeanPostProcessor接口中,常用的方法是postProcessBeforeInstantiation和postProcessAfterInstantiation。每個Bean的執行個體化(即調用構造函數)之前和之後,會分别調用實作了該接口的類中的postProcessBeforeInstantiation和postProcessAfterInstantiation方法。

8、BeanFactoryPostProcessor接口 

BeanFactoryPostProcessor接口中隻有postProcessBeanFactory方法。實作了該接口的類,可以在Bean被建立之前,擷取容器中Bean的定義資訊,并且可以進行修改。實作類中的postProcessBeanFactory方法隻會被執行一次,且先于BeanPostProcessor接口的方法。

9、當需要監聽自定義事件時,可以建立一個實作ApplicationListener接口的類,并将該類配置到Spring容器中。代碼展示如下:

/** 

 * 自定義事件監聽器 

 */  

public class CustomEventListener implements ApplicationListener {  

    public void onApplicationEvent(ApplicationEvent event) {  

        if(event instanceof AnimalEvent){  

            AnimalEvent animalEvent = (AnimalEvent)event;  

            System.out.println("觸發自定義事件:Animal name is " + animalEvent.getName());  

        }  

    }  

}            

<!-- 自定義事件監聽器:Spring容器自動注冊它 -->  

<bean id="customEventListener" class="com.cjm.spring.CustomEventListener"/>   

 要釋出自定義事件,需要調用ApplicationContext的publishEvent方法

10、ApplicationEvent抽象類

       當需要建立自定義事件時,可以建立一個繼承自ApplicationEvent抽象類的類。代碼展示如下:

/** 

 * 自定義事件 

 */  

public class AnimalEvent extends ApplicationEvent {  

    private String name;  

      

    public String getName() {  

        return name;  

    }  

  

    /** 

     * @param source 事件源對象 

     */  

    public AnimalEvent(Object source){  

        super(source);  

    }  

      

    public AnimalEvent(Object source, String name){  

        super(source);  

        this.name = name;  

    }  

}           

本文作者: java樂園

本文來自雲栖社群合作夥伴“

JAVA樂園

”,了解相關資訊可以關注“