Spring_05_实例化的时机与方式

实例化的时机

容器在什么时候实例化bean?

存在一个Bean对象

public class BeanObject implements IBeanObject {
    public BeanObject(){
        System.out.println("new BeanObject");
    }
}

 

· 对于BeanFactory

在容器启动后,要使用到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);
    }
}

测试结果:

 

· 对于ApplicationContext

在容器启动时,就将所有的管理的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"
    />

 

· 实现BeanFactory

工厂类实现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对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值