关键词

spring Java eclipse bean 多例模式 prototype 懒加载 lazy-init

写在后面

  • 性能简述:对于多例模式的懒加载配置是否失效的测试。
  • 刚接触,摸索中,低级谬误,只是做个记录,轻喷。

(有谬误)Xml配置文件(片段)

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/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.xsd ">                    <!-- 对于多例模式,即使加了懒加载配置也没用 -->        <bean id="myFactoryPrototypeExample" class="instance.BeanInstanceFactory"            scope="prototype" lazy-init="false"/>                    <bean id="instanceFactoryInstancePrototypeExample" factory-bean="myFactoryPrototypeExample"             scope="prototype" lazy-init="false"/></beans>

运行的测试代码

package test;import java.util.Calendar;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import instance.BeanClass;import instance.Person;import instance.User;public class TestInstance {        //对于多例模式,默认懒加载,即使设置lazy-init="false"也有效    @Test    public void test06(){        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");        System.out.println("获取对象前");        //参数是xml中待创立的对象的id        BeanClass bc3 = (BeanClass)context.getBean("instanceFactoryInstancePrototypeExample");        System.out.println(bc3+bc3.message);        }}

解决

  • 思路:查看xml配置文件
  • 起因:xml配置文件有误。
  • 解决:最初一个bean标签少写了factory-method属性。

(正确的)Xml配置文件(片段)

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/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.xsd ">                    <!-- 对于多例模式,即使加了懒加载配置也没用 -->        <bean id="myFactoryPrototypeExample" class="instance.BeanInstanceFactory"            scope="prototype" lazy-init="false"/>        <!--上面这里少写了factory-method-->        <bean id="instanceFactoryInstancePrototypeExample" factory-bean="myFactoryPrototypeExample"            factory-method="createBeanClassInstance" scope="prototype" lazy-init="false"/></beans>

包构造

(补充)BeanInstanceFactory类

package instance;public class BeanInstanceFactory {        public BeanInstanceFactory(){            System.out.println("我是一个实例工厂");                    }        public BeanClass createBeanClassInstance(){            return new BeanClass("调用实例工厂办法实例化Bean");        }}

(补充)BeanClass类

package instance;public class BeanClass {    public String message;        public BeanClass() {        this.message = "构造方法实例化Bean";    }    public BeanClass(String message) {        this.message = message;    }}

运行后果

参考

org.springframework.beans.factory.BeanCreationException:No bean class specified on bean definition