Spring bean的延迟加载
2017-02-23 11:36
288 查看
Spring配置文件中的beans默认情况下是及时加载的,当配置初始化加载bean比较多时,一次性实例化会消耗很多时间,此时可以通过bean节点的属性lazy-init来实现延迟加载。一个延迟初始化bean将告诉IOC容器是在启动时还是在第一次被用到时实例化。
下面我们用一个例子演示一下延时加载:
Spring配置:
执行类:
输出结果:
通过输出结果可以看出Spring容器初始化的时候默认实例化Employee类的对象,而Address设置了延迟加载只有在调用的时候才会进行实例化。
需要说明的是,如果一个bean被设置为延迟初始化,而另一个非延迟初始化的singleton bean依赖于它,那么当ApplicationContext提前实例化singleton bean时,它必须也确保所有上述singleton 依赖bean也被预先初始化,当然也包括设置为延迟实例化的bean。因此,如果IOC容器在启动的时候创建了那些设置为延迟实例化的bean的实例。
修改配置文件如下:
再测执行Main类输出结果如下:
可以看出虽然Address设置成延迟加载,但是由于有其他的类依赖于他,IOC容器也会进行提前实例化。
下面我们用一个例子演示一下延时加载:
public class Employee { private String name; private Address address; public Employee() { System.out.println("Employee Constructor"); } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
public class Address { public Address() { System.out.println("Address Constructor"); } private String city; public String getCity() { return city; } public void setCity(String city) { this.city = city; } }
Spring配置:
<bean id="employeeBean" class="com.fh.spring.Employee"/> <bean id="addressBean" class="com.fh.spring.Address" lazy-init="true" />
执行类:
public class Main { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext( new String[] { "ApplicationContextTest.xml" }); System.out.println("After initialization"); Employee ee = (Employee) applicationContext.getBean("employeeBean"); applicationContext.getBean("addressBean"); } }
输出结果:
Employee Constructor After initialization Address Constructor
通过输出结果可以看出Spring容器初始化的时候默认实例化Employee类的对象,而Address设置了延迟加载只有在调用的时候才会进行实例化。
需要说明的是,如果一个bean被设置为延迟初始化,而另一个非延迟初始化的singleton bean依赖于它,那么当ApplicationContext提前实例化singleton bean时,它必须也确保所有上述singleton 依赖bean也被预先初始化,当然也包括设置为延迟实例化的bean。因此,如果IOC容器在启动的时候创建了那些设置为延迟实例化的bean的实例。
修改配置文件如下:
<bean id="employeeBean" class="com.fh.spring.Employee"> <property name="address" ref="addressBean" /> </bean> <bean id="addressBean" class="com.fh.spring.Address" lazy-init="true" />
再测执行Main类输出结果如下:
Employee Constructor Address Constructor After initialization
可以看出虽然Address设置成延迟加载,但是由于有其他的类依赖于他,IOC容器也会进行提前实例化。
相关文章推荐
- spring延迟加载bean
- Spring bean 延迟加载
- Spring_03_Bean 延迟加载
- Spring学习--懒加载(延迟初始化Bean)与自动装配
- Spring入门Blog[三、Bean的懒加载和生命周期]
- Spring 与 Hibernate 的延迟加载和 Dao 模式(转)
- 在spring中hibernate的延迟加载
- 号称Spring+Hibernate避免延迟加载异常的Filter
- 快速上手Spring--3. 加载Bean的配置文件
- 快速上手Spring--3. 加载Bean的配置文件
- Lazy Initialization and the DAO pattern with Hibernate and Spring(Spring 与Hibernate的延迟加载和Dao模式)
- 在spring中hibernate的延迟加载
- web.xml中filter代码中加载spring中定义的bean
- 论Spring与Hibernate的延迟加载和Dao模式
- Hibernate延迟加载以及利用Spring事务完美解决延迟加载问题
- 关于spring加载applicationContext初始化bean顺序的问题
- Hibernate和Spring的延迟加载和DAO模式
- Spring 与 Hibernate 的延迟加载和 Dao 模式
- 快速上手Spring--3. 加载Bean的配置文件
- spring+hibernate引起的延迟加载