赞
踩
容器在什么时候实例化bean?
存在一个Bean对象
- public class BeanObject implements IBeanObject {
- public BeanObject(){
- System.out.println("new BeanObject");
- }
- }
在容器启动后,要使用到bean对象时才去实例化。
称为延迟实例化。
- public class InstanceTest {
- @Test
- public void testBeanFactory(){
- ClassPathResource resource = new ClassPathResource("applicationContext.xml");
- BeanFactory factory = new XmlBeanFactory(resource);
- System.out.println("-容器已启动-");
- BeanObject object = factory.getBean("beanObject", BeanObject.class);
- }
- }
测试结果:
在容器启动时,就将所有的管理的bean对象实例化了。
- public class InstanceTest {
- @Test
- public void testApplicationContext(){
- ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
- System.out.println("-容器已启动-");
- BeanObject object = ctx.getBean("beanObject", BeanObject.class);
- }
- }
测试结果:
ApplicationContext容器延迟实例化的配置:
· 可以在bean元素配置lazy-init=true来让bean延迟实例化
· 可以在beans元素配置default-lazy-init=true来让这个beans里面所有的bean延迟实例化
对比:
1、延迟实例化:在系统启动时快、启动时占用的资源少。
在使用的时加载对象,第一次使用的时候性能较低。
因为不在加载时实例化对象,所以延迟实例化不能对实例化出来的对象做更多的功能。
2、非延迟实例化:在系统启动的时候,所有对象被实例化。
启动速度慢,使用速度快,启动的时候占用较多系统资源。
选择:
1、对于系统资源较少的应用可以使用延迟实例化(移动应用)。
2、对于web应用来说,一般选择非延迟实例化。
2、在web应用里面,我们一般把比较耗时的事情放在系统启动的时候完成。
即在配置文件中,<bean>的class属性,对应bean对象的全限定名。
要求bean对象中存在无参构造方法。
使用工厂类的静态方法创建bean对象。
工厂类:
- public class BeanObjectFactory {
- public static BeanObject create(){
- System.out.println("factory creat ...");
- return new BeanObject();
- }
- }
配置文件中,<bean>的class属性值为工厂类全限定名,factory-method属性值为创建bean对象的静态方法名。
<bean id="beanObject" class="com.hanaii.instance.BeanObjectFactory" factory-method="create"/>
执行流程分析:
1、找到配置文件位置
2、加载配置文件
3、解析所有的bean元素,识别所有的id和class元素
4、若bean只有factory-method属性值,读取。
5、通过反射创建bean对象实例
Class.forName(class属性值).getMethod(factory-method属性值).invoke(null, null);
6、id作为key,实例对象作为value,存放在容器中。
7、调用getBean获取实例。
使用工厂对象的方法创建bean对象。
工厂类:
- public class BeanObjectFactory {
- // 实例工厂方法
- public BeanObject create(){
- System.out.println("factory create ...");
- return new BeanObject();
- }
- }
配置文件中,需先配置工厂对象和bean对象的实例对象。
在bean对象的<bean>中配置factory-bean和factory-method属性,
其值分别为工厂对象的id/name和创建bean对象的方法。
- <bean id="factoryBean" class="com.hanaii.instance.BeanObjectFactory"/>
- <bean id="beanObject" class="com.hanaii.instance.BeanObject"
- factory-bean="factoryBean" factory-method="create"
- />
工厂类实现Spring的BeanFactory接口:
- public class BeanObjectFactory implements FactoryBean<BeanObject> {
- /* 工厂创建bean对象的方法 */
- @Override
- public BeanObject getObject() throws Exception {
- return new BeanObject();
- }
-
- /* bean对象的类型 */
- @Override
- public Class<?> getObjectType() {
- return BeanObject.class;
- }
-
- /* 暂时忽略 */
- @Override
- public boolean isSingleton() {
- return true;
- }
- }
配置文件中,bean对象的class属性值为工厂类全限定名。
Spring就会知道,我们需要的是工厂生产出来的对象。
<bean id="beanObject" class="com.hanaii.instance.BeanObjectFactory"/>
执行流程:
1、找到配置文件
2、加载配置文件
3、解析所有的bean元素,识别id和class属性
4、通过反射得到工厂对象的实例
5、比较工厂对象和BeanFactory接口类型是否匹配,是则创建bean对象。
-
- if(beanObjectFactory instanceof BeanFactory){
- BeanFactory beanFactory = (BeanFactory)beanObjectFactory;
- BeanObject realBeanObject = beanFactory.getObject();
- }
6、id作为key,bean对象作为value。存放在容器中。
7、调用getBean获取bean对象。
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。