Web容器之Listener初始化顺序

本文介绍如何解决Web应用中自定义Listener依赖Spring上下文的初始化顺序问题。通过继承ContextLoaderListener并重写contextInitialized方法,确保Spring IOC容器先于自定义监听器初始化。
在Web容器启动时,web.xml的加载顺序一般是这样的,挑选几个常用属性来说,顺序如下
context-param ->listener -> filter -> servlet

而当我们想要在Listener初始化一些数据的时候,势必要把初始化的逻辑代码写在listener里面。
在同一个web.xml里面写两个listener,它们的初始化顺序是不根据你写在web.xml里面的顺序而定的,就相当于说你要想在自定义Listener使用spring管理的bean那就会得到一个null值。

那这个时候就要手动的去控制好listener的顺序。那如果不要使用spring管理的bean那也就没有这个必要去控制顺序。

方法肯定是有的,可以采用自定义的listener但这个listener不要去去实现ServletContextListener,而是extendsorg.springframework.web.context.ContextLoaderListener。OverridecontextInitialized(ServletContextEventevent)方法,在这个Override方法里面控制好执行顺序就可以了。


    最近用到在Tomcat服务器启动时自动加载数据到缓存,这就需要创建一个自定义的缓存监听器并实现ServletContextListener接口,并且在此自定义监听器中需要用到Spring的依赖注入功能.在web.xml文件中监听器配置如下:

    <listener>  
            <listener-class>  
                org.springframework.web.context.ContextLoaderListener  
            </listener-class>  
    </listener>  
    <listener>  
        <listener-class>  
            com.wsjiang.test.listener.CacheListener  
        </listener-class>  
    </listener>  

上面的配置细细大意为,先配置spring监听器,启动spring,再配置一个缓存监听器,我希望他们是顺序执行的,因为在缓存监听器中需要 spring注入其他对象的实例,我期望在服务器加载缓存监听器前加载Spring的监听器,将其优先实例化。但是实际运行发现他们并不是按照配置的顺序加载的。


      对上面的问题我查询了很多资料,找到了一种解决方案,希望能帮助遇到同类问题的朋友。
      思路就是,既然listener的顺序是不固定的,那么我们可以整合两个listener到一个类中,这样就可以让初始化的顺序固定了。我就重写了org.springframework.web.context.ContextLoaderListener这个类的contextInitialized方法.大致代码如下:

    
public class ContextLoaderListenerOverWrite extends ContextLoaderListener {  
    private IStationService stationService;  
    private IOSCache osCache;  
    @Override  
    /** 
     * @description 重写ContextLoaderListener的contextInitialized方法 
     */  
    public void contextInitialized(ServletContextEvent event) {  
        super.contextInitialized(event);  
        ApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext());  
        //获取bean  
        stationService = (IStationService) applicationContext.getBean("stationService");   
        osCache = (IOSCache) applicationContext.getBean("osCache");  
        /* 
         具体地业务代码 
         */  
    }  
} 

web.xml的配置就由两个listener变为一个:

<listener>  
    <listener-class>  
                 com.wsjiang.test.listener.ContextLoaderListenerOverWrite  
        </listener-class>  
</listener>

   

  这样就能保证Spring的IOC容器先于自定义的缓存监听器初始化,在缓存监听器加载的时候就能使用依赖注入的实例.

       我还是一新手,如果哪位大侠有其他方案,望指点,谢谢!

参考链接:

1:http://blog.sina.com.cn/s/blog_67d771b80101buxq.html

2:http://wsjiang.iteye.com/blog/1127304

3:http://blog.csdn.net/dfdsggdgg/article/details/48713481#



内容概要:本文针对高渗透率分布式光伏与储能变流器接入配电网所带来的运行挑战,深入研究了传统跟网型(GFL)逆变器在电网故障、弱电网及孤岛工况下易失稳脱网,以及构网型(GFM)虚拟同步发电机(VSG)逆变器在并网状态下缺乏同步调节能力的技术瓶颈,提出了一种可实现GFL与GFM双向平滑切换的先进控制策略。研究首先构建了GFL与GFM共用的硬件平台与内环控制基础,继而系统性地设计了基于关键电气量实时监测的切换判据、精确的双向切换时序逻辑,并创新性地引入了过渡过程的平滑抑制策略,以有效抑制切换瞬间的有功功率冲击、电压闪变与频率突变。全文在Matlab/Simulink环境中搭建了完整的仿真模型,通过对并网转孤岛、孤岛转并网等多种工况的动态仿真,全面验证了所提策略的有效性,结果表明该方法能确保系统在模式切换过程中电压、电流与频率的平稳过渡,显著提升了微电网在复杂运行条件下的韧性、稳定性与供电可靠性。; 适合人群:从事电力电子、新能源并网、微电网控制、智能配电网等领域的高校研究生、科研院所研究人员及电力系统相关企业的工程技术人员。; 使用场景及目标:① 解决高比例可再生能源接入引发的电网稳定性与电能质量问题;② 实现微电网在并网与孤岛两种运行模式间的无缝、可靠切换,保障重要负荷的不间断供电;③ 为构网型与跟网型逆变器的协同运行、新型电力系统构建提供先进的控制理论依据与可落地的技术解决方案。; 阅读建议:建议结合文中提供的Simulink仿真模型进行深入学习,重点剖析切换逻辑模块的设计原理与参数整定方法,通过反复观察和分析不同工况下的仿真波形,深刻理解平滑切换过程中的动态响应机理与控制思想。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值