Spring接口容器加载配置文件

去年记得有一次面试,提问Spring装载Bean和初始化的问题,回答的并不好。重新整理下思路。

首先先从加载Spring配置文件说起。

1     ApplicationContext  接口容器

ApplicationContext 接口用于加载Spring配置文件,实现类为ClassPathXmlApplicationContext  和  FileSystemXmlApplicationContext,如下图:

a、配置文件在类路径下

b、配置文件在本地目录

c、配置文件在项目跟路径下

2     BeanFactory 接口容器

BeanFactory 接口是 ApplicationContext接口的父类

一般使用 XmlBeanFactory 实现类 加载 Spring 配置文件

XmlBeanFactory的结构:

参数Resource 是接口,有两个实现类:

ClassPathResource : 指定类路径下的资源文件
FileSystemResouce : 指定项目根路径或本地磁盘路径下的资源文件

在创建了 BeanFactory 容器后,通过使用 getBean() 方法,从容器中获得指定的 Bean 对象

编写测试代码举例(spring配置文件我放在了src/resource目录下):

 

3     两个接口容器的区别

区别的本文的重点,也是之前面试的答案。

ApplicationContext 容器 和 BeanFactory 容器 加载的是同一个配置文件,但在代码中这两个容器对象,不是同一个他们对于容器内对象装配时机是不同的。

     a、ApplicationContext 容器中对象的装配时机

     ApplicationContext  容器,会在容器对象初始化时,将其中的所有对象一次性装配好,之后可以直接从内存中获得对象,执行效率高,占用内存。

     b、BeanFactory 容器中对象的装配时机

     BeanFactoy  容器,对容器中的对象的装配与加载采用延迟加载策略,只有在第一次真正调用 getBean() 时,才真正装配该对象。

当然 Bean 本身的装配方式也 值得一说,先挖个坑~~~

 

单例、多例与线程安全问题

单例与多例问题是指,当多个用户访问某个类时,系统是为每个用户创建一个该类实例,还是整个系统无论多少用户访问,只创建一个该类实例。

线程安全问题是指,多个用户同时在访问同一个程序时,其对于某一数据的修改,会不会影响到其他用户中的该数据。若无影响,则是线程安全的;若有可能影响,则是线程不安全的。

现在对HttpServlet、HttpSession、Struts2中的Action、Hibernate中的SessionFactory与Session,进行总结。

(1)HttpServlet
单例。即无论多少用户访问同一个业务,如LoginServlet,Web容器只会创建一个该Servlet实例。而该实例是允许多用户访问的。
若Servlet中包含成员变量,则每个用户对于成员变量的修改,均会影响到其他用户所看到的该变量的值,所以这时是线程不安全的。若不包含成员变量,则是线程安全的。

(2)HttpSession
多例。Web容器会为每个用户开辟一个Session,多个用户会有多个Session。而每个用户只能访问自己的Session。所以,对于Session来说,就不存在并发访问的情况,也就不存在线程安全的问题了。所以可以说是线程安全的。

(3)Struts2的Action
多例。对于同一个业务,例如LoginAction,系统会为每一个用户创建一个LoginAction的实例,并使其成员变量username与password接收用户提交的数据。同一用户只能访问自己的Action。所以,对于Action来说,就不存在并发访问的情况,也就不存在线程安全的问题了。所以可以说是线程安全的。

(4)Hibernate的SessionFactory
单例。无论多少用户访问该项目,系统只会创建一个SessionFactory对象,即这个对象是可以被所有用户访问的。
SessionFactory实现类中所包含的成员变量基本都是final常量,即任何用户均不能修改。所以,也就不存在用户的修改对其他用户的影响问题了,所以是线程安全的。

(5)Hibernate的Session
多例。系统会为每个用户创建一个Session。
Session的实现类中定义了很多的非final成员变量,一个事务对成员变量所做的修改,会影响到另一个事务对同一数据的访问结果,所以是线程不安全的。

简短的小结还有以后记录方向

其实之前也有一个服务器后来情况的话,这几天访问速度异常的慢。索性就重新换了机房然后用WordPress算了,有的时候还是要善用工具,能极大的提升效率,这个比我之前的真的是好用多了。

关于说到为什么想到要打算使用博客呢,这个第一是学习的内容是面向全栈开发,学习的过程当中有实践的必要,就当是摸石头过河了,总归是要迈出这一步的。可能也会有另外一个站点,专门就是放自己编译完成的文件,荒蛮野人一样的慢慢美化。第二呢,个人域名,博客这样的东西就好像是自己的一个小空间,也能记录分享些自己的生活经历,跟朋友圈啊,微博这样的是完全不同的,有归属感。第三的话,马上就要就业了,单从工作的角度说,博客或者git对于开发者都是标配了,一路走过来的坑坑洼洼,也可以写下来警示来者。

首先要写的东西,就是先总结下自己搭建的过程,我想跟我一样经验上半生不熟的人还很多,而网络上的一些教程,大都是不全的,有的教程写的很好,但是存在了局限性,比如说在购买域名后设置Name Server,使用腾讯的DNSPOO这一段,我的域名提供商(Go Daddy)设置页面已经不同与之前的教程了,还有WDCP面板安装与设置,以及WordPress安装,xshell,xftp的使用,有一些细节上的东西,需要更新。

然后的话,就当是笔记如今天又踩了什么坑啊,如何解决问题,心得体会。

慢慢长大后就发现了,其实大家追求的不过都是解决问题的能力罢了,解决问题首先能给自己带来很愉快的心理体验,然后就对应自己的level了,至于当时的心境嘛,确实是煎熬。

去日苦多,珍惜光阴