springboot獲取applicationcontext

題記:

        使用springboot之前,我們通過ClassPathXmlApplicationContext加載spring xml配置文件來獲取applicationcontext,使用springboot後,由於不存在xml文件,故該種方式已經不能使用

在官方文檔中介紹,可通過實現ApplicationRunner或者CommandLineRunner在springaplication啓動後,立即執行其中的一些代碼,做初始化操作,如果存在多個實現類,可使用@Order註解設置其啓動順序,也可使用實現ApplicationListener來做初始化操作,並且實現ApplicationListener可獲取到applicationcontext

獲取applicationcontext的方式有多種,以下列舉出兩種方式

一、實現ApplicationListener<ContextRefreshedEvent>

1,啓動類

package com.demo.bootdemo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import com.demo.bootdemo.listeners.MainBusiListeners;
import com.demo.bootdemo.test.TestBean;
import com.demo.bootdemo.uitils.ApplicationContextUtils;

@SpringBootApplication
public class MydemoApplication {

    public static void main(String[] args) {
        SpringApplication sa = new SpringApplication(MydemoApplication.class);
        sa.addListeners(new MainBusiListeners());
        sa.run(args);
        // 測試
        TestBean bean = ApplicationContextUtils.getBean(TestBean.class);
        bean.print("yes it is test.");
    }

}

2,啓動監聽

package com.demo.bootdemo.listeners;

import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import com.demo.bootdemo.uitils.ApplicationContextUtils;

/**
 * 啓動監聽
 */
public class MainBusiListeners implements ApplicationListener<ContextRefreshedEvent> {
    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        ApplicationContextUtils.setContext(event.getApplicationContext());
    }
}

3,ApplicationContext工具類

package com.demo.bootdemo.uitils;

import org.springframework.context.ApplicationContext;

/**
 * ApplicaitonContext工具類
 *
 */
public class ApplicationContextUtils {

    private static ApplicationContext context;

    public static void setContext(ApplicationContext applicationContext) {
        context = applicationContext;
    }

    public static Object getBean(String beanName) {
        return context.getBean(beanName);
    }

    public static <T> T getBean(Class<T> t) {
        return context.getBean(t);
    }
}

4,測試Bean

package com.demo.bootdemo.test;

import org.springframework.stereotype.Component;

/**
 * 測試Bean
 */
@Component
public class TestBean {

    public void print(String str) {
        System.out.println("input: " + str);
    }
}

5,啓動啓動類MydemoApplication.java

.   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.3.RELEASE)

2019-04-04 09:51:28.722  INFO 93344 --- [           main] com.demo.bootdemo.MydemoApplication      : Starting MydemoApplication on admin-PC with PID 93344 (D:\Programs\eclipseworkplace\springboot\mydemo\target\classes started by admin in D:\Programs\eclipseworkplace\springboot\mydemo)
2019-04-04 09:51:28.725  INFO 93344 --- [           main] com.demo.bootdemo.MydemoApplication      : No active profile set, falling back to default profiles: default
2019-04-04 09:51:29.247  INFO 93344 --- [           main] com.demo.bootdemo.MydemoApplication      : Started MydemoApplication in 0.838 seconds (JVM running for 1.204)
input: yes it is test.

總結:

通過上述輸出結果可知,applicationcontext正常獲取,如果需要在run方法執行之前,使用applicationcontext做一些事情,可在MainBusiListeners的onApplicationEvent方法中進行。另外,使用@Component或者具有類似功能註解,啓動類中去掉sa.addListeners(new MainBusiListeners());,一樣可以正常獲取applicationcontext,ApplicationListener中的Event有多種,父接口爲ApplicationEvent,具體可參考源碼查看

二、啓動類run方法返回值即爲applicationcontext

查看main方法中啓動類代碼

查看run方法,發現該方法返回ConfigurableApplicationContext

查看ConfigurableApplicationContext,接口實現了ApplicaitonContext接口,所以run方法返回的值就是我們需要的context了

1,啓動類

package com.demo.Demo001;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class App {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(App.class, args);
        ContextUtils.setApplicationContext(context);
        MainBusiEntry.execute();
    }
}

2,context工具類

package com.demo.Demo001;

import org.springframework.context.ApplicationContext;

public class ContextUtils {

    public static ApplicationContext context;

    private ContextUtils() {
    }

    public static void setApplicationContext(ApplicationContext applicationContext) {
        context = applicationContext;
    }

    public static Object getBean(String beanName) {
        return context.getBean(beanName);
    }

    public static <T> T getBean(Class<T> t) {
        return context.getBean(t);
    }
}

3,測試Bean

package com.demo.Demo001;

import org.springframework.stereotype.Component;

@Component
public class TestBean {
    public String getName() {
        return this.getClass().getCanonicalName();
    }
}

4,業務入口

package com.demo.Demo001;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class MainBusiEntry {
    
    private static Logger logger = LogManager.getLogger(MainBusiEntry.class);
    public static void execute() {
        TestBean bean = ContextUtils.getBean(TestBean.class);
        logger.info(bean.getName());
    }
}

5,啓動springboot,輸出結果如下

.   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.0.RELEASE)

11:53:25.302 INFO  org.springframework.boot.StartupInfoLogger.logStarting()/50 - Starting App on admin-PC with PID 195640 (D:\Programs\eclipseworkplace\springboot\Demo001\target\classes started by admin in D:\Programs\eclipseworkplace\springboot\Demo001)
11:53:25.338 INFO  org.springframework.boot.SpringApplication.logStartupProfileInfo()/675 - No active profile set, falling back to default profiles: default
11:53:26.375 INFO  com.mongodb.diagnostics.logging.SLF4JLogger.info()/71 - Cluster created with settings {hosts=[localhost:27017], mode=SINGLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms', maxWaitQueueSize=500}
11:53:26.456 INFO  org.springframework.boot.StartupInfoLogger.logStarted()/59 - Started App in 1.393 seconds (JVM running for 2.078)
11:53:26.459 INFO  com.demo.Demo001.MainBusiEntry.execute()/11 - com.demo.Demo001.TestBean

輸出了測試類的路徑。

 我們在開發中,使用的爲第一種獲取applicationcontext的方式

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章