-Spring框架基础
1、框架简述
所谓的框架其实就是程序的架子,在这个程序的架子中,针对程序的各种问题给出了便捷的解决方案,可以使开发人员基于框架快速开发具体的应用程序。
2、常见的框架有
SSH:Struts2、Spring、Hibernate、
SSM:SpringMVC、Spring、MyBatis
Spring框架简述
1、Spring是一个Service层的框架,可以整合许多其他框架进行工作
Spring的主要技术是IOC(DI) AOP
IOC(DI)-控制反转(依赖注入)
AOP-面向切面编程
Spring本身是基于XML配置来进行工作的,在使用Spring的过程中不可避免要编写大量的XML文件配置,
Spring官方提供了这些XML文件的编写规范,这是通过提供XML的约束文件来实现的。
所谓的Xml约束其实是一种限定Xml文件写法的技术,主要分为两种:
DTD,通常文件的后缀.dtd
Schema,通常文件的后缀为.xsd ,Spring提供了Schema格式的约束,来限定Spring配置文件的写法。
Spring的IOC(DI)
1、IOC(DI)-控制反转(依赖注入)
所谓的IOC称之为控制反转,简单来说就是将对象创建的权力以及对象生命的周期的管理过程交由Spirng框架来处理,从此在开发过程中不再需要关注对象的创建和生命周期的管理,而是在需要是由Spring框架提供,这个由Spring框架管理对象创建的生命周期的机制称之为控制反转。 在创建对象的过程中Spring可以依据配置 对 对象的属性进行设置,这个过程称之为依赖注入–DI
IOC的事项原理
在初始化一个Spring容器时,Spring会去解析指定的XML文件,当解析到其中的标签时,会根据该标签中的class属性指定的类的全路径名,通过反射创建该类的对象,并将该对象存入内置的Map中管理,其中键就是该标签的id值,值就是对象。
之后,当通过getBean方法来从容器中获取对象时,其实就是根据传入的条件,在内置的Map中寻找是否有与之相匹配的值,如果有则将该键值对中保存的对象返回,如果没有匹配到则抛出异常。
默认情况下,多次获取同一个id的bean,得到的是同一个对象。
即使是同一个类,如果配置多个标签具有不同的id,每个id都会在内置的Map中有一个键值对,其中的值是这个类创建的不同的对象。
同一个标签下不允许配置多个同id的标签,若依旧配置则抛出异常
IOC的获取对象的方式
通过context.getBeans()方法获取bean时,可以通过如下两种方法获取
1、传入id值
ApplicaitonContext context = new ClassPathApplicationContext(“applicationContext.xml”);
Person p01 = (person)context.getBean(“person”);
2、传入class类型
ApplicaitonContext context = new ClassPathApplicationContext(“applicationContext.xml”);
Person p01 = (person)context.getBean(Person.class);
通过class方式获取bean时,如果同一个类配置多个bean,则再获取时因为无法确定到底要获取哪个bean会抛出异常。但id是唯一的,不存在类似的问题,所以建议使用id获取bean
Spring创建对象的方式
1、通过类的无参构造方法创建对象,当用最普通的方式配置一个时,默认就是采用类的无参构造创建对象,在Spring容器初始化时,通过上配置的class属性反射得到字节码对象,通过newInstance()创建对象。
Class c = Class.forname(“类的全名称路径”);
Object obj = c.newInstance();
这种方式下Spring创建对象,要求类中必须有无参构造,否则无法通过反射创建对象,从而抛出异常。
2、通过静态工厂创建对象
很多的时候,我们面对的类是无法通过无参构造去创建的,例如该类没有无参构造、是一抽象类 等等情况 ,此时无法要求spring通过无参构造创建对象,此时可以使用静态工厂方式创建对象。
3、通过实例工厂创建对象
实例工厂也可以解决类是无法通过无参构造创建的问题,解决的思路和静态 工厂类似,只不过实例工厂提供的方法不是静态的。spring需要先创建出实例工厂的对象,在调用实例工厂对象上指定的普通方法来创建对象。所以实例工厂也需要配置到Spring中管理。
4、Spring工厂创建对象
Spring内置了工厂接口,也可以通过实现这个接口来开发Spring工厂,通过这个工厂创建对象。
单例和多例
Spring容器管理的bean在默认情况下是单例的,也即,一个bean只会创建一个对象,存在内置map中,之后无论获取多少次该bean,都返回同一个对象。
Spring默认采用单例方式,减少了对象的创建,从而减少了内存的消耗。
但是在实际开发中是存在多例的需求的,Spring也提供了选项可以将bean设置为多例模式。
bean在单例模式下的生命周期:
bean在单例模式下,spring容器启动时解析xml发现该bean标签后,直接创建该bean的对象存入内部map中保存,此后无论调用多少次getBean()获取该bean都是从map中获取该对象返回,一直是一个对象。此对象一直被Spring容器持有,直到容器退出时,随着容器的退出对象被销毁。
bean在多例模式下的生命周期:
bean在多例模式下,spring容器启动时解析xml发现该bean标签后,只是将该bean进行管理,并不会创建对象,此后每次使用 getBean()获取该bean时,spring都会重新创建该对象返回,每次都是一个新的对象。这个对象spring容器并不会持有,什么销毁取决于使用该对象的用户自己什么时候销毁该对象。
懒加载机制
Spring默认会在容器初始化的过程中,解析xml,并将单例的bean创建并保存到map中,这样的机制在bean比较少时问题不大,但一旦bean非常多时,spring需要在启动的过程中花费大量的时间来创建bean 花费大量的空间存储bean,但这些bean可能很久都用不上,这种在启动时在时间和空间上的浪费显得非常的不值得。
所以Spring提供了懒加载机制。所谓的懒加载机制就是可以规定指定的bean不在启动时立即创建,而是在后续第一次用到时才创建,从而减轻在启动过程中对时间和内存的消耗。
懒加载机制只对单例bean有作用,对于多例bean设置懒加载没有意义。