天天看点

监听器如何获取Spring配置文件 1. 创建InitDataListener 2. 直接加载beans.xml文件 3. 从ServletContext中获取 4. 通过Spring提供的工具类加载

版权声明:尊重博主原创文章,转载请注明出处哦~http://blog.csdn.net/eson_15/article/details/51373937

        创建一个监听器initdatalistener继承servletcontextlistener:

监听器如何获取Spring配置文件 1. 创建InitDataListener 2. 直接加载beans.xml文件 3. 从ServletContext中获取 4. 通过Spring提供的工具类加载

/** 

 * @description: todo(用于项目启动的时候数据初始化) 

 * @author eson_15 

 * 

 */  

//@component //监听器是web层的组件,它是tomcat实例化的,不是spring实例化的。不能放到spring中  

public class initdatalistener implements servletcontextlistener {  

    private productservice productservice = null;//productservice中定义了跟商品相关的业务逻辑  

    @override  

    public void contextdestroyed(servletcontextevent event) {  

    }  

    public void contextinitialized(servletcontextevent event) {  

}  

并在web.xml中配置该监听器:

监听器如何获取Spring配置文件 1. 创建InitDataListener 2. 直接加载beans.xml文件 3. 从ServletContext中获取 4. 通过Spring提供的工具类加载

        如上,productservice中定义了商品的一些业务逻辑,并且这个productservice是交给spring管理的,那么我们如何得到这个对象呢?首先肯定的一点是:我们不能自己new出来,因为new出来的话就跟spring的ioc没有关系了……主要有三种方式可以实现,我们先一个个分析,最后比较优劣。

        这种方式比较简单粗暴,不是要加载配置文件么?那好,我加载就是了,如下:

监听器如何获取Spring配置文件 1. 创建InitDataListener 2. 直接加载beans.xml文件 3. 从ServletContext中获取 4. 通过Spring提供的工具类加载

    private productservice productservice = null; //productservice中定义了跟商品相关的业务逻辑  

        // 获取业务逻辑类productservice查询商品信息        

        applicationcontext context = new classpathxmlapplicationcontext("beans.xml");  

        productservice = (productservice) context.getbean("productservice");  

        system.out.println(productservice); //输出看看拿到了没有       

                //下面是具体productservice相关操作……  

      这种方法完全没问题,思路很清晰,先加载配置文件beans.xml,然后获取bean,但是启动tomcat后,我们看看控制台输出的信息:

监听器如何获取Spring配置文件 1. 创建InitDataListener 2. 直接加载beans.xml文件 3. 从ServletContext中获取 4. 通过Spring提供的工具类加载

        到这里应该发现这种方式的弊端了,加载了两次配置文件,也就是说那些bean被实例化了两次,从打印的信息来看,是拿到我们自己加载配置文件是实例化的bean。这种方式明显不可取。

        从上面的方法中,我们最起码可以知道,spring通过自己的监听器已经加载过一次配置文件了,我们没必要再加载一次,那么很容易想到,如果知道spring加载后放到哪里了,那我们就可以从那地方获取该配置文件,下面我们看下spring加载配置文件的过程:

监听器如何获取Spring配置文件 1. 创建InitDataListener 2. 直接加载beans.xml文件 3. 从ServletContext中获取 4. 通过Spring提供的工具类加载

        上图中(省略了无关的代码),contextloaderlistener就是web.xml中我们配置的spring监听器,它也实现了servletcontextlistener并继承了contextloader。在监听器中主要通过initwebapplicationcontext方法来获取配置文件,并创建webapplicationcontext对象,在initwebapplicationcontext方法里主要做两件事:一是拿到spring的上下文,二是把spring上下文放到servletcontext中,并且键为:webapplicationcontext.root_web_application_context_attribute。那么如何拿到spring的上下文呢?是通过获取web.xml中配置的spring的路径,config_location_parm其实是个字符串常量,就是上面web.xml中配置spring监听器下面的:

监听器如何获取Spring配置文件 1. 创建InitDataListener 2. 直接加载beans.xml文件 3. 从ServletContext中获取 4. 通过Spring提供的工具类加载

<context-param>  

      <param-name>contextconfiglocation</param-name> <!--config_location_parm就是contextconfiglocation-->  

      <param-value>classpath:beans.xml</param-value>  

</context-param>  

        所以就很明显了,通过web.xml中配置的路径拿到beans.xml,然后加载这个配置文件,实例化bean。

        现在我们既然知道了spring在加载配置文件后,把它放在了servletcontext中,那么我们就可以去这里面直接拿!

监听器如何获取Spring配置文件 1. 创建InitDataListener 2. 直接加载beans.xml文件 3. 从ServletContext中获取 4. 通过Spring提供的工具类加载

    private productservice productservice = null;  

        // todo auto-generated method stub  

        //  获取业务逻辑类查询商品信息  

        // 解决方案二,项目在启动时,把spring配置文件通过spring的监听器加载,存储到servletcontext中,我们只要在servletcontext中获取即可。  

        applicationcontext context = (applicationcontext) event.getservletcontext()  

                                             .getattribute(webapplicationcontext.root_web_application_context_attribute);  

        system.out.println(productservice);       

        这样我们就可以拿到produceservice的实例化对象了,这种方法好是好,就是getattribute中的参数太长,也不知道当时程序员的脑门子被夹了还是咋地,估计是想不到其他更合适的名字了吧~

        也许开发spring的大牛们也意识到了这个参数名字太长了,于是他们提供了一个方法类,可以加载配置文件:

监听器如何获取Spring配置文件 1. 创建InitDataListener 2. 直接加载beans.xml文件 3. 从ServletContext中获取 4. 通过Spring提供的工具类加载

        // 获取业务逻辑类查询商品信息  

        webapplicationcontext context = webapplicationcontextutils.getwebapplicationcontext(event.getservletcontext());  

        system.out.println(productservice);  

        其实,这里的getwebapplicationcontext方法就是把上面的那个方法封装了一下而已,我们看看这个方法的源码就知道了:

监听器如何获取Spring配置文件 1. 创建InitDataListener 2. 直接加载beans.xml文件 3. 从ServletContext中获取 4. 通过Spring提供的工具类加载

public static webapplicationcontext getwebapplicationcontext(servletcontext sc) {  

        return getwebapplicationcontext(sc, webapplicationcontext.root_web_application_context_attribute);  

        这样更加方便程序员调用,仅此而已……所以一般我们使用第三种方法来获取spring的配置文件,从而获取相应的实例化bean。

_____________________________________________________________________________________________________________________________________________________

-----乐于分享,共同进步!