1. 程式人生 > >Spring常用介面和類

Spring常用介面和類

ApplicationContextAware介面

ApplicationContextAware是用來獲取spring的上下文。通過工具類直接實現該介面,返回ApplicationContext物件。

  • 實現類
@Component
public class SpringContextUtil implements ApplicationContextAware{

    private static ApplicationContext applicationContext;

    public void setApplicationContext(ApplicationContext arg0)
            throws
BeansException { //獲取Spring容器context this.applicationContext=arg0; } public static ApplicationContext getSpringContext(){ return applicationContext; } }
  • Junit測試
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath*:config/spring-mvc.xml"
,"classpath*:config/spring-common.xml"}) public class UserControllerTest { /** * Spring應用上下文 */ @Autowired private ApplicationContext context; @Test public void test() { System.err.println(context); ApplicationContext springContext = SpringContextUtil.getSpringContext(); System.err.println(springContext); } }
  • 測試結果:
    這裡寫圖片描述

可以看到,列印了兩次ApplicationContext的結果,其中一次是通過@Autowired注入的,另外一個就是實現ApplicationContextAware介面時獲取的。專案中可以通過這兩種之一來獲取上下文物件。

ApplicationEvent和ApplicationListener

ApplicationEvent對應定義事件,ApplicationListener 定義監聽事件。一般用來處理一些非同步的操作。比如一些非同步入庫等。

  • 定義自定義事件MySpringEvent
public class MySpringEvent extends ApplicationEvent {

    private String name;

    /**
     * 非同步呼叫很方便。比如說
     */
    public MySpringEvent(Object source, String name) {
        super(source);
        this.name = name;
    }

    @Override
    public Object getSource() {
        return super.getSource();
    }

    @Override
    public String toString() {
        return super.toString();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
  • 定義事件監聽器
@Component
public class MyApplicationListener implements ApplicationListener<MySpringEvent>{

    public void onApplicationEvent(MySpringEvent event) {
        if(event instanceof MySpringEvent){
            //執行一些自定義操作,這裡列印一下。
            MySpringEvent mySpringEvent=(MySpringEvent)event;
            System.out.println("-------------------- "+mySpringEvent.getName()+"---------------");
        }
    }
}
  • 測試:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath*:config/spring-mvc.xml","classpath*:config/spring-common.xml"})

public class MyApplicationListenerTest {

    @Autowired
    public ApplicationContext applicationContext;

    @Test
    public void test() {

        applicationContext.publishEvent(new MySpringEvent("source", "Tom"));
    }

}

一般在業務中釋出一個事件。比如說非同步入庫。那自定義事件應該就是一個物件,監聽器就是應該入庫的操作,在其他業務要觸發的時候在釋出事件。

InitializingBean

InitializingBean介面為bean提供了初始化方法的方式。但是會在使用配置init-method前面執行。

  1. 實現介面InitializingBean
@Component
public class InitializingBeanBean implements InitializingBean{
    public void afterPropertiesSet() throws Exception {
         System.out.println("InitializingBean初始化Bean,init-method在後面執行。");
    }
}

  • 測試:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath*:config/spring-mvc.xml","classpath*:config/spring-common.xml"})
public class InitTest {
    @Test
    public void test() {
        System.out.println("啟動完畢");
    }

}

使用init-method來初始化bean
spring配置:

<bean id="init" class="com.tgb.inter_face.InitMethodBean" init-method="execute"></bean>

對應類:

public class InitMethodBean {

    public void execute(){
        System.out.println("我是通過init-method呼叫的");
    }

}

結果都是可以打印出來。

DisposableBean

bean在銷燬的時候呼叫的

@Component
public class InitializingBeanBean implements InitializingBean,DisposableBean{
    /**
     * bean在初始化的時候呼叫
     */
    public void afterPropertiesSet() throws Exception {
         System.out.println("InitializingBean初始化Bean,init-method在後面執行。");
    }
    /**
     * bean在銷燬的時候呼叫的
     * @throws Exception
     */
    public void destroy() throws Exception {
        System.out.println("bean在銷燬的時候呼叫的");
    }
}

測試:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath*:config/spring-mvc.xml","classpath*:config/spring-common.xml"})
public class InitTest {

    @Autowired
    ApplicationContext applicationContext;

    @Test
    public void test() {
        System.out.println("啟動完畢");
        //tomcat裡面要手動,關閉上下文,會呼叫到destroy
        ConfigurableApplicationContext context  = (ConfigurableApplicationContext) applicationContext;
        context.close();
    }

}

FactoryBean

使用場景:1、通過外部對類是否是單例進行控制,該類自己無法感知 2、對類的建立之前進行初始化的操作,在afterPropertiesSet()中完成。

  • 繼承該介面後實現的三個方法。
/**
     * 工廠Bean,返回的是該工廠Bean的getObject方法所返回的物件。創建出來的物件是否屬於單例由isSingleton中的返回決定。
     */
    public User getObject() throws Exception {
        return new User();
    }
    public Class<?> getObjectType() {
        return User.class;
    }
    public boolean isSingleton() {
        return true;
    }

獲取bean,使用上下文獲取bean

User bean = context.getBean(User.class);

BeanPostProcessor

每個bean初始化前後都會呼叫一次。

    /**
     * 
     * @param arg0
     * @param arg1
     * @return
     * @throws BeansException
     */
    public Object postProcessAfterInitialization(Object arg0, String arg1)
            throws BeansException {
        System.out.println("bean初始化前呼叫"+arg1);
        return arg0;
    }
    public Object postProcessBeforeInitialization(Object arg0, String arg1)
            throws BeansException {
        System.out.println("bean初始化後呼叫"+arg1);
        return arg0;
    }

BeanFactoryPostProcessor

BeanFactory的後置處理器。需要在Bean的配置檔案中,註冊BeanFactory的後置處理器。

public class BeanFactory implements BeanFactoryPostProcessor{
    public BeanFactory() {
        System.out.println("初始化BeanFactory");
    }

    public void postProcessBeanFactory(ConfigurableListableBeanFactory arg0)
            throws BeansException {
        System.out.println("hello,我是BeanFactoryPostProcessor");
    }

}

spring.xml

<bean id="beanFactory" class="com.tgb.inter_face.BeanFactory"></bean>

總結

  1. 實現BeanFactoryPostProcessor介面,初始化BeanFactory時候會呼叫。
  2. 實現InitializingBean介面,bean在初始化的時候呼叫afterPropertiesSet();
  3. 實現BeanPostProcessor,可以在每個bean前後呼叫一次。
  4. 使用init-method初始化的方法執行。
  5. 實現FactoryBean工廠介面自定義的bean初始化。
  6. 實現DisposableBean介面,銷燬bean時呼叫。