首页 > 其他分享 >springboot多线程环境下注入bean空指针问题解决

springboot多线程环境下注入bean空指针问题解决

时间:2022-08-21 17:12:12浏览次数:92  
标签:applicationContext return springboot getBean param bean 多线程 public name

多线程环境下注入bean会出现空指针了..

我是怎么知道这个bean有有没有在启动的时候注入进来的呢?

用于指示 bean 包含在SpringApplication中时应该运行的接口。多个CommandLineRunner bean 可以在同一个应用程序上下文中定义,并且可以使用Ordered接口或@Order注释进行排序。
如果您需要访问ApplicationArguments而不是原始 String 数组,请考虑使用ApplicationRunner 


   @Bean
    public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
        return args -> {

            System.out.println("Let's inspect the beans provided by Spring Boot:");

            String[] beanNames = ctx.getBeanDefinitionNames();
            Arrays.sort(beanNames);
            for (String beanName : beanNames) {
                System.out.println(beanName);
            }

        };
    }
 
@Component
public class SpringContextUtil implements ApplicationContextAware {
  /**
   * 上下文对象实例
   */
  private static ApplicationContext applicationContext;

  @Override
  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    SpringContextUtil.applicationContext = applicationContext;
  }

  /**
   * 获取applicationContext
   *
   * @return
   */
  public static ApplicationContext getApplicationContext() {
    return applicationContext;
  }

  /**
   * 通过name获取 Bean.
   *
   * @param name
   * @return
   */
  public static Object getBean(String name) {
    return getApplicationContext().getBean(name);
  }

  /**
   * 通过class获取Bean.
   *
   * @param clazz
   * @param <T>
   * @return
   */
  public static <T> T getBean(Class<T> clazz) {
    return getApplicationContext().getBean(clazz);
  }

  /**
   * 通过name,以及Clazz返回指定的Bean
   *
   * @param name
   * @param clazz
   * @param <T>
   * @return
   */
  public static <T> T getBean(String name, Class<T> clazz) {
    return getApplicationContext().getBean(name, clazz);
  }
}

使用的时候,通过构造器进行注入

 private BlogService blogService;
 
 
     public BlogPageProcessor() {
        this.blogService= SpringContextUtil.getBean(BlogService.class);
    }

标签:applicationContext,return,springboot,getBean,param,bean,多线程,public,name
From: https://www.cnblogs.com/q1359720840/p/16610332.html

相关文章

  • Spring学习1-IOC、IOC容器、Bean、DI
    1.IOC(InversionofControl)控制反转   (1)什么是控制反转呢? 使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此......
  • Spring容器创建Bean源码分析
    一、Spring提供了多种上下文来实现容器功能比如:AnnotationConfigApplicationContext、ClassPathXmlApplicationContext这里使用AnnotationConfigApplicationCont......
  • 多线程实现生产和消费
    若⼲个⽣产者在⽣产产品,这些产品将提供给若⼲个消费者去消费,为了使⽣产者和消费者能并发执⾏,在两者之间设置⼀个能存储多个产品的缓冲区,⽣产者将⽣产的产品放⼊缓冲区中,消......
  • SpringBean的实例化
    在Spring框架中,想使用Spring容器中的Bean,需要先实例化BeanSpringBean的实例化有3种方式构造方法实例化(最常用)在Java配置类中,写一个构造方法,在这个构造方法中new一个......
  • java多线程
    一、定义很多人应该对进程,线程,程序这几个概念混淆.程序指什么?简而言之,程序就是代码,用不同语言编写的代码;什么是进程?进程就是表示程序一次完整的执行;线程指的是,在......
  • SpringBoot的基本概念(1)
     1.为什么使用springboot springboot容易上手,做了jar包的版本控制,不用考虑maven依赖,方便敏捷开发,内置tomcat减少开发配置,由于SPI提供对外的starter扩展。 2.spr......
  • Spring源码学习笔记4——BeanFactoryPostProcessor执行
    一丶BeanFactoryPostProcessor是什么Spring留给我们的一个扩展接口,在BeanDefinition加载注册完之后,并执行一些前置操作(笔记3)之后会反射生产所有的BeanFactoryPostProcesso......
  • 新建Springboot项目默认test包下的测试类报错缺少org.junit.jupiter.api
    参考CSDN博客链接:https://blog.csdn.net/weixin_39764056/article/details/104402593本人使用IDEA新建了一个Springboot项目,然后导入了spring-boot-start-test依赖,该项目......
  • Spring源码学习笔记6——Spring bean的实例化
    一丶前言前面我们了解到读取xmlor根据扫描路径生成BeanDefinition并注册到BeanFactory,相当于我们具备了生火做饭的原材料:BeanDefinition,接下来就是Spring最为核心的,根据......
  • SpringBoot框架:配置项目在访问后台端口时默认跳转的接口或页面
    一、配置一般需要这种配置的都是前后端一体的项目,在通过后台端口访问时需要默认跳转到某个指定的接口,或者跳转到某个执行的接口。实现WebMvcConfigurer接口,重写a......