SpringBoot 获取 applicationcontext(静态方法注入bean)

这次工作中遇到一个问题, 在工具类里面引入bean实例。 

我们都知道, 工具类的方法都要写成静态的,也就是要加static,故引入的bean实例也要是静态的,才能在方法中使用。我们都知道,如果不是静态的,直接通过@Autowired 注解可以实现注入,但是静态方法不行,这样获得的是null。

下面说一下2种在工具类中注入bean实例的方法。

以往,我们使用spring的时候获取applicationcontext都是通过ClassPathXmlApplicationContext通过加载application.xml 来获取。

现在,我们使用springboot项目,不再有application.xml ,所以下面介绍一下springboot获取applicationcontext的方法。



一、通过SpringBeanUtils工具类。

首先,让我们看一下springboot 的启动类 

public static void main(String[] args) {

            SpringApplication.run(Application.class, args);

}

然后我们看看run方法的返回值是

public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) { return run(new Class<?>[] { primarySource }, args);}

可以看到是ConfigurableApplicationContext  再来看看这个类

public interface ConfigurableApplicationContext extends ApplicationContext, Lifecycle, Closeable {

}

我们可以看到他继承了ApplicationContext这个类

这样我们就获得applicationContext 

ApplicationContext applicationContext = SpringApplication.run(Application.class, args);

然后我们写一个SpringBeanUtils工具类

@Component

public class SpringBeanUtils {

private static ApplicationContext context; 

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

//通过name获取 Bean.

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

//通过class获取Bean.

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

//通过name,以及Clazz返回指定的Bean

public static <T> T getBean(String name, Class<T> clazz) { return context.getBean(name, clazz); }}

然后在springboot启动类Application中把刚获得的applicationcontext通过SpringBeanUtils 的set方法注入。

public static void main(String[] args) {

ApplicationContext applicationContext = SpringApplication.run(Application.class, args); SpringBeanUtils.setContext(applicationContext);

}

最后,我们在我们的util工具类里面通过getBean注入就可以了

public class SelectUtils { private static CommodityService commodityService = (CommodityService) SpringBeanUtils.getBean("commodityService");

}

二、通过 @Autoware 注解注入非静态实例,然后用构造方法把注入的实例赋值给静态属性。

1.首先需要注意的是,当前工具类上面要加@Component注解

2.通过@Autoware注入实例

@Autowiredprivate CommodityService commodityServiceTemp;

3.声明静态属性

private static CommodityService commodityService;

4.构造方法赋值

public SelectUtils(CommodityService commodityService) {SelectUtils.commodityServiceTemp = commodityService;}

注:构造方法可以换成

① setter 注入(@Autowired是必须的)

@Autowired

public void setCommodityService(CommodityService commodityServiceTemp) { SelectUtils.commodityService = commodityServiceTemp;}

② @PostConstruct 注解注入

@PostConstruct

public void init(){commodityServiceTemp =commodityService;}

以上就是注入静态bean实例的方法。

注:

参考 :springboot获取applicationcontext - 大坑水滴 - 博客园

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容