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的方式

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot的ApplicationContext是Spring框架中的一个接口,用于管理和访问应用程序的Bean容器。与BeanFactory相比,ApplicationContext具有更多的功能和特性,并且在大多数情况下,开发者会直接使用ApplicationContext而不是底层的BeanFactory。 在Spring Boot中,可以通过三种方式获取ApplicationContext: 1. 创建一个ConfigurableApplicationContext对象,并调用其createApplicationContext()方法来创建ApplicationContext。这种方式主要是通过反射来获取默认的ApplicationContext实现类,并进行实例化。 2. 使用Spring Boot提供的注解@Autowire注入ApplicationContext实例。这种方式可以直接在需要使用ApplicationContext的地方进行注入,方便调用。 3. 在配置文件中通过配置参数来指定ApplicationContext的实现类。这种方式可以在应用启动时通过配置文件来指定使用的ApplicationContext实现类,从而灵活地选择不同的实现方式。 总之,Spring Boot的ApplicationContext是Spring框架中非常重要的一个组件,用于管理Bean的创建、初始化和注入。开发者可以根据实际需要选择合适的方式获取和使用ApplicationContext。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [SpringBoot ApplicationContext分析](https://blog.csdn.net/qq_37436172/article/details/127759107)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [SpringBoot获取ApplicationContext的3种方式](https://download.csdn.net/download/weixin_38616120/12746337)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值