SpringBoot在线程中获取容器中的Bean

SpringBoot在多线程中获取Bean的技巧
本文介绍了如何在SpringBoot应用中,在线程中正确地获取到容器中的Bean。通过利用ServletContextListener监听Web应用的生命周期,以及创建辅助类协助在多线程环境中引用Bean,在启动类中进行初始化配置,确保线程安全地使用Bean。

在 Servlet API 中有一个 ServletContextListener 接口,它能够监听 ServletContext
对象的生命周期,实际上就是监听 Web 应用的生命周期。
当Servlet 容器启动或终止Web 应用时,会触发ServletContextEvent 事件,该事件由
ServletContextListener 来处理。在 ServletContextListener
接口中定义了处理ServletContextEvent 事件的两个方法。
contextInitialized(ServletContextEvent sce) :当Servlet 容器启动Web
应用时调用该方法。在调用完该方法之后,容器再对Filter 初始化,并且对那些在Web 应用启动时就需要被初始化的Servlet
进行初始化。 contextDestroyed(ServletContextEvent sce) :当Servlet 容器终止Web
应用时调用该方法。在调用该方法之前,容器会先销毁所有的Servlet 和Filter 过滤器。

新建SpringBean获取bean的帮助类

package com.rs.util.bean;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
public class SpringBean implements ServletContextListener {

    private static WebApplicationContext springContext = null;

    @Override
    public void contextInitialized(ServletContextEvent sce) {

        if (springContext == null) {
            springContext = WebApplicationContextUtils.getWebApplicationContext(sce.getServletContext());
        }
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        // TODO Auto-generated method stub

    }

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

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

启动类中引用

package com.rs.domain;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

import com.rs.util.bean.SpringBean;

@Configuration
@ComponentScan("com.rs")
@EnableAutoConfiguration
public class SysConfiguration {

    public static void main(String[] args) {
        SpringApplication.run(SysConfiguration.class, args);

    }


    /**
     * 
     * @return
     */
    @Bean
    public SpringBean getSpringContext() {

        return new SpringBean();
    }

}

在具体线程中获取容器中的bean

package com.sino.task;

import com.sino.commons.context.SpringContext;

public class KafkaConsumerTask implements Runnable{



    private CaseService caseService = SpringContext.getBean(CaseService.class);




    @Override
    public void run() {



    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值