在非spring上下文环境中使用spring容器管理的对象

最近遇到这样一个功能上的需求,简单来说,就是一个处理socket连接的S对象当遇到新的连接请求时,需要将新的连接信息通过websocket推送到浏览器实时监控的页面上。

由于处理socket连接的对象S独立于spring容器,而处理websocket的SimpMessagingTemplate实例由spring容器管理。如果直接在S类中使用@Autowired注入SimpMessagingTemplate 对象,在运行时SimpMessagingTemplate实例对象将是null,导致错误。因为SimpMessagingTemplate实例对象只有在spring容器中才能使用,那么在S这个非spring容器管理的对象想要使用的话,就要先取得spring的上下文对象,然后再通过上下文对象去获取SimpMessagingTemplate实例对象即可。

上下文对象的获取

我的项目采用的是springboot,可以通过以下两种方式拿到spring的上下对象。

  1. 在Springboot项目的启动类中直接将SpringApplication.run的返回的上下文对象保存到一个public修饰的静态变量。之后,全局都可以访问这个上下文对象。
public class SchedulerApplication {
    public static ConfigurableApplicationContext context = null;
    public static void main(String[] args) throws InterruptedException {
        context = SpringApplication.run(SchedulerApplication.class, args);
    }
}
  1. 定义一个持有上下文对象的类,将该类交由spring容器管理,然后通过该类去获取上下文对象
@Component
public class ApplicationContextHolder implements ApplicationContextAware {
    private static ApplicationContext context;

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

    public static ApplicationContext getContext() {
        return context;
    }
}

目标对象的生成

通过调用context的getBean方法获取在spring容器中管理的对象。下面两行代码分别表示通过上述1,2两种模式,获取SimpMessagingTemplate 对象的方法。

  1. 直接使用定义的context类
private static SimpMessagingTemplate simpMessagingTemplate = SchedulerApplication.context.getBean(SimpMessagingTemplate.class);
  1. 通过方法ApplicationContextHolder中的静态context对象
private static SimpMessagingTemplate simpMessagingTemplate = ApplicationContextHolder.getContext().getBean(SimpMessagingTemplate.class);

你可能感兴趣的:(JAVA)