详解springboot设计模式(springcontext数组)

在项目中有时需要根据需要在自己new一个对象,或者在某些util方法或属性中获取SpringBean对象,从而完成某些工作,但是由于自己new的对象和util方法并不是受Spring所管理的,如果直接在所依赖的属性上使用@Autowired就会报无

在项目中有时需要根据需要在自己new一个对象,或者在某些util方法或属性中获取Spring Bean对象,从而完成某些工作,但是由于自己new的对象和util方法并不是受Spring所管理的,如果直接在所依赖的属性上使用@Autowired就会报无法注入的错误,或者是没报错,但是使用的时候会报空指针异常。总而言之由于其是不受Spring IoC容器所管理的,因而无法注入。

详解springboot设计模式(springcontext数组)

Spring的核心是ApplicationContext,它负责管理 beans 的完整生命周期。我们可以从applicationContext里通过bean名称获取注入的bean,然后进行操作。

SpringContextUtil工具类的代码如下所示:

package com.rickie.util;

import org.springframework.beans.BeansException;

import org.springframework.context.ApplicationContext;

public class SpringContextUtil {

private static ApplicationContext applicationContext;

// 设置上下文

public static void setApplicationContext(ApplicationContext context) throws BeansException {

applicationContext = context;

}

// 获取上下文

public static ApplicationContext getApplicationContext() {

return applicationContext;

}

// 通过名字获取上下文中的bean

public static Object getBean(String name) {

if(name == null || name.length()==0) {

return null;

}

try {

String beanName = “”;

if(name.length() >1){

beanName = name.substring(0, 1).toLowerCase() + name.substring(1);

} else {

beanName = name.toLowerCase();

}

return applicationContext.getBean(beanName);

} catch (Exception ex){

ex.printStackTrace();

return null;

}

}

// 通过类型获取上下文中的bean

public static <T> T getBean(Class<T> clazz) {

try {

return (T) applicationContext.getBean(clazz);

} catch(Exception ex) {

ex.printStackTrace();

return null;

}

}

}

由于该类并没有实现ApplicationContextAware接口,因此先设置好ApplicationContext的值。可以在Spring Boot的启动方法main中进行设置:

@SpringBootApplication

public class Application {

public static void main(String[] args) {

ConfigurableApplicationContext ctx = SpringApplication.run(Application.class, args);

SpringContextUtil.setApplicationContext(ctx);

}

}

在Spring Boot的启动时调用的run方法会返回一个
ConfigurableApplicationContext,将其设置到SpringContextUtil的静态属性中,然后能够通过ApplicationContext对象获取到需要使用的bean,这样就可以使用了。

详解springboot设计模式(springcontext数组)

下面是一段使用SpringContextUtil工具类的示例代码:

/**

* 创建一个新的客户

* @param customer

* @return

*/

public int create(Customer customer) {

if(this.customerGateway == null) {

this.customerGateway = SpringContextUtil.getBean(CustomerGateway.class);

}

return customerGateway.insert(customer);

}

这样,无论是在静态方法中,还是在手动new的实例中,我们都能够成功获取IoC容器所管理的bean。如果我们想在静态属性中获取Spring Bean,其实也非常简单,直接对属性赋值即可,如下所示:

private static Customer customer = SpringBeanUtil.getBean(Customer.class);

详解springboot设计模式(springcontext数组)

Spring Cloud Alibaba微服务实战技术专栏,从项目实践出发,包括Spring Cloud Alibaba、Nacos、Gateway、Sentinel、Log日志、分布式全局唯一ID、DDD领域驱动设计等等技术内容,可帮助你对Spring Cloud 微服务技术栈有更加全面和直观的了解。相信你通过本专栏的练习和实践,能够学以致用,提升微服务应用的开发能力。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 55@qq.com 举报,一经查实,本站将立刻删除。转转请注明出处:https://www.szhjjp.com/n/28720.html

(0)
nan
上一篇 2021-09-24
下一篇 2021-09-24

相关推荐

  • 现在农村养什么致富(农村养殖项目推荐)

    农村有广袤无垠的土地,闲置的劳动力,得天独厚的自然资源,这些都是城市创业者所不能比拟的自然要素。农村创业者可以借助这些资源,选好品种,持之以恒,打造一番属于自己的事业,不仅满足生活的需要,也可以带来丰厚的财富汇报。今天介绍的种养品种,市场广阔,想做趁

    2021-10-16 用户投稿
    0
  • 手机丢了微信聊天记录怎么恢复(微信聊天记录如何恢复)

    手机丢了微信聊天记录怎么恢复(微信聊天记录如何恢复)。久久派带你了解更多相关信息。手机存储买的都是比较大的,手机安装的APP也不太多,所以从没考虑过,手机存储空间不足,不小心删除的重要文件丢失了怎么办,又或者说手机丢了,更换新手机后,重要文件丢失了怎么办?

    2022-01-17 用户投稿
    0
  • 关于傍身是什么意思相关内容(傍身是什么意思)

    有一句俗语,叫家有万贯不如一技傍身。这句话什么意思呢?就是拥有一技之长是多么重要的一件事情。一个人拥有一技之长,对于年轻人来说太重要了。年轻人一定要用心下功夫花时间学习掌握专业技能和知识,要学到真正的本领。现在很多年轻人存在一股浮躁、不懈之气,很多人

    2022-01-06
    0
  • 全国哪种牛奶最好喝(三元牛奶怎么样)

    我从小到大都非常爱喝牛奶,各种类型、各种牌子的牛奶也是喝了不少。为此,还曾经跟朋友探讨过一个话题,是什么因素,决定了一杯牛奶好不好喝?我们一致达成的共识是,跟奶源密切相关。牛奶的源头,自然是奶牛。不同的奶牛品种,不同的养殖产地,不同的喂养方式,甚至不

    2021-12-26 用户投稿
    0
  • 郎朗年收入,41岁的周杰伦,凭什么一年不工作收入却过亿

    这个问题很好。为什么呢郎朗年收入?有些人一年的收入也不会过亿,而且还要很辛苦的工作。周杰伦还真可以一年不用工作就收入过亿,因为他的收入来源多种多样。下面就来分析一下吧!第一:音乐的版权费,QQ音乐的版

    2022-01-20 用户投稿
    0
  • 圆通最狠的投诉方法(圆通快递多少钱)

    随着网购消费的日益壮大,快递丢件的几率也增大了许多,一旦快递丢失要及时向相关公司进行投诉,索要自己应得的赔偿,维护自己的权益,怎么投诉最有效?如何赔偿?下面带来介绍。快递丢了怎么投诉最有效?首先找代收点问清楚什么原因,需要怎么处理,若是没有解决方案则…

    2022-01-15
    0

发表回复

登录后才能评论