Spring框架自学之路(三)

在第一篇教程里(Spring框架自学之路(一))我们学习了框架概述、为MyEclipse配置Spring的约束、IOC(DI) - 控制反转(依赖注入)的实现原理以及入门案例。

在第二篇教程里(Spring框架自学之路(二)),讲解了IOC获取对象的方式、别名标签、Spring创建对象的方式等内容。下面紧接着开始Spring框架第三篇教程的学习。

步骤一:Spring IOC

7.单例和多例

Spring容器管理的bean在默认情况下是单例的,也即,一个bean只会创建一个对象,存在内置 map中,之后无论获取多少次该bean,都返回同一个对象。

Spring默认采用单例方式,减少了对象的创建,从而减少了内存的消耗。但是在实际开发中是存在多例的需求的,Spring也提供了选项可以将bean设置为多例模式。

<code>
<beans> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">

<bean>
/<beans>/<code>

bean在单例模式下的生命周期:

bean在单例模式下,spring容器启动时解析xml发现该bean标签后,直接创建该bean的对象存入内部map中保存,此后无论调用多少次getBean()获取该bean都是从map中获取该对象返回,一直是一个对象。此对象一直被Spring容器持有,直到容器退出时,随着容器的退出对象被销毁。

bean在多例模式下的生命周期:

bean在多例魔术师下,spring容器启动时解析xml发现改bean标签后,只是将该bean进行管理,并不会创建对象,此后每次使用 getBean()获取该bean时,spring都会重新创建该对象返回,每次都是一个新的对象。这个对象spring容器并不会持有,什么销毁取决于使用该对象的用户自己什么时候销毁该对象。

8.懒加载机制

Spring默认会在容器初始化的过程中,解析xml,并将单例的bean创建并保存到map中,这样的机制在bean比较少时问题不大,但一旦bean非常多时,spring需要在启动的过程中花费大量的时间来创建bean 花费大量的空间存储bean,但这些bean可能很久都用不上,这种在启动时在时间和空间上的浪费显得非常的不值得。

所以Spring提供了懒加载机制。所谓的懒加载机制就是可以规定指定的bean不在启动时立即创建,而是在后续第一次用到时才创建,从而减轻在启动过程中对时间和内存的消耗。

懒加载机制只对单例bean有作用,对于多例bean设置懒加载没有意义。

懒加载的配置方式:为指定bean配置懒加载

<code>
<beans> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"
>
<bean>
/<beans>/<code>

为全局配置懒加载

<code>
<beans> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"
default-lazy-init="true"
>
<bean>
/<beans>/<code>

如果同时设定全局和指定bean的懒加载机制,且配置不相同,则对于该bean局部配置覆盖全局配置。

实验:通过断点调试,验证懒加载机制的执行过程

<code>
<beans> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"
>
<bean>
/<beans>
public class Cart {
public Cart() {
System.out.println("Cart init...");
}
}
@Test
/**
* SpringIOC 懒加载机制
*/
public void test10(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Cart cart1 = (Cart) context.getBean("cart");
Cart cart2 = (Cart) context.getBean("cart");
System.out.println(cart1 == cart2);
}/<code>

9.配置初始化和销毁的方法

在Spring中如果某个bean在初始化之后 或 销毁之前要做一些 额外操作可以为该bean配置初始化和销毁的方法 ,在这些方法中完成要功能。

实验:通过断点调试模式,测试初始化方法 和 销毁方法的执行

<code>public class ProdDao {
public ProdDao() {
System.out.println("ProdDao 被创建。。。");
}
public void init(){
System.out.println("init。。连接数据库。。。。。");
}

public void destory(){
System.out.println("destory。。断开数据库。。。。。");
}
public void addProd(){
System.out.println("增加商品。。");
}
public void updateProd(){
System.out.println("修改商品。。");
}
public void delProd(){
System.out.println("删除商品。。");
}
public void queryProd(){
System.out.println("查询商品。。");
}
}

<beans> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"
>
<bean> init-method="init" destroy-method="destory">/<bean>
/<beans>
@Test
/**
* SpringIOC 初始化和 销毁方法
*/
public void test11(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
ProdDao prodDao = (ProdDao) context.getBean("prodDao");
prodDao.addProd();
context.close();
}/<code>

Spring中关键方法的执行顺序:

在Spring创建bean对象时,先创建对象(通过无参构造或工厂),之后立即调用init方法来执行初始化操作,之后此bean就可以哪来调用其它普通方法,而在对象销毁之前,spring容器调用其destory方法来执行销毁操作。

关注公众号【秃头程序员】,不错过Spring框架自学之路(四)


分享到:


相關文章: