Springboot 如何获取上下文对象

网友投稿 1005 2022-10-05


Springboot 如何获取上下文对象

目录Springboot上下文对象获取或者更简单的写法:spring boot获取上下文 随时取出被spring管理的bean对象方法一:方式二:

Springboot上下文对象获取

package it.benjamin.aspirinweb.mem;

import org.springframework.beans.BeansException;

import org.springframework.context.ApplicationContext;

import org.springframework.context.ApplicationContextAware;

import org.springframework.stereotype.Component;

/**

* 获取Springboot上下文,通过上下文可以拿到配置文件中的配置参数

*/

@Component

public class AppContextTool implements ApplicationContextAware {

private static ApplicationContext context;

public String getConfig(String key) {

return context.getEnvironment().getProperty(key);

}

@Override

public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

this.context = applicationContext;

}

}

或者更简单的写法:

定义一个AppUtil.java类:

public class AppUtil {

public static ConfigurableApplicationContext CONTEXT;

}

在启动类中进行赋值

public static void main(String[] args) {

AppUtil.CONTEXT = SpringApplication.run(RedisFlinkApplication.class, args);

}

spring boot获取上下文 随时取出被spring管理的bean对象

方法一:

实现ApplicationContextAware,重写setApplicationContext方法。这个方式下,工具类也被注册成了Bean,既然这样,那就必须确保该类能被Spring自动扫描到。

@Component

public class SpringContextUtils implements ApplicationContextAware {

private static ApplicationContext applicationContext;

@Override

public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

SpringContextUtils.applicationContext = applicationContext;

}

public static T getBean(Class cls) {

if (applicationContext == null) {

throw new RuntimeException("applicationContext注入失败");

}

return applicationContext.getBean(cls);

}

public static Object getBean(String name) {

if (applicationContext == null) {

throw new RuntimeException("applicationContext注入失败");

}

return applicationContext.getBean(name);

}

public static T getBean(String name, Class cls) {

if (applicationContext == null) {

throw new RuntimeException("applicationContext注入失败");

}

return applicationContext.getBean(name, cls);

}

public static HttpServletRequest getRequest() {

ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder

.getRequestAttributes();

return requestAttributes == null ? null : requestAttributes.getRequest();

}

}

方式二:

我想要的工具类,往往会部署在公共jar中,一般情况下不能被SpringBoot程序扫描到。所有就有手动注入上下文的方式。

@Slf4j

public class SpringUtils {

private SpringUtils() {

}

private static ApplicationContext context = null;

/**

* 初始化Spring上下文

*

* @param ctx 上下文对象

*/

public static void initContext(ApplicationContext ctx) {

if(ctx == null) {

log.warn("ApplicationContext is null.");

return;

}

context = ctx;

}

/**

* 根据类型获取Bean

*

* @param cls Bean类

* @param Bean类型

* @return Bean对象

*/

public static T getBean(Class cls) {

return context == null ? null : context.getBean(cls);

}

/**

* 根据名称获取Bean

*

* @param name Bean名称

* @return Bean对象

*/

public static Object getBean(String name) {

return context == null ? null : context.getBean(name);

}

/**

* 根据Bean名称和类获取Bean对象

*

* @param name Bean名称

* @param cls Bean类

* @param Bean类型

* @return Bean对象

*/

public static T getBean(String name, Class cls) {

return context == null ? null : context.getBean(name, cls);

}

}

此种方式不用实现ApplicationContextAware接口,但是需要手动设置上下文。所以在程序入口处,需要调用initContext方法,完成上下文的初始化。

public static void main(String[] args) {

ApplicationContext context = SpringApplication.run(YCloudsServiceBApplication.class, args);

SpringUtils.initContext(context);

}

github地址:https://github.com/ye17186/spring-boot-learn


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:漏洞检测方法如何选?详解源代码与二进制SCA检测原理
下一篇:Event Tracing For Windows(ETW)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~