当前位置:   article > 正文

Spring_05_实例化的时机与方式_beanobject.class

beanobject.class

实例化的时机

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

存在一个Bean对象

  1. public class BeanObject implements IBeanObject {
  2. public BeanObject(){
  3. System.out.println("new BeanObject");
  4. }
  5. }

 

· 对于BeanFactory

在容器启动后,要使用到bean对象时才去实例化。

称为延迟实例化。

  1. public class InstanceTest {
  2. @Test
  3. public void testBeanFactory(){
  4. ClassPathResource resource = new ClassPathResource("applicationContext.xml");
  5. BeanFactory factory = new XmlBeanFactory(resource);
  6. System.out.println("-容器已启动-");
  7. BeanObject object = factory.getBean("beanObject", BeanObject.class);
  8. }
  9. }

测试结果:

 

· 对于ApplicationContext

在容器启动时,就将所有的管理的bean对象实例化了。

  1. public class InstanceTest {
  2. @Test
  3. public void testApplicationContext(){
  4. ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
  5. System.out.println("-容器已启动-");
  6. BeanObject object = ctx.getBean("beanObject", BeanObject.class);
  7. }
  8. }

测试结果:

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对象。

工厂类:

  1. public class BeanObjectFactory {
  2. public static BeanObject create(){
  3. System.out.println("factory creat ...");
  4. return new BeanObject();
  5. }
  6. }

配置文件中,<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对象。

工厂类:

  1. public class BeanObjectFactory {
  2. // 实例工厂方法
  3. public BeanObject create(){
  4. System.out.println("factory create ...");
  5. return new BeanObject();
  6. }
  7. }

配置文件中,需先配置工厂对象和bean对象的实例对象。

在bean对象的<bean>中配置factory-bean和factory-method属性,

其值分别为工厂对象的id/name和创建bean对象的方法。

  1. <bean id="factoryBean" class="com.hanaii.instance.BeanObjectFactory"/>
  2. <bean id="beanObject" class="com.hanaii.instance.BeanObject"
  3. factory-bean="factoryBean" factory-method="create"
  4. />

 

· 实现BeanFactory

工厂类实现Spring的BeanFactory接口:

  1. public class BeanObjectFactory implements FactoryBean<BeanObject> {
  2. /* 工厂创建bean对象的方法 */
  3. @Override
  4. public BeanObject getObject() throws Exception {
  5. return new BeanObject();
  6. }
  7. /* bean对象的类型 */
  8. @Override
  9. public Class<?> getObjectType() {
  10. return BeanObject.class;
  11. }
  12. /* 暂时忽略 */
  13. @Override
  14. public boolean isSingleton() {
  15. return true;
  16. }
  17. }

配置文件中,bean对象的class属性值为工厂类全限定名。

Spring就会知道,我们需要的是工厂生产出来的对象。

 <bean id="beanObject" class="com.hanaii.instance.BeanObjectFactory"/>

执行流程:

1、找到配置文件

2、加载配置文件

3、解析所有的bean元素,识别id和class属性

4、通过反射得到工厂对象的实例

5、比较工厂对象和BeanFactory接口类型是否匹配,是则创建bean对象。

  1. if(beanObjectFactory instanceof BeanFactory){
  2. BeanFactory beanFactory = (BeanFactory)beanObjectFactory;
  3. BeanObject realBeanObject = beanFactory.getObject();
  4. }

6、id作为key,bean对象作为value。存放在容器中。

7、调用getBean获取bean对象。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/66318?site
推荐阅读
相关标签
  

闽ICP备14008679号